示例#1
0
void perf_t(char dep) {
	unsigned int i;
	/*char dummy;
	gen_all_captures();*/
	gen_all();
	check_condition();
	dep--;

	for (i = tree.first_move[Ply];i < tree.first_move[Ply + 1];i++) {
		if (verify_move(tree.move_list[i].move)==0) continue;
			if (makemove(tree.move_list[i].move,0)) {
					/*print_board();
					printf("Press any key to continue:");
					 while (!kbhit());
					dummy=getch();*/
					Nodes++;

					if (dep)
						perf_t(dep);

					unmakemove();
					}

			}
	}
示例#2
0
bool GameObject_Moving::do_move(int dx, int dy)
{
	if (verify_move(dx,dy) == false) return false;

	dest_x += dx;
	dest_y += dy;

	return true;
}
示例#3
0
bool GameObject_Ghost::event_reached_dest()
{
	int try_dirs_x[3];
	int try_dirs_y[3];
	int try_dirs_id[3];

	switch (move_dir)
	{
	case 0: // left
		try_dirs_x[0] = 0; try_dirs_y[0]=-1; try_dirs_id[0] = 2;
		try_dirs_x[1] =-1; try_dirs_y[1]= 0; try_dirs_id[1] = 0;
		try_dirs_x[2] = 0; try_dirs_y[2]= 1; try_dirs_id[2] = 3;
		break;

	case 1: // right
		try_dirs_x[0] = 0; try_dirs_y[0]=-1; try_dirs_id[0] = 2;
		try_dirs_x[1] = 1; try_dirs_y[1]= 0; try_dirs_id[1] = 1;
		try_dirs_x[2] = 0; try_dirs_y[2]= 1; try_dirs_id[2] = 3;
		break;

	case 2: // up
		try_dirs_x[0] =-1; try_dirs_y[0]= 0; try_dirs_id[0] = 0;
		try_dirs_x[1] = 0; try_dirs_y[1]=-1; try_dirs_id[1] = 2;
		try_dirs_x[2] = 1; try_dirs_y[2]= 0; try_dirs_id[2] = 1;
		break;

	case 3: // down
		try_dirs_x[0] =-1; try_dirs_y[0]= 0; try_dirs_id[0] = 0;
		try_dirs_x[1] = 0; try_dirs_y[1]= 1; try_dirs_id[1] = 3;
		try_dirs_x[2] = 1; try_dirs_y[2]= 0; try_dirs_id[2] = 1;
		break;
	}

	bool follow_trail = false;
	if (world->map.has_trail(dest_x, dest_y) && world->player)
	{
		float dx = fabs(dest_x - world->player->get_x());
		float dy = fabs(dest_y - world->player->get_y());
		float div = (dx+dy);
		if (div < 10 && div > 0.1)
		{
			float vol = 1/div;
			//clan::SoundBuffer_Session ses = sfx_ghost.prepare();
			//ses.set_volume(vol);
			//ses.play();
		}

		// follow trail if any:
		for (int i=0; i<3; i++)
			if (world->map.has_trail(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i]))
				follow_trail = !world->player->get_got_powerup();
		// don't follow trail if player got power up or is dead
	}
	
