public possible_move ai_make_move(int limit) { var frontier = get_frontier(false); int[] h = new int[frontier.Count]; int i = 0; foreach (var m in frontier) { reversi child = make_move(m); h[i] = alphabeta(child, limit, -10000, 10000, false); ++i; } possible_move result = frontier[0]; int g = h[0]; for (int j = 1; j < frontier.Count; ++j) { if (h[j] > g) { result = frontier[j]; g = h[j]; } else if (h[j] == g) { Random random = new Random(); if (random.NextDouble() > 0.5) { g = h[j]; } } } return(result); }
public reversi make_move(possible_move move) { reversi result = new reversi(this.black, this.white); result.parent = this; var self = result.black; var enemy = result.white; if (move.color) //white { self = result.white; enemy = result.black; } int st = 0; if (move.color) { st = 1; } result.state[move.pos] = st; self.Add(move.pos); foreach (int x in move.flipped) { result.state[x] = st; self.Add(x); enemy.RemoveAt(enemy.FindIndex(a => a == x)); } return(result); }
private void computer_move() { frontier = game.get_frontier(false); if (frontier == null) { if (game.game_over()) { gameover(); return; } MessageBox.Show("computer has no moves"); // computer has no moves return; } possible_move m = game.ai_make_move((int)ab_depth.Value); board[m.pos].BackgroundImage = Properties.Resources.hint; board[m.pos].Refresh(); System.Threading.Thread.Sleep(100); game = game.make_move(m); display_state(); computer_score.Text = game.black.Count.ToString(); your_score.Text = game.white.Count.ToString(); }
public List <possible_move> get_frontier(bool player) //player - 0/1 { List <possible_move> result = new List <possible_move>(); List <int> curr_cells = black; if (player) { curr_cells = white; } foreach (int pos in curr_cells) { for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { if (dx == 0 && dy == 0) { continue; } int x = get_x(pos); int y = get_y(pos); List <int> flipped = new List <int>(); while (x >= 0 && x <= 7 && y >= 0 && y <= 7) { x += dx; y += dy; if (x < 0 || x > 7 || y < 0 || y > 7) { continue; } int new_pos = x * 8 + y; int p = 0; if (player) { p = 1; } if (state[new_pos] == p) // same color { break; } if (state[new_pos] == 2) // empty cell { if (flipped.Count > 0) { possible_move pos_m = new possible_move(); pos_m.color = player; pos_m.flipped = flipped; pos_m.pos = new_pos; result.Add(pos_m); } break; } // enemy color flipped.Add(new_pos); } } } } if (result.Count == 0) // ходов нет { return(null); } if (result.Count > 1) { result = result.OrderBy(p => p.pos).ToList(); int current = 0; var pm = result[current]; var next = result[current + 1]; while (current != result.Count() - 1) { if (current == result.Count() - 1) { break; } if (next.pos == pm.pos) { pm.flipped.AddRange(next.flipped); result.Remove(next); if (current < result.Count() - 1) { next = result[current + 1]; } else { break; } } else { pm = next; ++current; if (current < result.Count() - 1) { next = result[current + 1]; } } } } return(result); }