def game_loop():
    """
    Game loop.
    """

    input(text.start)
    
    while True:
        
        dmap, discovered_map, pos_x, pos_y, treasure_number = init_game()

        is_player_alive = True
        is_treasure_collected = False

        total_treasure = treasure_number

        input(random.choice(text.go_to_dungeon))
        input(random.choice(text.enter_dungeon))
        
        dmap, discovered_map, pos_x, pos_y, treasure_number,\
        is_player_alive, is_treasure_collected = \
            enter_room(dmap, discovered_map, pos_x, pos_y, text.entrance, treasure_number,
            is_player_alive, is_treasure_collected)

        while is_player_alive and not is_treasure_collected:
            
            dmap, discovered_map, pos_x, pos_y, treasure_number,\
            is_player_alive, is_treasure_collected = \
                process_player_commands(dmap, discovered_map, pos_x, pos_y,
                treasure_number, is_player_alive, is_treasure_collected)

        if is_player_alive:
            input(random.choice(text.won))
        else:
            input(random.choice(text.lost))
     
            print(text.game_statistics.format(*[total_treasure - treasure_number, total_treasure]))

        map_generator.print_dungeon_map(dmap)
        print(text.end_map_description)

        user_input = input(text.play_again_prompt).lower()

        if user_input == 'y' or user_input == 'yes':
            continue
        elif user_input == 'n' or user_input == 'no':
            break

        user_input = input(text.play_again_hint).lower()

        if user_input != 'y' and user_input != 'yes':
            break
def process_player_commands(dmap, discovered_map, pos_x, pos_y,
                            treasure_number, is_player_alive,
                            is_treasure_collected):
    """
    Process player commands.
    """

    user_input = input(text.action_prompt).lower()

    while not user_input in actions.keys() and not user_input in actions.values():
        user_input = input(text.action_wrong).lower()
    
    if user_input == 'view map' or  user_input == actions['view map']:
        
        printed_map = copy.deepcopy(discovered_map)
        printed_map[pos_x][pos_y] = map_generator.tiles['player']
        map_generator.print_dungeon_map(printed_map)
        user_input = input(text.legend_prompt).lower()
        
        if user_input == 'l':
            input(text.legend)

    else:
        
        for direction in directions.keys():
        
            if (" ".join(['go', direction]) == user_input
                or actions["".join(['go ', direction])] == user_input):

                if map_generator.is_position_in_map(dmap,
                                      pos_x + directions[direction][0],
                                      pos_y + directions[direction][1]):
                    
                    pos_x += directions[direction][0]
                    pos_y += directions[direction][1]
                    
                    dmap, discovered_map, pos_x, pos_y, treasure_number,\
                    is_player_alive, is_treasure_collected = \
                               enter_room(dmap, discovered_map, pos_x, pos_y, direction_opposites[direction],
                               treasure_number, is_player_alive, is_treasure_collected)

                else:
                    print(random.choice(text.no_passage))

                break

    return dmap, discovered_map, pos_x, pos_y, treasure_number, is_player_alive, is_treasure_collected
