/// <summary> /// Pc VS Pc /// </summary> /// <returns> </returns> public void StartGameWithPc(Board board) { int countmovesforDraw = 0; var rule = new Rules(); var print = new PrintBoardState(); int depth; Coordinate srcCoord = new Coordinate(); Coordinate destCoord = new Coordinate(); //Create the file engine who Read\write to file all moves FileEngine file = new FileEngine(); //define that file will be created in the root folder under the name sync.txt string path = "sync.txt"; //define colors. Console.WriteLine("Opponent color is white? [Yes/No]"); Opponet: string opponentColor = Console.ReadLine(); if (!(opponentColor == "Yes" || opponentColor == "yes" || opponentColor == "No" || opponentColor == "no")) { Console.WriteLine("Invalid input,please try again"); goto Opponet; } Player oppColor = (opponentColor == "Yes" || opponentColor == "yes") ? Player.White : Player.Black; Player pcColor = oppColor == Player.White ? Player.Black : Player.White; //define who starts. Console.WriteLine("Opponent Starts? [Yes/No]"); Start: string opponentStarts = Console.ReadLine(); if ( !(opponentStarts == "Yes" || opponentStarts == "yes" || opponentStarts == "No" || opponentStarts == "no")) { Console.WriteLine("Invalid input,please try again"); goto Start; } if (opponentStarts == "Yes" || opponentStarts == "yes") goto OppTurn; goto MyTurn; //oppoenent tuen OppTurn: try { //open file in path with read permision and no sharing using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None)) { ShowPlayerChange(oppColor); Player color = Player.None; bool capMove = false; IList<Coordinate> oppMove = new List<Coordinate>(); //read moves and captures (if exists) while (oppMove.Count == 0) { oppMove = file.ReadFromFile(stream, board, path, out color); } //Source srcCoord = oppMove.First(); oppMove.RemoveAt(0); //Destination destCoord = oppMove[0]; oppMove.RemoveAt(0); //Captures list var capturesOppdid = oppMove; //if move is not oppoent move or source piece is not opponenet color return to read file if ((color != oppColor) || (board.GetPlayer(srcCoord) != oppColor)) { goto OppTurn; } //Find captures IDictionary<IList<Coordinate>, IList<Coordinate>> capturesAvailable = rule.FindCaptures(board, oppColor); if (capturesAvailable.Count > 0) { var boolean = rule.MapContainsCoordsOfCaptures(capturesAvailable, srcCoord, destCoord, capturesOppdid); if (!boolean) { Console.WriteLine("You must capture maximum opponent soldiers on board"); goto OppTurn; } else { foreach (var coordinate in capturesOppdid) { board[coordinate.X, coordinate.Y].Status = Piece.None; board.UpdateCapturedSoldiers(coordinate, pcColor); capMove = true; } } } if (capMove || rule.IsValidMove(board, srcCoord, destCoord, oppColor)) { board.UpdateBoard(srcCoord, destCoord); rule.IsBecameAKing(board, board[destCoord.X, destCoord.Y]); print.DrawBoard(board); } else { Console.WriteLine("This is not a valid move, please enter again"); goto OppTurn; } //check if game has been determined GameState game = GetGameState(oppColor, board); if (GameState.Draw == CheckDraw(board, board[destCoord.X, destCoord.Y], capMove, ref countmovesforDraw)) { Console.WriteLine("Draw"); return; } if (game == GameState.Lost) { Console.WriteLine("{0} Lost the game and {1} won", oppColor.ToString(), pcColor.ToString()); return; } if (game == GameState.Won) { Console.WriteLine("{0} Won", oppColor.ToString()); return; } } } catch (Exception) { goto OppTurn; } //local turn MyTurn: try { using (var stream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { ShowPlayerChange(pcColor); var alphaBeta = new Alphabeta(); Board temp = new Board(); IList<Coordinate> tempCaptures = new List<Coordinate>(); depth = rule.DefineDepth(board); alphaBeta.AlphaBeta(board, depth, Int32.MinValue, Int32.MaxValue, pcColor, true, ref srcCoord, ref destCoord, ref temp, ref tempCaptures); if ((rule.InBounds(board, srcCoord.X, srcCoord.Y)) && (rule.InBounds(board, destCoord.X, destCoord.Y))) { board = temp.Copy(); print.DrawBoard(board); } //write move to file file.WriteToFile(stream, srcCoord, destCoord, tempCaptures, path, pcColor); //check if game has been determined bool pcCaptured = tempCaptures.Count > 0; GameState game = GetGameState(oppColor, board); if (GameState.Draw == CheckDraw(board, board[destCoord.X, destCoord.Y], pcCaptured, ref countmovesforDraw)) { Console.WriteLine("Draw"); return; } if (game == GameState.Lost) { Console.WriteLine("{0} Lost the game and {1} won", oppColor.ToString(), pcColor.ToString()); return; } if (game == GameState.Won) { Console.WriteLine("{0} Won", oppColor.ToString()); return; } } Thread.Sleep(5000); goto OppTurn; } catch (Exception) { goto MyTurn; } }