Ejemplo n.º 1
0
        //Ham tim nuoc di cho may
        private void FindMove()
        {
            if (depth > maxDepth)
            {
                return;
            }
            depth++;
            fWin = false;
            bool  fLose     = false;
            Point pcMove    = new Point();
            Point humanMove = new Point();
            int   countMove = 0;

            EvalChessBoard(2, ref eBoard);

            //Lay ra MaxMove buoc di co diem cao nhat
            Point temp = new Point();

            for (int i = 0; i < maxMove; i++)
            {
                temp      = eBoard.MaxPos();
                PCMove[i] = temp;
                eBoard.EBoard[(int)temp.X, (int)temp.Y] = 0;
            }

            //Lay nuoc di trong PCMove[] ra danh thu
            countMove = 0;
            while (countMove < maxMove)
            {
                pcMove = PCMove[countMove++];
                BoardArr[(int)pcMove.X, (int)pcMove.Y] = 2;
                WinMove.SetValue(pcMove, depth - 1);

                //Tim cac nuoc di toi uu cua nguoi
                eBoard.ResetBoard();
                EvalChessBoard(1, ref eBoard);
                //Lay ra maxMove nuoc di co diem cao nhat cua nguoi
                for (int i = 0; i < maxMove; i++)
                {
                    temp         = eBoard.MaxPos();
                    HumanMove[i] = temp;
                    eBoard.EBoard[(int)temp.X, (int)temp.Y] = 0;
                }
                //Danh thu cac nuoc di
                for (int i = 0; i < maxMove; i++)
                {
                    humanMove = HumanMove[i];
                    BoardArr[(int)humanMove.X, (int)humanMove.Y] = 1;
                    if (CheckEnd((int)humanMove.X, (int)humanMove.Y) == 2)
                    {
                        fWin = true;
                        //MessageBox.Show("fwin" + fWin.ToString());
                    }
                    if (CheckEnd((int)humanMove.X, (int)humanMove.Y) == 1)
                    {
                        fLose = true;
                        //MessageBox.Show("flose" + fLose.ToString());
                    }
                    if (fLose)
                    {
                        BoardArr[(int)pcMove.X, (int)pcMove.Y]       = 0;
                        BoardArr[(int)humanMove.X, (int)humanMove.Y] = 0;
                        break;
                    }
                    if (fWin)
                    {
                        BoardArr[(int)pcMove.X, (int)pcMove.Y]       = 0;
                        BoardArr[(int)humanMove.X, (int)humanMove.Y] = 0;
                        return;
                    }
                    FindMove();
                    BoardArr[(int)humanMove.X, (int)humanMove.Y] = 0;
                }
                BoardArr[(int)pcMove.X, (int)pcMove.Y] = 0;
            }
        }
