def new_game(self, request): """Start a new game""" #Check if players have registered player1 = User.query(User.name == request.player1).get() if not player1: raise endpoints.ConflictException('Player 1 must register') player2 = User.query(User.name == request.player2).get() if not player2: raise endpoints.ConflictException('Player 2 must register') if player1 == player2: raise endpoints.ConflictException('Cannot play against oneself') #Create new game and put in datastore game = Game(player1=player1.key, player2=player2.key, playerTurn=player1.key, game_over=False ) game.put() #Create initial game board and set as ancestor of game boardId = Board.allocate_ids(size=1, parent=game.key)[0] boardKey = ndb.Key(Board, boardId, parent=game.key) board = Board(key=boardKey) board.put() game.state = boardKey game.put() return StringMessage(message="Game between {0} and {1} created! {2}".format(player1.name, player2.name, game.key))
def _updateGame(self, request): # Get updated board game = ndb.Key('Game', request.game).get() board = game.state.get() rows = [board.row1, board.row2, board.row3] spaces = [] for row in rows: for col in row: spaces.append(col) boardId = Board.allocate_ids(size=1, parent=game.key)[0] boardKey = ndb.Key(Board, boardId, parent=game.key) board = Board(row1=board.row1, row2=board.row2, row3=board.row3, key=boardKey) board.put() # Check for ties tie_count = 0 for item in spaces: if item == 'X' or item == 'O': tie_count += 1 if tie_count == 9: game.game_tie = True game.put() p1 = game.player1.get() p2 = game.player2.get() p1.ties += 1 p2.ties += 1 p1.put() p2.put() return BoardMessage(message="game is a tie") # Check for win if self._checkForWin(rows) == 1: game.game_over = True game.game_winner = game.player1 game.game_loser = game.player2 game.game_winner.get().wins += 1 game.game_winner.get().points += 3 game.game_loser.get().losses += 1 game.game_loser.get().points -= 1 game.put() game.game_winner.get().put() game.game_loser.get().put() return BoardMessage(message="Player 1 wins") elif self._checkForWin(rows) == 2: game.game_over = True game.game_winner = game.player2 game.game_loser = game.player1 game.game_winner.get().wins += 1 game.game_winner.get().points += 3 game.game_loser.get().losses += 1 game.game_loser.get().points -= 1 game.put() game.game_winner.get().put() game.game_loser.get().put() return BoardMessage(message="Player 2 wins") else: taskqueue.add(params={'email': game.playerTurn.get().email, 'gameState': str(self._printBoard(game.state.get())), 'gameNumber': request.game}, url='/tasks/send_reminder' ) return self._printBoard(game.state.get())