Пример #1
0
sc_result sc_graph_find_min_path(sc_addr graph, sc_addr beg_vertex, sc_addr end_vertex, sc_addr_list **path)
{
    sc_addr curr_vertex, cur_wave;
    sc_addr_list *not_checked_vertices = nullptr, *wave_list_head = nullptr, *path_head = nullptr;
    sc_iterator3 *wave_it;
    sc_iterator5 *it5 = sc_iterator5_f_a_a_a_f_new(graph,
                                                   sc_type_arc_pos_const_perm,
                                                   sc_type_node | sc_type_const,
                                                   sc_type_arc_pos_const_perm,
                                                   sc_graph_keynode_rrel_vertex);

    if (sc_helper_check_arc(sc_graph_keynode_graph, graph, sc_type_arc_pos_const_perm) == SC_FALSE)
        return SC_RESULT_ERROR_INVALID_PARAMS;


    while (sc_iterator5_next(it5) == SC_TRUE)
    {
        if (SC_ADDR_IS_EQUAL(beg_vertex, it5->results[2]) == SC_FALSE)
        {
            not_checked_vertices = sc_addr_list_append(not_checked_vertices);
            not_checked_vertices->value = it5->results[2];
        }
    }

    cur_wave = sc_memory_node_new(sc_type_node | sc_type_const);
    sc_memory_arc_new(sc_type_arc_pos_const_perm, cur_wave, beg_vertex);

    wave_list_head = sc_addr_list_append(wave_list_head);
    wave_list_head->value = cur_wave;

    do {
        cur_wave = create_wave(cur_wave, graph, &not_checked_vertices);

        wave_it = sc_iterator3_f_a_a_new(cur_wave,
                                         sc_type_arc_pos_const_perm,
                                         sc_type_node | sc_type_const);

        if (sc_iterator3_next(wave_it) == SC_FALSE)
            //TODO clear memory
            return SC_RESULT_ERROR;

        wave_list_head = sc_addr_list_append(wave_list_head);
        wave_list_head->value = cur_wave;

    } while(sc_helper_check_arc(cur_wave, end_vertex, sc_type_arc_pos_const_perm) == SC_FALSE);

    path_head = sc_addr_list_append(path_head);
    path_head->value = end_vertex;
    curr_vertex = end_vertex;
    wave_list_head = sc_addr_list_next(wave_list_head);
    do {
        curr_vertex = find_adjacent_from_wave(graph, wave_list_head->value, curr_vertex);
        path_head = sc_addr_list_append(path_head);
        path_head->value = curr_vertex;
    } while((wave_list_head = sc_addr_list_next(wave_list_head)) != nullptr);

    *path = path_head;
    return SC_RESULT_OK;
}
Пример #2
0
void advance_to_next_level( game_state_t* GS )
{
	int i, j, k;

	// Reset formations
	for( i = 0 ; i < MAX_FORMATIONS ; i++ ) {

		GS->formations[i].nr_ranks = 0;

		for( j = 0 ; j < MAX_FORMATION_RANKS ; j++ ) {

			GS->formations[i].ranks[j].occupied_by = NULL;

			for( k = 0 ; k < NR_FILLFROM_RANKS ; k++ ) {
				GS->formations[i].ranks[j].fillfrom_index[k] = -1;
			}
		}
	}

	//...! record score

	//...GS->shots_fired	= 0;
	//...GS->shots_missed	= 0;
	//...GS->best_resource	= 0;

	++GS->current_level;

#if TEST_LEVELS
	int L = GS->current_level;
	formation_t* f = &(GS->formations[0]);
	f->nr_ranks = create_formation( GS, f, TIER_1, L, 0, 1 );
	create_formation_enemies( GS, f, TIER_1, L*L );
#elif LEVEL_DESIGN_V2
	int L = GS->current_level;
	int formation_index = 0;
	create_wave( GS, L, &formation_index );
	create_wave( GS, L+1, &formation_index );
#else
	create_units( GS );

#endif
}
Пример #3
0
void game_start(void* ptr){
	Jogo* jogo = (Jogo*) ptr;
	finaliza_jogo(jogo);
	jogo-> vidas = 2;
	jogo->score = 0;
	cria_escudos( jogo);
	cria_tanque( jogo);
	jogo->invasores = create_wave(50, N_ALIEN);
	jogo->buffer = inicializa_buffer(jogo->display, jogo->fonte, LARGURA_INICIAL, ALTURA_INICIAL, jogo->escudo, N_ESCUDOS, 
									 jogo->tanque, jogo->invasores, &jogo->vidas, &jogo->score);
	jogo->estado_do_jogo = PLAY;	
}
Пример #4
0
/**
 * Initialize the project, doing any necessary opengl initialization.
 * @param camera An already-initialized camera.
 * @param scene The scene to render.
 * @return true on success, false on error.
 */
