def testNpc(self): B = Board(7, 7) B.Set(1, 1, 1) C = NPC(B) for i in range(1, 500): C.FirstMove() x, y, v = B.Moves[1][0], B.Moves[1][1], B.Moves[1][2] self.assertTrue([x, y] != [1, 1]) self.assertTrue(x >= 0) self.assertTrue(x < 7) self.assertTrue(y >= 0) self.assertTrue(y < 7) B.Set(x, y, 0, True) self.assertEqual(C.hScore(1, 1, 1), 1) B.Set(1, 2, 1) self.assertEqual(C.hScore(1, 1, 1), 2) B.Set(1, 3, 1) self.assertEqual(C.hScore(1, 1, 1), 3) B.Set(1, 4, 1) self.assertEqual(C.hScore(1, 1, 1), 4) B.Set(1, 5, 1) self.assertEqual(C.hScore(1, 1, 1), 5) # Same idea applies for vScore, d1Score, d2Score, therefore we assume that if this works then those work as well # Checking the defense B.Set(1, 5, 0, True) B.Set(1, 4, 0, True) x, y = C.FindBlockMove() self.assertEqual(x, 1) self.assertEqual(y, 0) # Checking the offensive B.Set(2, 1, -1) B.Set(2, 2, -1) B.Set(2, 3, -1) x, y, v = C.FindBestMove() self.assertEqual(x, 2) self.assertEqual(y, 0) self.assertEqual(v, 4)
class GameService: def __init__(self, board): self.Board = board self.Computer = NPC(self.Board) def PlacePiece( self, X, Y ): # Every time the player places a piece the computer must also place a piece self.Board.Set(X, Y, 1) if self.CheckForWinner() == True: return True if len( self.Board.Moves ) == self.Board.Size.Width * self.Board.Size.Height: # No more moves left case return 0 self.ComputerTurn() if self.CheckForWinner() == True: return False if len( self.Board.Moves ) == self.Board.Size.Width * self.Board.Size.Height: # No more moves left case return 0 return None def ComputerTurn(self): # Might have different cases for the first move if self.Computer.FirstMoved == False: self.Computer.FirstMove() else: self.Computer.Move() def CheckForWinner( self ): # Function which checks if the game is over by searching for lines of length 5 for Piece in [-1, 1]: for i in range(self.Board.Size.Height): for j in range(self.Board.Size.Width): if self.Board.Get(i, j) == Piece: if self.hWin(Piece, i, j) or self.vWin( Piece, i, j) or self.dWin1( Piece, i, j) or self.dWin2(Piece, i, j): return True return False def hWin(self, Piece, i, j): # Search for horizontal lines for k in range(j, j + 5): if self.Board.Get(i, k) != Piece: return False return True def vWin(self, Piece, i, j): # Search for vertical lines for k in range(i, i + 5): if self.Board.Get(k, j) != Piece: return False return True def dWin1(self, Piece, i, j): # Search for diagonal lines for k in range(5): if self.Board.Get(i + k, j + k) != Piece: return False return True def dWin2(self, Piece, i, j): # Search for diagonal lines for k in range(5): if self.Board.Get(i + k, j - k) != Piece: return False return True