Untitled

mail@pastecode.io avatar
unknown
plain_text
17 days ago
6.7 kB
2
Indexable
Never
int main() {
    // Create the main window
    sf::RenderWindow window(sf::VideoMode(CELL_SIZE * MAP_WIDTH * SCREEN_RESIZE, (FONT_HEIGHT + CELL_SIZE * MAP_HEIGHT) * SCREEN_RESIZE), "Pac-Man", sf::Style::Close);
    window.setView(sf::View(sf::FloatRect(0, 0, CELL_SIZE * MAP_WIDTH, FONT_HEIGHT + CELL_SIZE * MAP_HEIGHT)));

    // Create the menu
    Menu menu(window.getSize().x, window.getSize().y);

    bool inMenu = true;
    bool game_won = 0;
    unsigned lag = 0;
    unsigned char level = 0;
    std::array<std::string, MAP_HEIGHT> map_sketch;
    freopen("map.txt", "r", stdin);
    for (int i = 0; i < MAP_HEIGHT; ++i) {
        std::string s;
        std::cin >> s;
        std::cout << s << "\n";
        map_sketch.at(i).assign(s);
    }
    std::array<std::array<Cell, MAP_HEIGHT>, MAP_WIDTH> map;
    std::array<Position, 4> ghost_positions;
    sf::Event event;
    GhostManager ghost_manager;
    Pacman pacman;
    srand(static_cast<unsigned>(time(0)));
    map = convert_sketch(map_sketch, ghost_positions, pacman, 0);
    ghost_manager.reset(level, ghost_positions);
    auto previous_time = std::chrono::steady_clock::now();

    while (window.isOpen()) {
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }

            if (inMenu) {
                if (event.type == sf::Event::KeyPressed) {
                    if (event.key.code == sf::Keyboard::Up) {
                        menu.MoveUp();
                    } else if (event.key.code == sf::Keyboard::Down) {
                        menu.MoveDown();
                    } else if (event.key.code == sf::Keyboard::Return) {
                        int selectedItem = menu.GetPressedItem();
                        if (selectedItem == 0) {
                            inMenu = false; // Start the game
                        } else if (selectedItem == 1) {
                            // Show tutorial
                            std::cout << "Tutorial: Use arrow keys to move Pac-Man. Use the mouse to modify the maze." << std::endl;
                        } else if (selectedItem == 2) {
                            window.close(); // Quit the game
                        }
                    }
                }
            } else {
                // Handle game events and logic
                if (event.type == sf::Event::Closed) {
                    window.close();
                }
            }
        }

        if (!inMenu) {
            unsigned delta_time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - previous_time).count();
            lag += delta_time;
            previous_time += std::chrono::microseconds(delta_time);

            while (FRAME_DURATION <= lag) {
                lag -= FRAME_DURATION;

                while (window.pollEvent(event)) {
                    switch (event.type) {
                        case sf::Event::Closed: {
                            window.close();
                            break;
                        }
                    }
                }

                if (!game_won && !pacman.get_dead()) {
                    game_won = 1;
                    pacman.update(level, map);
                    ghost_manager.update(level, map, pacman);

                    for (const std::array<Cell, MAP_HEIGHT>& column : map) {
                        for (const Cell& cell : column) {
                            if (Cell::Pellet == cell) {
                                game_won = 0;
                                break;
                            }
                        }
                        if (!game_won) break;
                    }

                    if (game_won) pacman.set_animation_timer(0);
                } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return)) {
                    game_won = 0;
                    if (pacman.get_dead()) level = 0;
                    else level++;
                    map = convert_sketch(map_sketch, ghost_positions, pacman, 0);
                    ghost_manager.reset(level, ghost_positions);
                    pacman.reset();
                }

                if (FRAME_DURATION > lag) {
                    window.clear();

                    if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
                        sf::Vector2i mousePos = sf::Mouse::getPosition(window);
                        int row = std::floor(mousePos.y / SCREEN_RESIZE / CELL_SIZE);
                        int col = std::floor(mousePos.x / SCREEN_RESIZE / CELL_SIZE);
                        if (row < 0 || row >= MAP_HEIGHT || col < 0 || col >= MAP_WIDTH)
                            continue;
                        std::string newRow = map_sketch.at(row);
                        newRow[col] = '#';
                        map_sketch.at(row).assign(newRow);
                        map = convert_sketch(map_sketch, ghost_positions, pacman);
                    }

                    if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) {
                        sf::Vector2i mousePos = sf::Mouse::getPosition(window);
                        int row = std::floor(mousePos.y / SCREEN_RESIZE / CELL_SIZE);
                        int col = std::floor(mousePos.x / SCREEN_RESIZE / CELL_SIZE);
                        if (row < 0 || row >= MAP_HEIGHT || col < 0 || col >= MAP_WIDTH)
                            continue;
                        std::string newRow = map_sketch.at(row);
                        newRow[col] = '*';
                        map_sketch.at(row).assign(newRow);
                        map = convert_sketch(map_sketch, ghost_positions, pacman);
                    }

                    if (!game_won && !pacman.get_dead()) {
                        draw_map(map, window);
                        ghost_manager.draw(GHOST_FLASH_START >= pacman.get_energizer_timer(), window);
                        draw_text(0, 0, CELL_SIZE * MAP_HEIGHT, "Level: " + std::to_string(1 + level), window);
                    }

                    pacman.draw(game_won, window);

                    if (pacman.get_animation_over()) {
                        if (game_won) {
                            draw_text(1, 0, 0, "Next level!", window);
                        } else {
                            draw_text(1, 0, 0, "Game over", window);
                        }
                    }

                    window.display();
                }
            }
        } else {
            window.clear();
            menu.draw(window);
            window.display();
        }
    }

    return 0;
}
Leave a Comment