//	if (follow_trail) clan::Console::write_line("ghost in follow trail mode");

	int dirs_avail = 0;
	for (int i=0; i<3; i++)
	{
		if (follow_trail)
		{
			if (world->map.has_trail(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i])) dirs_avail++;
		}
		else if (verify_move(try_dirs_x[i], try_dirs_y[i])) dirs_avail++;
	}

	if (dirs_avail == 0) // Dead end - turn around
	{
		do_move(try_dirs_x[1]*(-1), try_dirs_y[1]*(-1));
		switch (move_dir)
		{
			case 0: move_dir=1; break;
			case 1: move_dir=0; break;
			case 2: move_dir=3; break;
			case 3: move_dir=2; break;
		}
	}
	else
	{
		int new_dir = rand()%dirs_avail;
		for (int i=0; i<3; i++)
		{
			if ((follow_trail && world->map.has_trail(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i])) ||
				(!follow_trail && verify_move(try_dirs_x[i], try_dirs_y[i])))
			{
				if (new_dir == 0)
				{
					if (world->map.has_trail(dest_x, dest_y))
					{
						world->map.eat_trail(dest_x, dest_y);
						red_ghost = true;
					}
					else
					{
						red_ghost = false;
					}

					do_move(try_dirs_x[i], try_dirs_y[i]);
					move_dir = try_dirs_id[i];
				}
				new_dir--;
			}
		}
	}

	return true;
}
bool GameObject_Pacman::event_reached_dest()
{
	if (world->map->get_tile_type(dest_x, dest_y) == Map::tile_egg) // std
	{
		world->score += 125;
		world->map->eat_egg(dest_x, dest_y);
//		sfx_namnam.play();
	}
	if (world->map->get_tile_type(dest_x, dest_y) == Map::tile_powerup) // powerup
	{
		world->score += 500;
		world->map->eat_egg(dest_x, dest_y);
		got_powerup = true;
		powerup_starttime = CL_System::get_time();
//		sfx_powerup.play();
	}
	world->map->leave_trail(dest_x, dest_y);
/*
	if (move_dir < 2)
	{
		if (CL_Keyboard::get_keycode(CL_KEY_UP) && verify_move(0, -1))
			move_dir = 2;

		if (CL_Keyboard::get_keycode(CL_KEY_DOWN) && verify_move(0, 1))
			move_dir = 3;
	}
	else
	{
		if (CL_Keyboard::get_keycode(CL_KEY_LEFT) && verify_move(-1, 0))
			move_dir = 0;

		if (CL_Keyboard::get_keycode(CL_KEY_RIGHT) && verify_move(1, 0))
			move_dir = 1;
	}
*/
	
	switch (wanted_dir)
	{
	case -1: break;

	case 0:
		if (verify_move(-1, 0)) 
		{
			move_dir = 0;
			wanted_dir = -1;
		}
		break;

	case 1:
		if (verify_move(1, 0)) 
		{
			move_dir = 1;
			wanted_dir = -1;
		}
		break;

	case 2:
		if (verify_move(0, -1)) 
		{
			move_dir = 2;
			wanted_dir = -1;
		}
		break;

	case 3:
		if (verify_move(0, 1)) 
		{
			move_dir = 3;
			wanted_dir = -1;
		}
		break;
	}


	switch (move_dir)
	{
	case 0:
		do_move(-1, 0);
		break;

	case 1:
		do_move(1, 0);
		break;

	case 2:
		do_move(0, -1);
		break;

	case 3:
		do_move(0, 1);
		break;
	}

	if (x == dest_x && y == dest_y) return false; // Damn - we're facing a wall!

	return true;
}
示例#5
0
文件: ghost.cpp 项目: zfbp/scgl
bool GameObject_Ghost::event_reached_dest()
{
	int try_dirs_x[3];
	int try_dirs_y[3];
	int try_dirs_id[3];

	switch (move_dir)
	{
	case 0: // left
		try_dirs_x[0] = 0; try_dirs_y[0]=-1; try_dirs_id[0] = 2;
		try_dirs_x[1] =-1; try_dirs_y[1]= 0; try_dirs_id[1] = 0;
		try_dirs_x[2] = 0; try_dirs_y[2]= 1; try_dirs_id[2] = 3;
		break;

	case 1: // right
		try_dirs_x[0] = 0; try_dirs_y[0]=-1; try_dirs_id[0] = 2;
		try_dirs_x[1] = 1; try_dirs_y[1]= 0; try_dirs_id[1] = 1;
		try_dirs_x[2] = 0; try_dirs_y[2]= 1; try_dirs_id[2] = 3;
		break;

	case 2: // up
		try_dirs_x[0] =-1; try_dirs_y[0]= 0; try_dirs_id[0] = 0;
		try_dirs_x[1] = 0; try_dirs_y[1]=-1; try_dirs_id[1] = 2;
		try_dirs_x[2] = 1; try_dirs_y[2]= 0; try_dirs_id[2] = 1;
		break;

	case 3: // down
		try_dirs_x[0] =-1; try_dirs_y[0]= 0; try_dirs_id[0] = 0;
		try_dirs_x[1] = 0; try_dirs_y[1]= 1; try_dirs_id[1] = 3;
		try_dirs_x[2] = 1; try_dirs_y[2]= 0; try_dirs_id[2] = 1;
		break;
	}

	bool follow_trail = false;
	if (world->map->get_tile_type(dest_x, dest_y) == Map::tile_trail)
	{
		if (world->player != NULL)
		{
			float dx = fabs(dest_x - world->player->get_x());
			float dy = fabs(dest_y - world->player->get_y());
			float div = (dx+dy);
			if (div < 10 && div > 0.1)
			{
				float vol = 1/div;
			}
		}

		// follow trail if any:
		for (int i=0; i<3; i++)
			if (world->map->get_tile_type(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i]) == Map::tile_trail)
				if (world->player != NULL)
					follow_trail = !world->player->get_got_powerup();
		// don't follow trail if player got power up or is dead
	}
	
