using System.Collections.Generic;
const int NumberOfGames = 10000;
static void Main(string[] args)
for (var c = 0; c < NumberOfGames; c++)
moveResult res = moveResult.noResult;
res = x.RandomMove(x.WhosMove);
if (res == moveResult.noResult)
} while (res == moveResult.noResult);
if (showDraw && res == moveResult.draw)
Console.WriteLine(string.Format("Game = {0}", gameN));
Console.WriteLine(x.ViewBoard);
case moveResult.yellowWin:
var tot = myd + myr + myy;
var resString = string.Format("Red Wins : {0} / {1} = {2:F2}% Yellow wins : {3} / {1} = {4:F2}% Draws : {5} / {1} = {6:F2}%", myr, tot,(double) myr / tot * 100, myy, (double) myy / tot * 100, myd, (double) myd / tot * 100);
Console.WriteLine(resString);
private List<List<piece>> _board;
public piece WhosMove { get; set; }
_board = new List<List<piece>>();
for (var i = 0; i < Cols; i++)
var n = new List<piece>();
for (var j = 0; j < Rows; j++)
this.WhosMove = piece.red;
this.WhosMove = (this.WhosMove == piece.red ? piece.yellow : piece.red);
public moveResult PlayMove(int col, piece p)
if ((p != piece.red && p != piece.yellow) || col >= Cols || !_board[col].Where(x => x == piece.empty).Any())
while (_board[col][pos] != piece.empty)
return CheckPos(col, pos);
for(var row = Rows-1; row>=0; row--)
for (var col = 0; col < Cols; col ++)
var t = _board[col][row];
public moveResult RandomMove(piece p)
var spaced = _board.Select((x, i) => (x.Where(y => y == piece.empty).Any() ? i : -1)).Where(z => z > -1).ToList();
var move = (int)Math.Floor((double) spaced.Count() * rn.NextDouble());
return PlayMove(spaced[move], p);
private moveResult CheckPos(int col, int row)
var myMove = _board[col][row];
while (x1 > 0 && _board[x1 - 1][row] == myMove)
while (x2 < Cols - 1 && _board[x2 + 1][row] == myMove)
while (y1 > 0 && _board[col][y1 - 1] == myMove)
while (y2 < Rows - 1 && _board[col][y2 + 1] == myMove)
while (d1 > 0 && d2 > 0 && _board[d1 - 1][d2 - 1] == myMove)
while (d3 < Cols - 1 && d4 < Rows - 1 && _board[d3+1][d4+1] == myMove)
while (d5 < Cols - 1 && d6 > 0 && _board[d5 + 1][d6 - 1] == myMove)
while (d7 > 0 && d8 < Rows - 1 && _board[d7 - 1][d8 + 1] == myMove)
if (rowc >= 4 || colc >= 4 || d1c >= 4 || d2c >= 4)
return (myMove == piece.red) ? moveResult.redWin : moveResult.yellowWin;
return (_board.Where(x => x.Where(y => y == piece.empty).Any()).Any()) ? moveResult.noResult : moveResult.draw;