コード例 #1
0
 private void calculateColumns(XOSymbol xoSymbol, GamePadNode gamePadNode)
 {
     for (int column = 0; column < gamePadNode.GamePad.GetLength(0); column++)
     {
         List<XOSymbol> xoSymbolLine = new List<XOSymbol>();
         for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++)
         {
             xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column));
         }
         if (isWinningMove(xoSymbol, xoSymbolLine))
         {
             gamePadNode.IsWinning = true;
             return;
         }
         if (hasPotential(xoSymbol, xoSymbolLine))
         {
             switch (xoSymbol)
             {
                 case XOSymbol.X:
                     gamePadNode.XFunction++;
                     break;
                 case XOSymbol.O:
                     gamePadNode.OFunction++;
                     break;
             }
         }
     }
 }
コード例 #2
0
ファイル: GameEngine.cs プロジェクト: abb-iss/Sando
        /// <summary>
        /// /// <summary>
        /// Check if there is a winner based on Diagonal Line
        /// Sample Data :
        /// X
        ///   X
        ///     X
        /// </summary>
        /// </summary>
        private void checkDiagonals()
        {
            for (int diagonal = 0; diagonal < 2; diagonal++)
            {
                XOSymbol cellXOSymbol = (XOSymbol)gamePad.GetValue(diagonal, diagonal); //Get an element of the current Diagonal
                bool     lineMatched  = cellXOSymbol != XOSymbol.EMPTY;                 //Ensure that it is not empty cell
                for (int row = 0; row < gamePad.GetLength(0); row++)
                {
                    int column = 0;

                    switch (diagonal)
                    {
                    case  0:
                        column = row;
                        break;

                    case 1:
                        column = (gamePad.GetLength(0) - 1) - row;
                        break;
                    }

                    lineMatched &= (cellXOSymbol == (XOSymbol)gamePad.GetValue(row, column));
                    if (!lineMatched)
                    {
                        break;
                    }
                }
                if (lineMatched)
                {
                    endGame(cellXOSymbol);
                }
            }
        }
コード例 #3
0
ファイル: GameMove.cs プロジェクト: spati2/FSE-2012-SANDO
 public GameMove(int position, XOSymbol xoSymbol)
 {
     if (position > 8 || position < 0)
         throw new Exception("Invlaid position. Valid Positions from Right to Left, Top Down is : 0,1,2,3,4,5,6,7,8");
     this.xoSymbol = xoSymbol;
     this.position = position;
 }
コード例 #4
0
        private void calculateColumns(XOSymbol xoSymbol, GamePadNode gamePadNode)
        {
            for (int column = 0; column < gamePadNode.GamePad.GetLength(0); column++)
            {
                List <XOSymbol> xoSymbolLine = new List <XOSymbol>();
                for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++)
                {
                    xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column));
                }
                if (isWinningMove(xoSymbol, xoSymbolLine))
                {
                    gamePadNode.IsWinning = true;
                    return;
                }
                if (hasPotential(xoSymbol, xoSymbolLine))
                {
                    switch (xoSymbol)
                    {
                    case XOSymbol.X:
                        gamePadNode.XFunction++;
                        break;

                    case XOSymbol.O:
                        gamePadNode.OFunction++;
                        break;
                    }
                }
            }
        }
コード例 #5
0
        private void oFunction(GamePadNode gamePadNode)
        {
            XOSymbol xoSymbol = XOSymbol.O;

            calculateRows(xoSymbol, gamePadNode);
            calculateColumns(xoSymbol, gamePadNode);
            calculateDiagonals(xoSymbol, gamePadNode);
        }
コード例 #6
0
        private int position; //Valid positions are : 0,1,2 ... 7,8

        public GameMove(int position, XOSymbol xoSymbol)
        {
            if (position > 8 || position < 0)
            {
                throw new Exception("Invlaid position. Valid Positions from Right to Left, Top Down is : 0,1,2,3,4,5,6,7,8");
            }
            this.xoSymbol = xoSymbol;
            this.position = position;
        }