//	if (follow_trail) cout << "ghost in follow trail mode" << endl;

	int dirs_avail = 0;
	for (int i=0; i<3; i++)
	{
		if (follow_trail)
		{
			if (world->map->get_tile_type(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i]) == Map::tile_trail) dirs_avail++;
		}
		else if (verify_move(try_dirs_x[i], try_dirs_y[i])) dirs_avail++;
	}

	if (dirs_avail == 0) // Dead end - turn around
	{
		do_move(try_dirs_x[1]*(-1), try_dirs_y[1]*(-1));
		switch (move_dir)
		{
			case 0: move_dir=1; break;
			case 1: move_dir=0; break;
			case 2: move_dir=3; break;
			case 3: move_dir=2; break;
		}
	}
	else
	{
		int new_dir = rand()%dirs_avail;
		for (int i=0; i<3; i++)
		{
			if ((follow_trail && world->map->get_tile_type(dest_x+try_dirs_x[i], dest_y+try_dirs_y[i]) == Map::tile_trail) ||
				(!follow_trail && verify_move(try_dirs_x[i], try_dirs_y[i])))
			{
				if (new_dir == 0)
				{
					if (world->map->get_tile_type(dest_x, dest_y) == Map::tile_trail)
					{
						world->map->eat_trail(dest_x, dest_y);
						red_ghost = true;
					}
					else
					{
						red_ghost = false;
					}

					do_move(try_dirs_x[i], try_dirs_y[i]);
					move_dir = try_dirs_id[i];
				}
				new_dir--;
			}
		}
	}

	return true;
}
示例#6
0
/*la funziona che sceglie la prossima mossa da effettuare
Ho seguito la filosofia KISS, ma va ottimizzata*/
unsigned int old_select_move(const int hm,const unsigned int index,const int sl) {
	MOVEL m;
	unsigned int i;

	switch (tree.status[Ply]) {
			case ST_PV_MOVE:
				m.move.mi = tree.old_pv[Ply].mi; /*prova la mossa della pv*/
				tree.status[Ply] = ST_GEN_ALL;
				tree.next[Ply] = 0;
				tree.first_move_played[Ply].mi=0;

				if (1 && tree.follow_pv && m.move.mi) {
						if (verify_move(m.move)) {
								tree.next[Ply]++;
								tree.first_move_played[Ply].mi=m.move.mi;
								return m.move.mi;
								}

						tree.follow_pv = 0;
						}

			case ST_GEN_ALL:
				gen_all(); /*genera tutte le mosse*/

				if ((tree.first_move[Ply + 1] == tree.first_move[Ply]))
					return 0;

			/*	tree.next[Ply]+=tree.first_move[Ply];*/
				/*Elimina la mossa PV*/
				if (1 && tree.next[Ply]) {
						for (i = tree.first_move[Ply];i < tree.first_move[Ply + 1];i++) {
								/*inserisce la PV come prima mossa*/

								if (tree.move_list[i].move.mi == tree.pv[0][Ply].mi) {
										m = tree.move_list[i];
										tree.move_list[i] = tree.move_list[tree.first_move[Ply]];
										tree.move_list[tree.first_move[Ply]] = m;
										break;
										}

								}

						}
				tree.next[Ply] += tree.first_move[Ply];
				tree.status[Ply] = ST_TT_MOVE;

			case ST_TT_MOVE:
				/*Mossa tabella hash*/
				if (mizar.o.use_hash && hm) {
					m.move=hash_table[index].slot[sl].best_move;
					if (m.move.mi && m.move.mi!=tree.first_move_played[Ply].mi) {
						for (i = tree.next[Ply]; i < tree.first_move[Ply + 1];i++) {
							if (tree.move_list[i].move.mi == m.move.mi) {
										tree.move_list[i]=tree.move_list[tree.next[Ply]];
										tree.move_list[tree.next[Ply]] = m;
										tree.next[Ply]++;
										tree.status[Ply] = ST_CPT_MOV;
										return (m.move.mi);
										break;
							}
						}				
					}
				}
				tree.status[Ply] = ST_CPT_MOV;

			case ST_CPT_MOV:  /*Seglie tra le catture*/

				if (choose(tree.next[Ply], tree.first_move[Ply + 1])) {
						m = tree.move_list[tree.next[Ply]];
						tree.next[Ply]++;
						return m.move.mi;
						}

				if (tree.next[Ply] == tree.first_move[Ply + 1])
					return 0;

				tree.status[Ply] = ST_CNT_MOV;

			case ST_CNT_MOV:
				m.move.mi = tree.c_heuristic[b256to64[tree.history[N_moves - 1].m.ms.from]][b256to64[tree.history[N_moves - 1].m.ms.to]][tree.history[N_moves - 1].m.ms.flag].mi;

				if (m.move.mi)
					for (i = tree.next[Ply];i < tree.first_move[Ply + 1];i++) {
							if (tree.move_list[i].move.mi == m.move.mi) {
									tree.move_list[i] = tree.move_list[tree.next[Ply]];
									tree.next[Ply]++;
									tree.status[Ply] = ST_KL1_MOV;
									return m.move.mi;
									}

							}

			case ST_KL1_MOV:  /*Killer Move 1*/

				if (tree.k_heuristic[Ply].m1.mi)
					for (i = tree.next[Ply];i < tree.first_move[Ply + 1];i++) {
							if (tree.move_list[i].move.mi == tree.k_heuristic[Ply].m1.mi) {
									tree.move_list[i] = tree.move_list[tree.next[Ply]];
									tree.next[Ply]++;
									tree.status[Ply] = ST_KL2_MOV;
									return tree.k_heuristic[Ply].m1.mi;
									}

							}

			case ST_KL2_MOV:  /*Killer Move 2*/

				if (tree.k_heuristic[Ply].m2.mi)
					for (i = tree.next[Ply];i < tree.first_move[Ply + 1];i++) {
							if (tree.move_list[i].move.mi == tree.k_heuristic[Ply].m1.mi) {
									tree.move_list[i] = tree.move_list[tree.next[Ply]];
									tree.next[Ply]++;
									tree.status[Ply] = ST_SRT_ALL;
									return tree.k_heuristic[Ply].m1.mi;
									}

							}
				tree.status[Ply] = ST_SRT_ALL;

			case ST_SRT_ALL:  /*Assegna un punteggio alle mosse rimanenti*/

				for (i = tree.next[Ply];i < tree.first_move[Ply + 1];i++) {
						tree.move_list[i].scoren = tree.h_heuristic[tree.move_list[i].move.ms.from][tree.move_list[i].move.ms.to];
						}

				tree.status[Ply] = ST_ALL_MOV;

			case ST_ALL_MOV: /* sceglie tra le rimanenti mosse*/

				if (choose2(tree.next[Ply], tree.first_move[Ply + 1])) {
						m = tree.move_list[tree.next[Ply]];
						tree.next[Ply]++;
						return m.move.mi;
						}

				break;
			default:
				puts("Unexpected tree status.");
				assert(0);
			}

	return 0;
	}