예제 #1
0
        public int makeMove(int r, int q)
        {
            int win      = -1;
            int rChecker = r + fieldRadius;
            int qChecker = q + fieldRadius;

            //Radius check
            if (rChecker >= 20 || qChecker >= 20 || rChecker <= -1 || qChecker <= -1)
            {
                return(win);
            }

            if (myField[r + fieldRadius, q + fieldRadius] != 3 && myField[r + fieldRadius, q + fieldRadius] != 4)
            {
                //Invalid move! -> not playable
                return(win);
            }
            else
            {
                if (black)
                {
                    myField[r + fieldRadius, q + fieldRadius] = 1;
                    Console.WriteLine("SET POS: " + (r + fieldRadius) + " ; " + (q + fieldRadius) + " set to black");
                }
                else
                {
                    myField[r + fieldRadius, q + fieldRadius] = 2;
                    Console.WriteLine("SET POS: " + (r + fieldRadius) + " ; " + (q + fieldRadius) + " set to red");
                }

                //remove last recommendation
                removeMoves(4);

                //Check the field for possible moves
                myField = checkPosMoves(myField);

                CheckWin check = new CheckWin(this);

                //Check for winner
                win = check.checkWin(myField);

                //Next players turn!
                black = !black;

                if (win == 1 || win == 2)
                {
                    removeMoves(3);
                }

                //Make a deep copy
                int[,] bufferField = myField.Clone() as int[, ];

                //add move to moveList
                moveList.Add(bufferField);
                moveCounter++;

                return(win);
            }
        }
예제 #2
0
        public int alphaBeta(Move move, int[,] scoreField, int depth, int alpha, int beta, bool black)
        {
            //first check for win
            int win = check.checkWin(scoreField);

            if (win == 1)
            {
                return(2000);
            }

            if (win == 2)
            {
                return(-2000);
            }

            //depth = 0 --> evaluate position
            if (depth == 0)
            {
                return(evalPos(scoreField));
            }

            //return evalPos(scoreField);
            //Console.WriteLine("checking move: " + (move.r +fieldRadius) + ";" + (move.q + fieldRadius));

            if (black)
            {
                scoreField = map.checkPosMoves(scoreField);

                //get all new possible moves
                List <Move> posAB = map.getPosMoves(scoreField);

                int maxEval = -9999;
                int eval    = 0;

                for (int i = 0; i < posAB.Count; i++)
                {
                    Move bufferMove = posAB.ElementAt(i);

                    //Make a deep copy
                    int[,] bufferField = new int[20, 20];
                    bufferField        = scoreField.Clone() as int[, ];

                    //set the new possible move
                    bufferField[bufferMove.r + fieldRadius, bufferMove.q + fieldRadius] = 1;

                    eval = alphaBeta(bufferMove, bufferField, depth - 1, alpha, beta, false);

                    //Console.WriteLine("Move: " + (bufferMove.r + fieldRadius) + " ; " + (bufferMove.q + fieldRadius) + " " + eval)
                    maxEval = Math.Max(maxEval, eval);

                    //alphaBeta
                    alpha = Math.Max(alpha, eval);
                    if (beta <= alpha)
                    {
                        break;
                    }
                }

                return(maxEval);
            }
            else
            {
                scoreField = map.checkPosMoves(scoreField);

                //get all new possible moves
                List <Move> posAB = map.getPosMoves(scoreField);

                int minEval = 9999;
                int eval    = 0;
                for (int i = 0; i < posAB.Count; i++)
                {
                    Move bufferMove = posAB.ElementAt(i);

                    //Make a deep copy
                    int[,] bufferField = new int[20, 20];
                    bufferField        = scoreField.Clone() as int[, ];

                    //set the new possible move
                    bufferField[bufferMove.r + fieldRadius, bufferMove.q + fieldRadius] = 2;

                    eval = alphaBeta(bufferMove, bufferField, depth - 1, alpha, beta, true);

                    minEval = Math.Min(minEval, eval);

                    //alphaBeta
                    beta = Math.Min(beta, eval);
                    if (beta <= alpha)
                    {
                        break;
                    }
                }
                return(minEval);
            }
        }