コード例 #7
0
        public GameMove Think(XOSymbol[,] gamePad, XOSymbol playerSymbol)
        {
            this.playerSymbol = playerSymbol;
            List <GamePadNode> listGamePadNode = generateChilds(new GamePadNode(gamePad));

            this.listGamePadNode = listGamePadNode;
            foreach (GamePadNode node in listGamePadNode)
            {
                calculateHeuristic(node);
                if (node.IsWinning)
                {
                    return(node.GameMove);
                }
            }

            //Find Best Heuristic
            int         bestIndex = 0;
            GamePadNode _node;
            int         best = 0;

            switch (playerSymbol)
            {
            case XOSymbol.X:
                best = int.MinValue;
                break;

            case XOSymbol.O:
                best = int.MaxValue;
                break;
            }

            for (int counter = 0; counter < listGamePadNode.Count; counter++)
            {
                _node = listGamePadNode[counter];
                switch (playerSymbol)
                {
                case XOSymbol.X:     //Look for max value
                    if (_node.Heurisitic > best)
                    {
                        best      = _node.Heurisitic;
                        bestIndex = counter;
                    }
                    break;

                case XOSymbol.O:     //Look for min Value
                    if (_node.Heurisitic < best)
                    {
                        best      = _node.Heurisitic;
                        bestIndex = counter;
                    }
                    break;
                }
            }

            return(listGamePadNode[bestIndex].GameMove);
        }
コード例 #8
0
        private bool isWinningMove(XOSymbol xoSymbol, List <XOSymbol> xoSymbolLine)
        {
            bool isMathced = true;

            foreach (XOSymbol xoSymbolCell in xoSymbolLine)
            {
                isMathced &= xoSymbolCell == xoSymbol;
            }
            return(isMathced);
        }
コード例 #9
0
        private bool hasPotential(XOSymbol xoSymbol, List <XOSymbol> xoSymbolLine)
        {
            bool isMatchedOrEmpty = true;

            foreach (XOSymbol xoSymbolCell in xoSymbolLine)
            {
                isMatchedOrEmpty &= (xoSymbolCell == xoSymbol || xoSymbolCell == XOSymbol.EMPTY);
            }
            return(isMatchedOrEmpty);
        }
コード例 #10
0
        public GameMove Think(XOSymbol[,] gamePad, XOSymbol playerSymbol)
        {
            this.playerSymbol = playerSymbol;
            List<GamePadNode> listGamePadNode = generateChilds(new GamePadNode(gamePad));
            this.listGamePadNode = listGamePadNode;
            foreach (GamePadNode node in listGamePadNode)
            {
                calculateHeuristic(node);
                if (node.IsWinning)
                    return node.GameMove;
            }

            //Find Best Heuristic
            int bestIndex = 0;
            GamePadNode _node;
            int best = 0;
            switch(playerSymbol)
            {
                case XOSymbol.X:
                    best = int.MinValue;
                    break;
                case XOSymbol.O:
                    best = int.MaxValue;
                    break;
            }

            for (int counter = 0; counter < listGamePadNode.Count; counter++ )
            {
                _node = listGamePadNode[counter];
                switch (playerSymbol)
                {
                    case XOSymbol.X: //Look for max value
                        if (_node.Heurisitic > best)
                        {
                            best = _node.Heurisitic;
                            bestIndex = counter;
                        }
                        break;
                    case XOSymbol.O: //Look for min Value
                        if (_node.Heurisitic < best)
                        {
                            best = _node.Heurisitic;
                            bestIndex = counter;
                        }
                        break;
                }
            }

            return listGamePadNode[bestIndex].GameMove;
        }
コード例 #11
0
ファイル: GameEngine.cs プロジェクト: abb-iss/Sando
 /// <summary>
 /// 1- Set the gameover flag
 /// 2- Find the winner
 /// </summary>
 /// <param name="winnerXOSymbol"></param>
 private void endGame(XOSymbol winnerXOSymbol)
 {
     isGameOver = true;
     if (humanPlayer.XOSymbol == winnerXOSymbol)
     {
         winnerPlayer = humanPlayer;
         return;
     }
     if (pcPlayer.XOSymbol == winnerXOSymbol)
     {
         winnerPlayer = pcPlayer;
         return;
     }
 }
コード例 #12
0
ファイル: GamePadUC.cs プロジェクト: abb-iss/Sando
        private void showGamePad(XOSymbol[,] gamePad)
        {
            int position = 0;

            for (int row = 0; row < gamePad.GetLength(0); row++)
            {
                for (int column = 0; column < gamePad.GetLength(1); column++)
                {
                    XOSymbol xoSymbol = (XOSymbol)gamePad.GetValue(row, column);
                    if (xoSymbol != XOSymbol.EMPTY)
                    {
                        AddMove(new GameMove(position, xoSymbol));
                    }
                    position++;
                }
            }
        }
