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); } } }
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); }