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")
예제 #2
0
파일: api.py 프로젝트: seyfig/BattleShip
 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)