コード例 #13
0
ファイル: GameEngine.cs プロジェクト: abb-iss/Sando
 /// <summary>
 /// Check if there is a winner based on Column Line
 /// Sample Data :
 /// X
 /// X
 /// X
 /// </summary>
 private void checkColumns()
 {
     for (int column = 0; column < gamePad.GetLength(0); column++)
     {
         XOSymbol cellXOSymbol = (XOSymbol)gamePad.GetValue(0, column); //Get first element of the current Column
         bool     lineMatched  = cellXOSymbol != XOSymbol.EMPTY;        //Ensure that it is not empty cell
         for (int row = 0; row < gamePad.GetLength(1); row++)
         {
             lineMatched &= (cellXOSymbol == (XOSymbol)gamePad.GetValue(row, column));
             if (!lineMatched)
             {
                 break;
             }
         }
         if (lineMatched)
         {
             endGame(cellXOSymbol);
         }
     }
 }
コード例 #14
0
        private void calculateDiagonals(XOSymbol xoSymbol, GamePadNode gamePadNode)
        {
            for (int diagonal = 0; diagonal < 2; diagonal++)
            {
                List <XOSymbol> xoSymbolLine = new List <XOSymbol>();
                for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++)
                {
                    int column = 0;

                    switch (diagonal)
                    {
                    case 0: column = row;
                        break;

                    case 1: column = (gamePadNode.GamePad.GetLength(0) - 1) - row;
                        break;
                    }
                    xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column));
                }
                if (isWinningMove(xoSymbol, xoSymbolLine))
                {
                    gamePadNode.IsWinning = true;
                    return;
                }
                if (hasPotential(xoSymbol, xoSymbolLine))
                {
                    switch (xoSymbol)
                    {
                    case XOSymbol.X:
                        gamePadNode.XFunction++;
                        break;

                    case XOSymbol.O:
                        gamePadNode.OFunction++;
                        break;
                    }
                }
            }
        }
コード例 #15
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            HumanPlayer humanPlayer      = new HumanPlayer("Moutasem Al-awa", getSelectedSymbol());
            XOSymbol    xoSymbolPCPlayer = XOSymbol.EMPTY;

            switch (getSelectedSymbol())
            {
            case XOSymbol.O:
                xoSymbolPCPlayer = XOSymbol.X;
                break;

            case XOSymbol.X:
                xoSymbolPCPlayer = XOSymbol.O;
                break;
            }
            PCPlayer pcPlayer = new PCPlayer(xoSymbolPCPlayer);

            Player firstPlayer = null;

            firstPlayer = pcPlayer;
            if (isHumanFirst())
            {
                firstPlayer = humanPlayer;
            }

            GameEngine gameEngine = new GameEngine(humanPlayer, pcPlayer, firstPlayer);

            gamePadUC1.GameEngine = gameEngine;

            grbGameSettings.Enabled = false;
            gamePadUC1.Enabled      = true;

            if (!isHumanFirst())
            {
                pcPlayer.Play();
                gamePadUC1.AddMove(pcPlayer.GameMove);
            }
        }
コード例 #16
0
ファイル: PCPlayer.cs プロジェクト: abb-iss/Sando
 public PCPlayer(XOSymbol xoSymbol)
     : base("Computer", xoSymbol)
 {
     iplayerBrain = new MinimaxPlayerBrain();
 }
コード例 #17
0
ファイル: GamePadUC.cs プロジェクト: spati2/FSE-2012-SANDO
 private void showGamePad(XOSymbol[,] gamePad)
 {
     int position = 0;
     for (int row = 0; row < gamePad.GetLength(0); row++)
     {
         for (int column = 0; column < gamePad.GetLength(1); column++)
         {
             XOSymbol xoSymbol = (XOSymbol)gamePad.GetValue(row, column);
             if (xoSymbol != XOSymbol.EMPTY)
                 AddMove(new GameMove(position, xoSymbol));
             position++;
         }
     }
 }
コード例 #18
0
ファイル: HumanPlayer.cs プロジェクト: spati2/FSE-2012-SANDO
 public HumanPlayer(String name, XOSymbol xoSymbol)
     : base(name, xoSymbol)
 {
 }
コード例 #19
0
ファイル: GamePadNode.cs プロジェクト: spati2/FSE-2012-SANDO
 public GamePadNode(XOSymbol[,] gamePad)
 {
     GamePad = gamePad;
 }
