profile
Размещено 2 года назад по предмету Информатика от radmirr094

Как в C++ написать игру ("Змейка")

  1. Ответ на вопрос
    Ответ на вопрос дан KlimenkoAnna2010
    Введи код:

    #pragma once

    #include <QWidget>
    #include <QKeyEvent>

    class Snake : public QWidget {

    public:
    Snake(QWidget *parent = 0);

    protected:
    void paintEvent(QPaintEvent *);
    void timerEvent(QTimerEvent *);
    void keyPressEvent(QKeyEvent *);

    private:
    QImage dot;
    QImage head;
    QImage apple;

    static const int B_WIDTH = 300;
    static const int B_HEIGHT = 300;
    static const int DOT_SIZE = 10;
    static const int ALL_DOTS = 900;
    static const int RAND_POS = 29;
    static const int DELAY = 140;

    int timerId;
    int dots;
    int apple_x;
    int apple_y;

    int x[ALL_DOTS];
    int y[ALL_DOTS];

    bool leftDirection;
    bool rightDirection;
    bool upDirection;
    bool downDirection;
    bool inGame;

    void loadImages();
    void initGame();
    void locateApple();
    void checkApple();
    void checkCollision();
    void move();
    void doDrawing();
    void gameOver(QPainter &);
    };
    Код для запуска таймера:
    void Snake::initGame() {

    dots = 3;

    for (int z = 0; z < dots; z++) {
    x[z] = 50 - z * 10;
    y[z] = 50;
    }

    locateApple();

    timerId = startTimer(DELAY);
    }
    Затем вызываем метод locateApple(), который случайным образом позиционирует новое яблоко:

    void Snake::checkApple() {

    if ((x[0] == apple_x) && (y[0] == apple_y)) {

    dots++;
    locateApple();
    }
    }
    Вторая «часть» движется туда, где была первая, третья — туда, где была вторая и т.д.:

    void Snake::move() {

    for (int z = dots; z > 0; z--) {
    x[z] = x[(z - 1)];
    y[z] = y[(z - 1)];
    }

    if (leftDirection) {
    x[0] -= DOT_SIZE;
    }

    if (rightDirection) {
    x[0] += DOT_SIZE;
    }

    if (upDirection) {
    y[0] -= DOT_SIZE;
    }

    if (downDirection) {
    y[0] += DOT_SIZE;
    }
    }
    Перемещаем «части» тела змеи друг за другом:

    for (int z = dots; z > 0; z--) {
    x[z] = x[(z - 1)];
    y[z] = y[(z - 1)];
    }
    Голова перемещается в любом из 4 направлений. Например, перемещаем голову змеи влево:

    if (leftDirection) {
    x[0] -= DOT_SIZE;
    }
    В методе checkCollision() мы определяем, столкнулась ли змея со стеной или со своим телом. Если змея ударится головой о какую-нибудь «часть» своего тела, то игра окончена:

    for (int z = dots; z > 0; z--) {
    if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
    inGame = false;
    }
    }
    Игра заканчивается, если змея сталкивается с любой частью доски, например, с нижней:

    if (y[0] >= B_HEIGHT) {
    inGame = false;
    }
    . Функция repaint() вызывает перерисовку окна:

    void Snake::timerEvent(QTimerEvent *e) {

    Q_UNUSED(e);

    if (inGame) {

    checkApple();
    checkCollision();
    move();
    }

    repaint();
    }
    Например, если пользователь нажимает стрелочку ←, то мы устанавливаем значение true для переменной leftDirection. Эта переменная используется в функции move() для изменения координат змеи. Стоит отметить, что когда змея направляется вправо, мы не можем сразу же повернуть налево (т.е. сразу развернуться на 180 градусов):

    if ((key == Qt::Key_Left) && (!rightDirection)) {
    leftDirection = true;
    upDirection = false;
    downDirection = false;
    }
    Основной файл программы — main.cpp:

    #include <QApplication>
    #include "Snake.h"

    int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    Snake window;

    window.setWindowTitle("Snake");
    window.show();

    return app.exec();
    }
    Пробуй...
Не тот ответ на вопрос, который вам нужен?
Найди верный ответ
Самые новые вопросы
tegysigalpa2012
Русский язык - 5 лет назад

Помогите решить тест по русскому языку тест по русскому языку «местоимение. разряды местоимений» для 6 класса 1. укажите личное местоимение: 1) некто 2) вас 3) ни с кем 4) собой 2. укажите относительное местоимение: 1) кто-либо 2) некоторый 3) кто 4) нам 3. укажите вопросительное местоимение: 1) кем-нибудь 2) кем 3) себе 4) никакой 4. укажите определительное местоимение: 1) наш 2) который 3) некий 4) каждый 5. укажите возвратное местоимение: 1) свой 2) чей 3) сам 4) себя 6. найдите указательное местоимение: 1) твой 2) какой 3) тот 4) их 7. найдите притяжательное местоимение: 1) самый 2) моего 3) иной 4) ничей 8. укажите неопределённое местоимение: 1) весь 2) какой-нибудь 3) любой 4) этот 9. укажите вопросительное местоимение: 1) сколько 2) кое-что 3) она 4) нами 10. в каком варианте ответа выделенное слово является притяжательным местоимением? 1) увидел их 2) её нет дома 3) её тетрадь 4) их не спросили

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.