/// <summary> /// オセロの初期状態として盤を生成 /// </summary> /// <returns></returns> public static ReversiBoard InitBoard() { var res = new ReversiBoard() { //オセロの初期状態 black = 0x0000000810000000, white = 0x0000001008000000 }; return(res); }
/// <summary> /// 盤の情報をもとに思考し、次の手を返す /// </summary> /// <param name="board"></param> /// <param name="player"></param> /// <returns></returns> public Reversi.Core.ReversiMove Think(ReversiBoard board, StoneType player) { this.board = board; this.player = player; legalMoves = board.SearchLegalMoves(player); //合法手 if (legalMoves.Count == 0) { throw new InvalidOperationException("合法手がありません"); } else { var best = 0; var bestMove = default(ReversiMove); foreach (var item in board.SearchLegalMoves(player)) { var child = board.AddStone(item.Row, item.Col, player); switch (player) { case StoneType.None: break; case StoneType.Sente: if (best < child.NumOfBlack()) { best = child.NumOfBlack(); bestMove = item; } break; case StoneType.Gote: if (best < child.NumOfWhite()) { best = child.NumOfWhite(); bestMove = item; } break; default: break; } } return(bestMove); } }
/// <summary> /// 文字列から記録を生成 /// </summary> /// <param name="record"></param> /// <returns></returns> public static MatchRecord FromRecordString(string record) { MatchRecord res = new MatchRecord(); var array = record.Split('\n'); foreach (var bits in array) { if (bits == "") { break; } var bitArray = bits.Split('|'); var bl = Convert.ToUInt64(bitArray[0], 2); var wh = Convert.ToUInt64(bitArray[1], 2); var board = new ReversiBoard(bl, wh); res.Boards.Add(board); } return(res); }
/// <summary> /// 石を打つ /// </summary> /// <param name="row"></param> /// <param name="col"></param> /// <param name="player"></param> /// <returns></returns> public ReversiBoard AddStone(int row, int col, StoneType player) { this.player = player; ulong pl = 0; ulong opp = 0; switch (this.player) { case StoneType.None: break; case StoneType.Sente: pl = black; opp = white; break; case StoneType.Gote: pl = white; opp = black; break; default: break; } ulong mov = (ulong)1 << (8 * row + col); var rev = Reverse(pl, opp, mov, Right) | Reverse(pl, opp, mov, Left) | Reverse(pl, opp, mov, Up) | Reverse(pl, opp, mov, Down) | Reverse(pl, opp, mov, UpRight) | Reverse(pl, opp, mov, UpLeft) | Reverse(pl, opp, mov, DownRight) | Reverse(pl, opp, mov, DownLeft); if (rev != 0) { pl ^= mov | rev; opp ^= rev; ReversiBoard board = new ReversiBoard(); switch (player) { case StoneType.Sente: board.black = pl; board.white = opp; break; case StoneType.Gote: board.black = opp; board.white = pl; break; default: break; } return(board); } else { throw new ArgumentException("非合法手です"); } }