示例#3
0
def game_loop():
    """
    Game loop.
    """

    while True:

        is_game_started = False

        is_player_alive = True
        treasure_collected = 0

        if os.path.isfile("./{}".format(SAVE_FILE_NAME)):

            logger.info(text.load_or_new_game_prompt)
            user_input = input().lower()

            if (user_input == "load"):

                dmap, discovered_map, pos_x, pos_y,\
                treasure_collected = load_game()

                treasure_number = map_generator.count_tiles_of_type(
                    dmap, 'treasure')

                is_game_started = True

                logger.info(random.choice(text.load_game_start))

                input()

                dmap, discovered_map, pos_x, pos_y, treasure_number,\
                treasure_collected, is_player_alive= \
                    enter_room(dmap, discovered_map, pos_x, pos_y,
                    random.choice(text.enter_room_wake_up), treasure_number,
                    treasure_collected, is_player_alive)

        if not is_game_started:

            logger.info(text.start)
            input()
            dmap, discovered_map, pos_x, pos_y, treasure_number = init_game()
            logger.debug("new game initialized")
            total_treasure = treasure_number

            logger.info(random.choice(text.go_to_dungeon))
            input()
            logger.info(random.choice(text.enter_dungeon))
            input()

            dmap, discovered_map, pos_x, pos_y, treasure_number,\
            treasure_collected, is_player_alive= \
                enter_room(dmap, discovered_map, pos_x, pos_y, text.entrance, treasure_number,
                treasure_collected, is_player_alive)

        while is_player_alive and treasure_number != 0:

            dmap, discovered_map, pos_x, pos_y, treasure_number,\
            treasure_collected, is_player_alive = \
                process_player_commands(dmap, discovered_map, pos_x, pos_y,
                treasure_number, treasure_collected, is_player_alive)

        input()

        if is_player_alive:
            logger.info(random.choice(text.won))
            logger.debug("player won")
        else:
            logger.info(random.choice(text.lost))
            logger.debug("player lost")

            logger.info(
                text.game_statistics.format(
                    *
                    [treasure_collected, treasure_collected +
                     treasure_number]))

        input()

        map_generator.print_dungeon_map(dmap)
        logger.info(text.end_map_description)

        input()

        logger.info(text.play_again_prompt)
        logger.debug("expecting play again confirmation input from user")
        user_input = input().lower()

        if user_input == 'y' or user_input == 'yes':
            logger.debug("user decides to play again")
            continue
        elif user_input == 'n' or user_input == 'no':
            logger.debug("user decides not to play again")
            break

        logger.info(text.play_again_hint)
        logger.debug("incorrect input from user")
        logger.debug("expecting play again confirmation input from user")
        user_input = input().lower()

        if user_input != 'y' and user_input != 'yes':
            logger.debug("user decides not to play again")
            break

        logger.debug("user decides to play again")
示例#4
0
def process_player_commands(dmap, discovered_map, pos_x, pos_y,
                            treasure_number, treasure_collected,
                            is_player_alive):
    """
    Process player commands.
    """

    logger.info(text.action_prompt)
    user_input = input().lower()

    while not user_input in actions.keys(
    ) and not user_input in actions.values():
        logger.info(text.action_wrong)
        logger.debug("user enters incorrect input")
        user_input = input().lower()

    if user_input == 'view map' or user_input == actions['view map']:

        logger.debug("player views map")
        printed_map = copy.deepcopy(discovered_map)
        printed_map[pos_x][pos_y] = map_generator.tiles['player']
        map_generator.print_dungeon_map(printed_map)
        logger.info(text.legend_prompt)
        user_input = input().lower()

        if user_input == 'l':
            logger.debug("player views legend")
            input(text.legend)

    elif user_input == 'save' or user_input == actions['save']:
        logger.debug("user attempts save game")
        save_game(dmap, discovered_map, pos_x, pos_y, treasure_collected)
        logger.info(random.choice(text.fall_asleep_1))
        logger.info(random.choice(text.fall_asleep_2))

    elif user_input == 'load' or user_input == actions['load']:
        logger.debug("user attempts load game")

        if os.path.isfile("./{}".format(SAVE_FILE_NAME)):

            dmap, discovered_map, pos_x, pos_y,\
            treasure_collected = load_game()

            logger.info(random.choice(text.load_game_ingame))

            dmap, discovered_map, pos_x, pos_y, treasure_number,\
            treasure_collected, is_player_alive = \
                enter_room(dmap, discovered_map, pos_x, pos_y,
                random.choice(text.enter_room_wake_up), treasure_number,
                treasure_collected, is_player_alive)
        else:
            logger.debug("no save file exist to load")
            logger.info(random.choice(text.no_save_file_ingame))

    else:

        for direction in directions.keys():

            if (" ".join(['go', direction]) == user_input
                    or actions["".join(['go ', direction])] == user_input):
                logger.debug("player attemots to go {} to".format(
                    direction, pos_x + directions[direction][0],
                    pos_y + directions[direction][1]))

                if map_generator.is_position_in_map(
                        dmap, pos_x + directions[direction][0],
                        pos_y + directions[direction][1]):

                    pos_x += directions[direction][0]
                    pos_y += directions[direction][1]


                    dmap, discovered_map, pos_x, pos_y, treasure_number,\
                    treasure_collected, is_player_alive = \
                               enter_room(dmap, discovered_map, pos_x, pos_y, direction_opposites[direction],
                               treasure_number, treasure_collected, is_player_alive)

                else:
                    logger.info(random.choice(text.no_passage))

                    logger.debug("player can't go {} to".format(
                        direction, pos_x + directions[direction][0],
                        pos_y + directions[direction][1]))

                break

    return dmap, discovered_map, pos_x, pos_y, treasure_number, treasure_collected, is_player_alive