def cancel_game(self, request): """ Cancels a game from it's urlsafe key """ game = get_by_urlsafe(request.urlsafe_game_key, Game) if not game: raise endpoints.NotFoundException("Game not found") if not game.game_over and not game.canceled: game.canceled = True msg = "Game canceled" hist = History() hist.guess = "-1" hist.message = msg print hist game.history.append(hist) game.put() return game.to_form(msg) else: return game.to_form("You cannot cancel a game that is already over")
def _make_move(self, game, user, at_position, p): try: history = History(parent=game.key) history.user = user.key history.guess = p.coordinate history.turn = game.turn if game.player1_turn: history.player_turn = 1 else: history.player_turn = 2 if at_position <= 0: message = 'Miss!' history.result = 'miss' history.put() game.set_fired(user, p.d) game.put() else: message = "Hit!" history.result = 'hit' ships_query = Ship.query(ancestor=game.key) filter_query = ndb.query.FilterNode('user', '=', user.key) ships_query1 = ships_query.filter(filter_query) filter_query = ndb.query.FilterNode('type', '=', at_position) ships_query2 = ships_query1.filter(filter_query) ship = ships_query2.get() if not ship: filter_query = ndb.query.FilterNode( 'type', '=', str(at_position)) ships_query3 = ships_query1.filter(filter_query) ship = ships_query3.get() ship.hits += 1 game.set_fired(user, p.d) if(ship.is_sank()): message += " Ship %s sank" % ShipType(at_position) game.sink_ship(user, at_position) history.put() ship.put() game.put() except ValueError as e: raise endpoints.BadRequestException(e) return game.to_form(message)
def make_guess(self, request): """ Guess a letter for the word to guess in a game. A letter can only be guessed once. Returns a game form with a list of characters that have been guessed and a list with letters in the correct place for the word. """ game = get_by_urlsafe(request.urlsafe_game_key, Game); if not game: raise endpoints.NotFoundException("Game not found!") if game.game_over: return game.to_form("Game is already over!") if request.guess not in string.ascii_letters: raise endpoints.BadRequestException("Guess must be a letter!") if len(request.guess) > 1: raise endpoints.BadRequestException("You can only guess a single letter!") if string.upper(request.guess) in game.guesses: raise endpoints.BadRequestException("You cannot guess the same letter twice!") game.guesses.append(string.upper(request.guess)) hist = History() hist.guess = string.upper(request.guess) if string.upper(request.guess) in string.upper(game.word_to_guess): msg = "Good Guess!" index = string.find(string.upper(game.word_to_guess), string.upper(request.guess)) while index is not -1: game.correct_guesses[index] = string.upper(request.guess) index = string.find(string.upper(game.word_to_guess), string.upper(request.guess), index + 1) if "".join(game.correct_guesses) == string.upper(game.word_to_guess): user = game.user.get() user.games_won += 1 user.win_percentage = (user.games_won / user.games_won + user.games_lost) * 100 user.put() msg = "Game Won!" hist.message = msg game.history.append(hist) game.put() game.end_game(True) return game.to_form(msg) else: msg = "Try Again!" game.attempts_remaining -= 1 if game.attempts_remaining < 1: game.end_game(False) user = game.user.get() if user is not None: user.games_lost += 1 user.win_percentage = user.games_won / user.games_won + user.games_lost user.put() msg = "Game Over" else: return game.to_form("Could not find User associated with game.") hist.message = msg game.history.append(hist) game.put() return game.to_form(msg)