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

Ответы

Ответ дал: KlimenkoAnna2010
1
Введи код:

#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();
}
Пробуй...
Вас заинтересует