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(); } } }
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; }
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; }
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; }
/*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; }