Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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);
        }