コード例 #1
0
ファイル: AI.cs プロジェクト: Shydos/gomoku
 private int GetAlignLenght(Position firstPos, int xAxis, int yAxis, int valueToCheck, ByteBoard board)
 {
     int lenght = 1;
     bool gotLenght = false;
     while (!gotLenght)
     {
         if ((firstPos.x - xAxis >= 0 && firstPos.x - xAxis < 19) && (firstPos.y - yAxis >= 0 && firstPos.y - yAxis < 19))
         {
             firstPos.x -= xAxis;
             firstPos.y -= yAxis;
             if (board.GetValue(firstPos) == valueToCheck)
             {
                 lenght++;
             }
             else
             {
                 gotLenght = true;
             }
         }
         else
         {
             gotLenght = true;
         }
     }
     return lenght;
 }
コード例 #2
0
ファイル: AI.cs プロジェクト: Shydos/gomoku
 public AI(Board board)
 {
     _board = board;
     _bBoard = new ByteBoard();
     patternMap = new Dictionary<int, int>();
     patternMap.Add(1, AL1);
     patternMap.Add(2, AL2);
     patternMap.Add(3, AL3);
     patternMap.Add(4, AL4);
     patternMap.Add(5, DEFAULT);
 }
コード例 #3
0
ファイル: AI.cs プロジェクト: Shydos/gomoku
        private int Eval(ByteBoard board, int numPlayer)
        {
            Position pos;
            int score = 0;

            for (int x = 0; x < 19; x++)
            {
                for (int y = 0; y < 19; y++)
                {
                    pos.x = x;
                    pos.y = y;
                    if (board.GetValue(pos) == numPlayer)
                    {
                        score += getAnnoyanceScore(board, numPlayer, pos);
                    }
                }
            }
            return score;
        }
コード例 #4
0
ファイル: ByteBoard.cs プロジェクト: Shydos/gomoku
 public ByteBoard(ByteBoard cpy)
 {
     _byteBoard = new Byte[cpy._byteBoard.Length];
     for (int i = 0; i < cpy._byteBoard.Length; i++)
         _byteBoard[i] = cpy._byteBoard[i];
 }
コード例 #5
0
ファイル: AI.cs プロジェクト: Shydos/gomoku
        private ScorePos Minimax(ByteBoard node, int depth, int min, int max)
        {
            int childScore;
            ScorePos scorePos = new ScorePos();
            ByteBoard newNode;

            // Cas spcécifique (sortie de récursivité)
            if (depth == MAX_DEPTH)
            {
                scorePos.score = Eval(node, (depth % 2 == 0 ? 2 : 1));
                return (scorePos);
            }
            // Cas général
            // Node is Max (AI turn)
            if (depth % 2 == 0)
            {
                scorePos.score = min;
                for (int y = 0; y < 19; y++)
                {
                    for (int x = 0; x < 19; x++)
                    {
                        if (node.GetValue(new Position(x, y)) == 0)
                        {
                            newNode = new ByteBoard(node);
                            newNode.SetValue(new Position(x, y), 2);
                            childScore = Minimax(newNode, depth + 1, scorePos.score, max).score;
                            if (childScore > scorePos.score)
                            {
                                scorePos.score = childScore;
                                scorePos.pos.x = x;
                                scorePos.pos.y = y;
                            }
                            if (scorePos.score > max)
                            {
                                scorePos.score = max;
                                return (scorePos);
                            }
                        }
                    }
                }
                return (scorePos);
            }
            // Node is Min (opponent turn)
            else
            {
                scorePos.score = max;
                for (int y = 0; y < 19; y++)
                {
                    for (int x = 0; x < 19; x++)
                    {
                        if (node.GetValue(new Position(x, y)) == 0)
                        {
                            newNode = new ByteBoard(node);
                            newNode.SetValue(new Position(x, y), 1);
                            childScore = Minimax(newNode, depth + 1, min, scorePos.score).score;
                            if (childScore < scorePos.score)
                            {
                                scorePos.score = childScore;
                                scorePos.pos.x = x;
                                scorePos.pos.y = y;
                            }
                            if (scorePos.score < min)
                            {
                                scorePos.score = min;
                                return (scorePos);
                            }
                        }
                    }
                }
                return (scorePos);
            }
        }
コード例 #6
0
ファイル: AI.cs プロジェクト: Shydos/gomoku
        private int getAnnoyanceScore(ByteBoard board, int numPlayer, Position pos)
        {
            int alLenght;
            int annScore = 0;
            int valToCheck = (numPlayer == 2 ? 1 : 2);

            for (int xAxis = -1; xAxis <= 1; xAxis++)
            {
                for (int yAxis = -1; yAxis <= 1; yAxis++)
                {
                    if (xAxis != 0 || yAxis != 0)
                    {
                        if ((pos.x - xAxis >= 0 && pos.x - xAxis < 19) && (pos.y - yAxis >= 0 && pos.y - yAxis < 19))
                        {
                            if (board.GetValue(new Position(pos.x - xAxis, pos.y - yAxis)) == valToCheck)
                            {
                                alLenght = GetAlignLenght(pos, xAxis, yAxis, valToCheck, board);
                                if (alLenght > 5)
                                    alLenght = 5;
                                annScore += patternMap[alLenght];
                            }
                        }
                    }
                }
            }
            return (annScore);
        }