Exemple #1
0
        private void CheckTRBL()
        {
            int pos = -1;
            List <AvailableBlock> blks = new List <AvailableBlock>();
            AvailableBlock        blk  = new AvailableBlock();

            base.TopRightBottomLeftCheck((x, y, lineNr) =>
            {
                Check(x, y, lineNr, ref pos, ref blk, blks);
                return(false);
            });
            if (blk.X >= 0 && (blk.PlayerRateX > 0 || blk.PlayerRateO > 0))
            {
                blks.Add(blk);
            }
            foreach (AvailableBlocksMap bs in blocks)
            {
                for (int i = blks.Count - 1; i >= 0; i--)
                {
                    if (bs.X == blks[i].X && bs.Y == blks[i].Y)
                    {
                        bs.TopRightBottomLeft.O += blks[i].PlayerRateO;
                        bs.TopRightBottomLeft.X += blks[i].PlayerRateX;
                        blks.RemoveAt(i);
                    }
                }
            }
            if (blks.Count > 0)
            {
                foreach (AvailableBlock b in blks)
                {
                    AvailableBlocksMap abm = new AvailableBlocksMap(b.X, b.Y);
                    abm.TopRightBottomLeft.X = b.PlayerRateX;
                    abm.TopRightBottomLeft.O = b.PlayerRateO;
                    blocks.Add(abm);
                }
            }
        }
Exemple #2
0
        public AvailableBlocksMap AIMove(Player aiType)
        {
            if (aiType == Player.NONE)
            {
                return(null);
            }
            for (int i = blocks.Count - 1; i >= 0; i--)
            {
                blocks.RemoveAt(i);
            }

            CheckH();
            CheckV();
            CheckTLBR();
            CheckTRBL();

            AvailableBlocksMap bMap = null;

            if (blocks.Count <= 0)
            {
                return(null);
            }
            if (blocks.Count == 1)
            {
                bMap = blocks[0];
            }
            else
            {
                List <AvailableBlocksMap> bestBlocks = new List <AvailableBlocksMap>();
                int maxBlock = 0;

                foreach (AvailableBlocksMap b in blocks)
                {
                    if (maxBlock < b.Max)
                    {
                        maxBlock = b.Max;
                    }
                }
                foreach (AvailableBlocksMap b in blocks)
                {
                    if (maxBlock == b.Max)
                    {
                        bestBlocks.Add(b);
                    }
                }
                if (bestBlocks.Count == 1)
                {
                    bMap = bestBlocks[0];
                }
                if (bestBlocks.Count > 1)
                {
                    // Expected win
                    if (maxBlock + 1 >= winLine)
                    {
                        List <AvailableBlocksMap> bestBlocksTemp = new List <AvailableBlocksMap>();
                        for (int i = bestBlocks.Count - 1; i >= 0; i--)
                        {
                            switch (aiType)
                            {
                            case Player.X:
                                if (maxBlock == bestBlocks[i].MaxX)
                                {
                                    bestBlocksTemp.Add(bestBlocks[i]);
                                }
                                break;

                            case Player.O:
                                if (maxBlock == bestBlocks[i].MaxO)
                                {
                                    bestBlocksTemp.Add(bestBlocks[i]);
                                }
                                break;
                            }
                        }
                        if (bestBlocksTemp.Count == 1)
                        {
                            bMap = bestBlocksTemp[0];
                        }
                        else if (bestBlocksTemp.Count > 1)
                        {
                            int index = new Random().Next(bestBlocksTemp.Count);
                            bMap = bestBlocksTemp[index];
                        }
                        else
                        {
                            int index = new Random().Next(bestBlocks.Count);
                            bMap = bestBlocks[index];
                        }
                    }
                    else
                    {
                        CheckFreeBlocks();
                        List <AvailableBlocksMap> bestBlocksTemp = new List <AvailableBlocksMap>();
                        for (int i = bestBlocks.Count - 1; i >= 0; i--)
                        {
                            switch (aiType)
                            {
                            case Player.X:
                                if (winLine <= bestBlocks[i].AvailableMaxX)
                                {
                                    bestBlocksTemp.Add(bestBlocks[i]);
                                }
                                break;

                            case Player.O:
                                if (winLine <= bestBlocks[i].AvailableMaxO)
                                {
                                    bestBlocksTemp.Add(bestBlocks[i]);
                                }
                                break;
                            }
                        }
                        if (bestBlocksTemp.Count == 1)
                        {
                            bMap = bestBlocksTemp[0];
                        }
                        else if (bestBlocksTemp.Count > 1)
                        {
                            int index = new Random().Next(bestBlocksTemp.Count);
                            bMap = bestBlocksTemp[index];
                        }
                        else
                        {
                            int index = new Random().Next(bestBlocks.Count);
                            bMap = bestBlocks[index];
                        }
                    }
                }
            }
            if (bMap != null)
            {
                switch (aiType)
                {
                case Player.X:
                    map[bMap.X, bMap.Y] = Player.X;
                    break;

                case Player.O:
                    map[bMap.X, bMap.Y] = Player.O;
                    break;
                }
            }
            return(bMap);
        }