Esempio n. 1
0
def game(x, y, map, gold):
    gold_collect = 0
    wumpus_kill = 0
    score = 0
    player_x = x  # Column
    player_y = y  # Row
    model = player_right
    direction = 'RIGHT'
    path = np.zeros((size, size))
    knight = Agent((y, x))
    knight.SetMaze(map)

    running = True
    while running:
        pygame.time.delay(50)

        screen.fill(black)
        screen.blit(background, (0, 0))
        draw_text("Hunt", font1, lemon, screen, size * 75 + 70, size - 10)
        draw_text("the", font2, lemon, screen, size * 75 + 100, size + 100)
        draw_text("WUMPUS", font3, red_ferrari, screen, size * 75 + 20,
                  size + 170)
        draw_text("Score:", font4, lemon, screen, size * 75 + 70, size + 400)
        draw_text(str(score), font5, black, screen, size * 75 + 290,
                  size + 410)
        generate_object(wumpus_big, size * 75 + 320, size)

        for col in range(size):
            for row in range(size):
                generate_object(floor, col * 75, row * 75)
                generate_object(entrance1, x * 75, y * 75)

                if path[row][col] != 1 and map[row][col].find('A') == -1:
                    generate_object(fog, col * 75, row * 75)
                else:
                    if map[row][col].find('G') != -1:
                        generate_object(gold, col * 75 + 20, row * 75 + 20)
                    if map[row][col].find('B') != -1:
                        generate_object(wind, col * 75 + 15, row * 75 + 10)
                    if map[row][col].find('S') != -1:
                        generate_object(smell, col * 75 + 40, row * 75 + 10)
                    if map[row][col].find('W') != -1:
                        generate_object(wumpus, col * 75 + 5, row * 75 + 5)
                    if map[row][col].find('P') != -1:
                        generate_object(hole, col * 75, row * 75)

                if map[row][col].find('A') != -1:
                    generate_object(model, player_x * 75 + 20,
                                    player_y * 75 + 20)

        if map[player_y][player_x].find(
                'W') != -1 or map[player_y][player_x].find('P') != -1:
            score -= 10000
            game_over(wumpus_kill, gold_collect, score)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        command = knight.GetActions()

        if command == 'LEFT' or command == 'RIGHT' or command == 'DOWN' or command == 'UP':
            if direction == command:
                command = knight.GetActions()
            else:
                direction = command
                if command == 'LEFT':
                    model = player_left
                elif command == 'RIGHT':
                    model = player_right
                elif command == 'UP':
                    model = player_up
                elif command == 'DOWN':
                    model = player_down
        if command == 'GO':
            score -= 10
            if direction == 'LEFT':
                if player_x - 1 >= 0:
                    player_x -= 1
                    map[player_y][player_x] += 'A'
                    oldstr = map[player_y][player_x + 1]
                    map[player_y][player_x + 1] = oldstr.replace('A', '')
                    path[player_y][player_x + 1] = 1
            elif direction == 'RIGHT':
                if player_x + 1 < size:
                    player_x += 1
                    map[player_y][player_x] += 'A'
                    oldstr = map[player_y][player_x - 1]
                    map[player_y][player_x - 1] = oldstr.replace('A', '')
                    path[player_y][player_x - 1] = 1
            elif direction == 'DOWN':
                if player_y + 1 < size:
                    player_y += 1
                    map[player_y][player_x] += 'A'
                    oldstr = map[player_y - 1][player_x]
                    map[player_y - 1][player_x] = oldstr.replace('A', '')
                    path[player_y - 1][player_x] = 1
            elif direction == 'UP':
                if player_y - 1 >= 0:
                    player_y -= 1
                    map[player_y][player_x] += 'A'
                    oldstr = map[player_y + 1][player_x]
                    map[player_y + 1][player_x] = oldstr.replace('A', '')
                    path[player_y + 1][player_x] = 1
            knight.SetNewRoom((player_y, player_x))

        elif command == 'SHOT':
            score -= 100
            wp_x, wp_y = -1, -1
            if direction == 'LEFT':
                if map[player_y][player_x - 1].find('W') != -1:
                    wp_x = player_x - 1
                    wp_y = player_y
                    oldstr = map[wp_y][wp_x]
                    map[wp_y][wp_x] = oldstr.replace('W', '-')
                    path[wp_y][wp_x] = 1
                    if wp_y - 1 >= 0:
                        # Wumpus's left cell
                        oldstr = map[wp_y - 1][wp_x]
                        map[wp_y - 1][wp_x] = oldstr.replace('S', '-')
                    if wp_y + 1 < size:
                        # Wumpus's right cell
                        oldstr = map[wp_y + 1][wp_x]
                        map[wp_y + 1][wp_x] = oldstr.replace('S', '-')
                    if wp_x - 1 >= 0:
                        # Wumpus's upper cell
                        oldstr = map[wp_y][wp_x - 1]
                        map[wp_y][wp_x - 1] = oldstr.replace('S', '-')
                    if wp_x + 1 < size:
                        # Wumpus's lower cell
                        oldstr = map[wp_y][wp_x + 1]
                        map[wp_y][wp_x + 1] = oldstr.replace('S', '-')
                    knight.SetNewRoom((wp_y, wp_x))
                    wumpus_kill += 1
            elif direction == 'RIGHT':
                if map[player_y][player_x + 1].find('W') != -1:
                    wp_x = player_x + 1
                    wp_y = player_y
                    oldstr = map[wp_y][wp_x]
                    map[wp_y][wp_x] = oldstr.replace('W', '-')
                    path[wp_y][wp_x] = 1
                    if wp_y - 1 >= 0:
                        # Wumpus's left cell
                        oldstr = map[wp_y - 1][wp_x]
                        map[wp_y - 1][wp_x] = oldstr.replace('S', '-')
                    if wp_y + 1 < size:
                        # Wumpus's right cell
                        oldstr = map[wp_y + 1][wp_x]
                        map[wp_y + 1][wp_x] = oldstr.replace('S', '-')
                    if wp_x - 1 >= 0:
                        # Wumpus's upper cell
                        oldstr = map[wp_y][wp_x - 1]
                        map[wp_y][wp_x - 1] = oldstr.replace('S', '-')
                    if wp_x + 1 < size:
                        # Wumpus's lower cell
                        oldstr = map[wp_y][wp_x + 1]
                        map[wp_y][wp_x + 1] = oldstr.replace('S', '-')
                    knight.SetNewRoom((wp_y, wp_x))
                    wumpus_kill += 1
            elif direction == 'UP':
                if map[player_y - 1][player_x].find('W') != -1:
                    wp_x = player_x
                    wp_y = player_y - 1
                    oldstr = map[wp_y][wp_x]
                    map[wp_y][wp_x] = oldstr.replace('W', '-')
                    path[wp_y][wp_x] = 1
                    if wp_y - 1 >= 0:
                        # Wumpus's left cell
                        oldstr = map[wp_y - 1][wp_x]
                        map[wp_y - 1][wp_x] = oldstr.replace('S', '-')
                    if wp_y + 1 < size:
                        # Wumpus's right cell
                        oldstr = map[wp_y + 1][wp_x]
                        map[wp_y + 1][wp_x] = oldstr.replace('S', '-')
                    if wp_x - 1 >= 0:
                        # Wumpus's upper cell
                        oldstr = map[wp_y][wp_x - 1]
                        map[wp_y][wp_x - 1] = oldstr.replace('S', '-')
                    if wp_x + 1 < size:
                        # Wumpus's lower cell
                        oldstr = map[wp_y][wp_x + 1]
                        map[wp_y][wp_x + 1] = oldstr.replace('S', '-')
                    knight.SetNewRoom((wp_y, wp_x))
                    wumpus_kill += 1
            elif direction == 'DOWN':
                if map[player_y + 1][player_x].find('W') != -1:
                    wp_x = player_x
                    wp_y = player_y + 1
                    oldstr = map[wp_y][wp_x]
                    map[wp_y][wp_x] = oldstr.replace('W', '-')
                    path[wp_y][wp_x] = 1
                    if wp_y - 1 >= 0:
                        # Wumpus's left cell
                        oldstr = map[wp_y - 1][wp_x]
                        map[wp_y - 1][wp_x] = oldstr.replace('S', '-')
                    if wp_y + 1 < size:
                        # Wumpus's right cell
                        oldstr = map[wp_y + 1][wp_x]
                        map[wp_y + 1][wp_x] = oldstr.replace('S', '-')
                    if wp_x - 1 >= 0:
                        # Wumpus's upper cell
                        oldstr = map[wp_y][wp_x - 1]
                        map[wp_y][wp_x - 1] = oldstr.replace('S', '-')
                    if wp_x + 1 < size:
                        # Wumpus's lower cell
                        oldstr = map[wp_y][wp_x + 1]
                        map[wp_y][wp_x + 1] = oldstr.replace('S', '-')
                    knight.SetNewRoom((wp_y, wp_x))
                    wumpus_kill += 1
        elif command == 'TAKE GOLD':
            if map[player_y][player_x].find('G') != -1:
                score += 100
                gold_collect += 1
                oldstr = map[player_y][player_x]
                map[player_y][player_x] = oldstr.replace('G', '-')
        elif command == 'CLIMB UP':
            score += 10
            draw_text("You won!", font1, red_ferrari, screen, size * 75 + 70,
                      size + 500)
            game_over(wumpus_kill, gold_collect, score)

        for col in range(size):
            for row in range(size):
                if map[row][col].find('W') != -1:
                    if row - 1 >= 0:
                        map[row -
                            1][col] += 'S' if 'S' not in map[row -
                                                             1][col] else ''
                    if row + 1 < size:
                        map[row +
                            1][col] += 'S' if 'S' not in map[row +
                                                             1][col] else ''
                    if col - 1 >= 0:
                        map[row][col -
                                 1] += 'S' if 'S' not in map[row][col -
                                                                  1] else ''
                    if col + 1 < size:
                        map[row][col +
                                 1] += 'S' if 'S' not in map[row][col +
                                                                  1] else ''
        knight.SetMaze(map)

        # Print KB
        print('---------------------------------------')
        print(command)
        knight.PrintKB()
        print('Score: {0}'.format(score))

        pygame.display.update()
        mainClock.tick(240)
        time.sleep(2)