bool OpenglProject::initialize( Camera* camera, Scene* scene )
{
    // copy scene
    this->scene = *scene;

    // TODO opengl initialization code and precomputation of mesh/heightmap
    
    // Set configuration bitflags
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_CULL_FACE);

    glCullFace(GL_BACK);

    // Debug: Render in wireframe mode
    // glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

    GLfloat light_ambient[] = { 0.5, 0.25, 0.55, 1.0 };
    GLfloat light_diffuse[] = { 0.95, 0.4, 0.5, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position[] = { 20.0, 5.0, 15.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(
        camera->get_fov_degrees(),
        camera->get_aspect_ratio(),
        camera->get_near_clip(),
        camera->get_far_clip());
    
    glMatrixMode( GL_MODELVIEW );

    this->scene.mesh.normals = new Vector3[this->scene.mesh.num_vertices];
    generate_normals(this->scene.mesh);

    wave_resolution = 128;
    create_wave();

    return true;
}
Пример #5
0
/// @brief Находит один из минимальных путей в графе @p graph
///        от вершины @p beg_vertex до вершины @p end_vertex.
///
/// Волновой алгоритм поиска одного из минимальных путей:
/// 1. Добавить все вершины графа (кроме начальной вершины пути) в множество непроверенных вершин.
///
/// 2. Создать начальную волну и добавить в нее начальную вершину пути.
///
/// 3. Начальная волна - новая волна. Новой волной будем называть последнюю созданную волну.
///
/// 4. Сформировать следующую волну для новой волны. В нее попадет та вершина,
///    которая является смежной вершине из новой волны и присутствует во множестве непроверенных вершин.
///    Если вершина попала в формируемую волну, то ее надо исключить из множества непроверенных вершин.
///    Созданную волну установим как следующую для новой волны, и после этого созданную волну будем считать новой волной.
///
/// 5. Если новая волна пуста, то значит между вершинами не существует пути.
///    Завершить алгоритм.
///
/// 6. Если в текущей волне есть конечная вершина, то перейти к пункту 7, иначе к пункту 4.
///
/// 7. Сформировать один из минимальных путей, проходя в обратном порядке по списку волн.
///
/// @param s          sc-сессия, при помощи которой будет производиться работа с sc-памятью.
/// @param seg        sc-сегмент, в котором происходит работа алгоритма.
/// @param graph      неориентированный граф, в котором будет находится минимальный путь.
/// @param beg_vertex начальная вершина пути.
/// @param end_vertex конечная вершина пути.
///
/// @return связка отношения "простая цепь*" или 0, если минимальный путь не найден.
///
sc_addr find_min_path(sc_session* s, sc_segment* seg, sc_addr graph, sc_addr beg_vertex, sc_addr end_vertex)
{
	// 1. Добавить все вершины графа (кроме начальной вершины пути) в множество непроверенных вершин.
	//
	sc_addr not_checked_vertexes = s->create_el(seg, SC_N_CONST); // множество непроверенных вершин

	// Итератор по вершинам графа
	//
	sc_iterator *it = s->create_iterator(
		sc_constraint_new(
			CONSTR_3_f_a_a, 
			graph,
			SC_A_CONST|SC_POS,
			0,
			SC_A_CONST|SC_POS,
			graph_theory::vertex_
		), true);

	sc_for_each (it) {
		sc_addr vertex = it->value(2);

		// Не добавляем вершину начала пути в множество непросмотренных вершин.
		//
		if (vertex != beg_vertex)
			sc_set::include_in(s, it->value(2), not_checked_vertexes);
	}

	// 2. Создать начальную волну и добавить в нее начальную вершину пути.
	// 3. Начальная волна - новая волна.
	//
	sc_addr new_wave = s->create_el(seg, SC_N_CONST);
	sc_set::include_in(s, beg_vertex, new_wave);

	// Создаем начало списка волн.
	sc_addr waves_list_head = sc_list::create(s, seg, new_wave);
	sc_addr waves_list_tail = waves_list_head;

	do {
		// 4. Сформировать следующую волну для новой волны.
		//    Установить созданную волну как следующую для новой волны.
		//    Созданная волна - новая волна.
		//
		new_wave = create_wave(s, seg, graph, new_wave, not_checked_vertexes);

		sc_addr waves_list_curr = sc_list::create(s, seg, new_wave);
		sc_list::set_next(s, waves_list_tail, waves_list_curr);

		waves_list_tail = waves_list_curr;

		// 5. Если новая волна пуста, то значит между вершинами не существует пути.
		//
		if (sc_set::is_empty(s, new_wave)) {
			// Очищаем память и завершаем алгоритм.
			//
			erase_waves_list(s, waves_list_head);
			s->erase_el(not_checked_vertexes);
			return 0;
		}

		// 6. Если в текущей волне есть конечная вершина, то перейти к пункту 7, иначе к пункту 4.
		//
	} while (!sc_set::is_in(s, end_vertex, new_wave));

	// Подчистим память...
	//
	s->erase_el(not_checked_vertexes);

	// 7. Сформировать один из минимальных путей, проходя в обратном порядке по списку волн.

	// Сформируем связку отношения "простая цепь*"
	//
	sc_addr route        = s->create_el(seg, SC_N_CONST); // связка отношения "простая цепь*"
	sc_addr route_struct = s->create_el(seg, SC_N_CONST); // ориентированный граф структуры маршрута
	sc_set::include_in(s, route_struct, graph_theory::directed_graph);
	sc_addr route_visit  = s->create_el(seg, SC_N_CONST); // бинарное отношение посещения

	// Добавим все компоненты в связку отношения "простая цепь*".
	//
	sc_tup::add(s, route, N1_, route_struct);
	sc_tup::add(s, route, N2_, graph);
	sc_tup::add(s, route, N3_, route_visit);

	sc_set::include_in(s, route, graph_theory::simple_trail);

	// Добавим в простую цепь посещение начальной вершины.
	//
	sc_addr beg_vertex_visit = add_vertex_visit_to_route(s, route, beg_vertex);

	// Добавим в простую цепь посещение конечной вершины.
	//
	sc_addr end_vertex_visit = add_vertex_visit_to_route(s, route, end_vertex);

	// Пройдем в обратном направлении по списку волн
	// и сформируем структуру маршрута.
	//

	sc_addr curr_vertex = end_vertex;

	// Строим из списка волн маршрут, проходя по этому списку в обратном направлении.
	sc_list::reverse_iterator list_it(s, waves_list_tail), list_end;
	for (++list_it; list_it != list_end; ++list_it) {
		sc_addr curr_wave = *list_it;

		sc_addr edge = find_any_edge(s, graph, curr_vertex, curr_wave);

		// Получаем предыдущую вершину в пути.
		//
		sc_addr prev_vertex = get_other_vertex_incidence_edge(s, edge, curr_vertex); 

		// Добавляем посещение ребра @p edge в путь.
		//
		add_edge_visit_to_route(s, route, edge, prev_vertex, curr_vertex);
		curr_vertex = prev_vertex;
	}

	// Подчистим память...
	//
	erase_waves_list(s, waves_list_head);

	return route;
}