/* methods. */ public void Start() { InitBoard(); /* init score. */ board.SetScore(1, 0); board.SetScore(2, 0); /* init player tiles. */ Piece p1 = new Piece(4, 3, player1); Piece p2 = new Piece(3, 4, player1); Piece p3 = new Piece(3, 3, player2); Piece p4 = new Piece(4, 4, player2); board.AddPiece(p1); board.AddPiece(p2); board.AddPiece(p3); board.AddPiece(p4); state = GameState.waitPlayer; currentPlayer = player1; /* set bots boards. */ player1.SetBoard(board); player2.SetBoard(board); /* launch the thread that will let the 2 bots to play. */ botThread = new Thread(new ParameterizedThreadStart(BotPlay)); botThread.Start(cancelToken); }
private void BotPlay(object token) { Console.WriteLine("[CCGame] worker thread started!"); CancellationTokenSource cancelToken = (CancellationTokenSource)token; lastMove = null; while (board.IsFinished(currentPlayer) == false && state != GameState.stopped && cancelToken.IsCancellationRequested != true) { /* let the current player play. */ currentPlayer.SetBoard(board); Thread.Sleep(1000); /* obtain move. */ Piece move = currentPlayer.MakeMove(); /* print new move. */ //Console.WriteLine("Player:" + currentPlayer.GetColor().ToString() + " moved " + move.X + ":" + move.Y); /* modify board. */ pieceMutex.WaitOne(); board.AddPiece(move); List <Piece> neigh = board.GetPieceNeighbors(move); foreach (Piece n in neigh) { board.AddPiece(move, n); } lastMove = move; /* release board mutex. */ pieceMutex.ReleaseMutex(); /**/ if (currentPlayer.GetType() == typeof(MCTSPlayer)) { currentPlayer.SetBoard(board); } /* set next player. */ if (currentPlayer == player1) { currentPlayer = player2; } else { currentPlayer = player1; } // Hopefully, one day, you will get rid of this call. GC.Collect(); } state = GameState.stopped; Console.WriteLine("[CCGame] Game thread exit!"); }