コード例 #20
0
ファイル: XOSymbolUC.cs プロジェクト: spati2/FSE-2012-SANDO
 public XOSymbolUC(XOSymbol xoSymbol)
     : this()
 {
     XOSymbol = xoSymbol;
 }
コード例 #21
0
ファイル: HumanPlayer.cs プロジェクト: abb-iss/Sando
 public HumanPlayer(String name, XOSymbol xoSymbol)
     : base(name, xoSymbol)
 {
 }
コード例 #22
0
        private void calculateDiagonals(XOSymbol xoSymbol, GamePadNode gamePadNode)
        {
            for (int diagonal = 0; diagonal < 2; diagonal++)
            {
                List<XOSymbol> xoSymbolLine = new List<XOSymbol>();
                for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++)
                {
                    int column = 0;

                    switch (diagonal)
                    {
                        case 0: column = row;
                            break;
                        case 1: column = (gamePadNode.GamePad.GetLength(0) - 1) - row;
                            break;
                    }
                    xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column));
                }
                if (isWinningMove(xoSymbol, xoSymbolLine))
                {
                    gamePadNode.IsWinning = true;
                    return;
                }
                if (hasPotential(xoSymbol, xoSymbolLine))
                {
                    switch (xoSymbol)
                    {
                        case XOSymbol.X:
                            gamePadNode.XFunction++;
                            break;
                        case XOSymbol.O:
                            gamePadNode.OFunction++;
                            break;
                    }
                }
            }
        }
コード例 #23
0
ファイル: GameEngine.cs プロジェクト: spati2/FSE-2012-SANDO
 /// <summary>
 /// 1- Set the gameover flag
 /// 2- Find the winner
 /// </summary>
 /// <param name="winnerXOSymbol"></param>
 private void endGame( XOSymbol winnerXOSymbol)
 {
     isGameOver = true;
     if (humanPlayer.XOSymbol == winnerXOSymbol)
     {
         winnerPlayer = humanPlayer;
         return;
     }
     if (pcPlayer.XOSymbol == winnerXOSymbol)
     {
         winnerPlayer = pcPlayer;
         return;
     }
 }
コード例 #24
0
 private bool hasPotential(XOSymbol xoSymbol, List<XOSymbol> xoSymbolLine)
 {
     bool isMatchedOrEmpty = true;
     foreach (XOSymbol xoSymbolCell in xoSymbolLine)
     {
         isMatchedOrEmpty &= (xoSymbolCell == xoSymbol || xoSymbolCell == XOSymbol.EMPTY);
     }
     return isMatchedOrEmpty;
 }
コード例 #25
0
 private List<int> countEmptyCells(XOSymbol[,] gamePad)
 {
     List<int> listEmptyCellsIndex = new List<int>();
     int index = 0;
     for (int row = 0; row < gamePad.GetLength(0); row++)
     {
         for (int column = 0; column < gamePad.GetLength(1); column++)
         {
             if ((XOSymbol)gamePad.GetValue(row, column) == XOSymbol.EMPTY)
             {
                 listEmptyCellsIndex.Add(index);
             }
             index++;
         }
     }
     return listEmptyCellsIndex;
 }
コード例 #26
0
 private bool isWinningMove(XOSymbol xoSymbol, List<XOSymbol> xoSymbolLine)
 {
     bool isMathced = true;
     foreach (XOSymbol xoSymbolCell in xoSymbolLine)
     {
         isMathced &= xoSymbolCell == xoSymbol;
     }
     return isMathced;
 }
コード例 #27
0
ファイル: Player.cs プロジェクト: evoresearch/UnitTestScribe
 public Player(string name, XOSymbol xoSymbol)
 {
     this.name     = name;
     this.xoSymbol = xoSymbol;
 }
コード例 #28
0
 public XOSymbolUC(XOSymbol xoSymbol)
     : this()
 {
     XOSymbol = xoSymbol;
 }
コード例 #29
0
ファイル: PCPlayer.cs プロジェクト: spati2/FSE-2012-SANDO
 public PCPlayer(XOSymbol xoSymbol)
     : base("Computer", xoSymbol)
 {
     iplayerBrain = new MinimaxPlayerBrain();
 }
コード例 #30
0
ファイル: Player.cs プロジェクト: spati2/FSE-2012-SANDO
 public Player(string name, XOSymbol xoSymbol)
 {
     this.name = name;
     this.xoSymbol = xoSymbol;
 }