Module Module1 Dim BoardSquare(8, 8) As String, DupeBoard(8, 8) As String Dim Flipped(25, 2) As Integer Dim PlayerIcon As String = "X", AIIcon As String = "O" Dim HintsEnabled As Boolean = False, GameOver As Boolean = False Sub Main() Dim Quit As String Do Call StartGame() Console.WriteLine("Do You Wish To Continue (Y/N) : ") : Quit = Console.ReadLine() Loop Until LCase$(Quit) = "n" End Sub Sub StartGame() Call AssignArray() Randomize() Dim MoveCount As Integer = 1 Dim StartPlayer As String Dim StartNumber As Integer = CInt(Rnd() * 2) Do StartNumber = CInt(Rnd() * 2) If StartNumber = 1 Then StartPlayer = "Computer" ElseIf StartNumber = 2 Then StartPlayer = "Player" End If Loop Until StartNumber <> 0 Console.WriteLine(StartPlayer + " Makes The First Move") Do Call ShowBoard() If MoveCount + StartNumber Mod 2 = 0 Then Call GetAIMove() Call CheckWin(PlayerIcon) Call ShowBoard() Else Call GetPlayerMove() Call CheckWin(AIIcon) Call ShowBoard() End If MoveCount += 1 Loop Until GameOver = True End Sub Sub GetPlayerMove() Dim XMove, YMove As Integer Dim Input, Split1, Split2 As String Console.Write("Enter Your Move (1-8, A-H) : ") : Input = Console.ReadLine() Split1 = Left$(Input, 1) Split2 = Right$(Input, 1) YMove = CInt(Split1) XMove = Asc(Split2) - 96 'lcase the letter Console.WriteLine(XMove.ToString()) Console.ReadKey() If IsValidMove(XMove, YMove, PlayerIcon) <> 0 Then Call MakeMove(PlayerIcon, XMove, YMove) Else End If End Sub Sub GetAIMove() Randomize() Dim BestX, BestY, BestScore, ScoreHolder As Integer Dim RndChoice, BestOrRnd As Integer 'Determines the best scoring move for the computer 'Allow rnd choice of valid moves so computer wont always win? ' BestOrRnd = CInt(Rnd() * 2) If BestOrRnd = 1 Then Call GetValidMoves(AIIcon) For i As Integer = 1 To 8 For j As Integer = 1 To 8 If DupeBoard(i, j) = "*" Then ScoreHolder = IsValidMove(i, j, AIIcon) If ScoreHolder > BestScore Then BestScore = ScoreHolder BestX = i BestY = j End If End If Next Next Call MakeMove(AIIcon, BestX, BestY) Else Do RndChoice = CInt(Rnd() * UBound(Flipped)) Loop Until Flipped(RndChoice, 1) <> vbNull Call MakeMove(AIIcon, Flipped(RndChoice, 1), Flipped(RndChoice, 2)) End If End Sub Sub MakeMove(ByVal Icon As String, ByVal XCord As Integer, ByVal YCord As Integer) Dim Count As Integer = 1 If IsValidMove(XCord, YCord, Icon) <> 0 Then BoardSquare(XCord, YCord) = Icon While Flipped(Count, 1) <> vbNull BoardSquare(Flipped(Count, 1), Flipped(Count, 2)) = Icon Count += 1 End While End If End Sub Sub GetValidMoves(ByVal Icon As String) For i As Integer = 1 To 8 For j As Integer = 1 To 8 DupeBoard(i, j) = " " Next Next For i As Integer = 1 To 8 For j As Integer = 1 To 8 If IsValidMove(i, j, Icon) <> 0 Then DupeBoard(i, j) = "*" End If Next Next End Sub Sub CopyDupeBoard() For i As Integer = 1 To 8 For j As Integer = 1 To 8 If DupeBoard(i, j) <> "*" Then DupeBoard(i, j) = BoardSquare(i, j) End If Next Next End Sub Function IsValidMove(ByVal XCord As Integer, ByVal YCord As Integer, ByVal Icon As String) As Integer Dim EnemyIcon As String Dim Moves(16) As Integer Dim XStart, YStart, YCordTemp, XCordTemp As Integer Dim Count As Integer For rowcount As Integer = 1 To 25 For colcount As Integer = 1 To 2 Flipped(rowcount, colcount) = vbNull Next Next If BoardSquare(YCord, XCord) <> " " Or IsOnBoard(YCord, XCord) = False Then 'Error Message Invalid Move 'Return False End If XStart = XCord YStart = YCord BoardSquare(XCord, YCord) = Icon If Icon = "X" Then EnemyIcon = "O" Else EnemyIcon = "X" End If ' Moves(Odd) Increases X Moves(Even) Increases Y Moves(1) = 1 Moves(2) = 0 Moves(3) = 1 Moves(4) = 1 Moves(5) = 0 Moves(6) = 1 Moves(7) = -1 Moves(8) = 1 Moves(9) = -1 Moves(10) = 0 Moves(11) = -1 Moves(12) = -1 Moves(13) = 0 Moves(14) = -1 Moves(15) = 1 Moves(16) = -1 Count = 1 For i As Integer = 1 To 8 XCordTemp = XCord + Moves((i * 2) - 1) YCordTemp = YCord + Moves(i * 2) While IsOnBoard(XCordTemp, YCordTemp) = True AndAlso BoardSquare(XCordTemp, YCordTemp) = EnemyIcon XCordTemp = XCordTemp + Moves(((i * 2) - 1)) YCordTemp = YCordTemp + Moves((i * 2)) If IsOnBoard(XCordTemp, YCordTemp) = False Then Exit While End If If BoardSquare(XCordTemp, YCordTemp) = Icon Then While True XCordTemp -= Moves((i * 2) - 1) YCordTemp -= Moves(i * 2) If XCordTemp = XStart And YCordTemp = YStart Then Exit While End If Flipped(Count, 1) = XCordTemp 'Assigns values for all flipped pieces Flipped(Count, 2) = YCordTemp Count += 1 End While End If End While Next BoardSquare(XCord, YCord) = " " If Count <> 1 Then Return Count Else Return 0 End If End Function Sub GameScore() Dim XScore As Integer = 0 Dim OScore As Integer = 0 For i As Integer = 1 To 8 For j As Integer = 1 To 8 If BoardSquare(i, j) = "X" Then XScore += 1 ElseIf BoardSquare(i, j) = "O" Then OScore += 1 End If Next Next Console.WriteLine() Console.WriteLine("Computer : {0} Player : {1} ", XScore, OScore) End Sub Sub CheckWin(ByVal Icon As String) Call GetValidMoves(Icon) For i As Integer = 1 To 8 For j As Integer = 1 To 8 If DupeBoard(i, j) = "*" Then GameOver = False End If Next Next GameOver = True End Sub Sub ShowBoard() Dim HLine As String = " +--+--+--+--+--+--+--+--+ " Console.Write(" A B C D E F G H") Console.WriteLine() If HintsEnabled = False Then For i As Integer = 1 To 8 Console.WriteLine(HLine) For j As Integer = 1 To 1 Console.Write(i.ToString() + " ") Console.Write("|" + BoardSquare(1, i) + " |" + BoardSquare(2, i) + " |" + BoardSquare(3, i) + " |" + _ BoardSquare(4, i) + " |" + BoardSquare(5, i) + " |" + BoardSquare(6, i) + " |" + _ BoardSquare(7, i) + " |" + BoardSquare(8, i) + " |") Next Console.WriteLine() Next ElseIf HintsEnabled = True Then For i As Integer = 1 To 8 Console.WriteLine(HLine) For j As Integer = 1 To 1 Console.Write(i.ToString() + " ") Console.Write("|" + DupeBoard(1, i) + " |" + DupeBoard(2, i) + " |" + DupeBoard(3, i) + " |" + _ DupeBoard(4, i) + " |" + DupeBoard(5, i) + " |" + DupeBoard(6, i) + " |" + _ DupeBoard(7, i) + " |" + DupeBoard(8, i) + " |") Next Console.WriteLine() Next End If Console.WriteLine(HLine) Call GameScore() End Sub Sub AssignArray() For i As Integer = 1 To 8 For j As Integer = 1 To 8 BoardSquare(i, j) = (" ") Next Next BoardSquare(5, 5) = "X" BoardSquare(4, 4) = "X" BoardSquare(4, 5) = "O" BoardSquare(5, 4) = "O" End Sub Function IsOnBoard(ByVal XCord As Integer, ByVal YCord As Integer) As Boolean If YCord > 8 Or YCord < 0 Or XCord > 8 Or XCord < 0 Then Return False IsOnBoard = False Else Return True IsOnBoard = True End If End Function End Module