Ejemplo n.º 2
0
        //xu li ai

        //Ham tinh gia tri cho bang luong gia

        private void EvalChessBoard(int player, ref EvalBoard eBoard)
        {
            int rw, cl, ePC, eHuman;

            eBoard.ResetBoard();

            //Danh gia theo hang
            for (rw = 0; rw < 12; rw++)
            {
                for (cl = 0; cl < 8; cl++)
                {
                    ePC = 0; eHuman = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        if (BoardArr[rw, cl + i] == 1)
                        {
                            eHuman++;
                        }
                        if (BoardArr[rw, cl + i] == 2)
                        {
                            ePC++;
                        }
                    }

                    if (eHuman * ePC == 0 && eHuman != ePC)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            if (BoardArr[rw, cl + i] == 0) // Neu o chua duoc danh
                            {
                                if (eHuman == 0)
                                {
                                    if (player == 1)
                                    {
                                        eBoard.EBoard[rw, cl + i] += DScore[ePC];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw, cl + i] += AScore[ePC];
                                    }
                                }
                                if (ePC == 0)
                                {
                                    if (player == 2)
                                    {
                                        eBoard.EBoard[rw, cl + i] += DScore[eHuman];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw, cl + i] += AScore[eHuman];
                                    }
                                }
                                if (eHuman == 4 || ePC == 4)
                                {
                                    eBoard.EBoard[rw, cl + i] *= 2;
                                }
                            }
                        }
                    }
                }
            }

            //Danh gia theo cot
            for (cl = 0; cl < 12; cl++)
            {
                for (rw = 0; rw < 8; rw++)
                {
                    ePC = 0; eHuman = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        if (BoardArr[rw + i, cl] == 1)
                        {
                            eHuman++;
                        }
                        if (BoardArr[rw + i, cl] == 2)
                        {
                            ePC++;
                        }
                    }

                    if (eHuman * ePC == 0 && eHuman != ePC)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            if (BoardArr[rw + i, cl] == 0) // Neu o chua duoc danh
                            {
                                if (eHuman == 0)
                                {
                                    if (player == 1)
                                    {
                                        eBoard.EBoard[rw + i, cl] += DScore[ePC];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw + i, cl] += AScore[ePC];
                                    }
                                }
                                if (ePC == 0)
                                {
                                    if (player == 2)
                                    {
                                        eBoard.EBoard[rw + i, cl] += DScore[eHuman];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw + i, cl] += AScore[eHuman];
                                    }
                                }
                                if (eHuman == 4 || ePC == 4)
                                {
                                    eBoard.EBoard[rw + i, cl] *= 2;
                                }
                            }
                        }
                    }
                }
            }

            //Danh gia duong cheo xuong
            for (cl = 0; cl < 8; cl++)
            {
                for (rw = 0; rw < 8; rw++)
                {
                    ePC = 0; eHuman = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        if (BoardArr[rw + i, cl + i] == 1)
                        {
                            eHuman++;
                        }
                        if (BoardArr[rw + i, cl + i] == 2)
                        {
                            ePC++;
                        }
                    }

                    if (eHuman * ePC == 0 && eHuman != ePC)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            if (BoardArr[rw + i, cl + i] == 0) // Neu o chua duoc danh
                            {
                                if (eHuman == 0)
                                {
                                    if (player == 1)
                                    {
                                        eBoard.EBoard[rw + i, cl + i] += DScore[ePC];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw + i, cl + i] += AScore[ePC];
                                    }
                                }
                                if (ePC == 0)
                                {
                                    if (player == 2)
                                    {
                                        eBoard.EBoard[rw + i, cl + i] += DScore[eHuman];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw + i, cl + i] += AScore[eHuman];
                                    }
                                }
                                if (eHuman == 4 || ePC == 4)
                                {
                                    eBoard.EBoard[rw + i, cl + i] *= 2;
                                }
                            }
                        }
                    }
                }
            }

            //Danh gia duong cheo len
            for (rw = 4; rw < 12; rw++)
            {
                for (cl = 0; cl < 8; cl++)
                {
                    ePC = 0; eHuman = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        if (BoardArr[rw - i, cl + i] == 1)
                        {
                            eHuman++;
                        }
                        if (BoardArr[rw - i, cl + i] == 2)
                        {
                            ePC++;
                        }
                    }

                    if (eHuman * ePC == 0 && eHuman != ePC)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            if (BoardArr[rw - i, cl + i] == 0) // Neu o chua duoc danh
                            {
                                if (eHuman == 0)
                                {
                                    if (player == 1)
                                    {
                                        eBoard.EBoard[rw - i, cl + i] += DScore[ePC];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw - i, cl + i] += AScore[ePC];
                                    }
                                }
                                if (ePC == 0)
                                {
                                    if (player == 2)
                                    {
                                        eBoard.EBoard[rw - i, cl + i] += DScore[eHuman];
                                    }
                                    else
                                    {
                                        eBoard.EBoard[rw - i, cl + i] += AScore[eHuman];
                                    }
                                }
                                if (eHuman == 4 || ePC == 4)
                                {
                                    eBoard.EBoard[rw - i, cl + i] *= 2;
                                }
                            }
                        }
                    }
                }
            }
        }