Ответы
Ответ дал:
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();
}
Пробуй...
#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();
}
Пробуй...
Вас заинтересует
1 год назад
1 год назад
1 год назад
1 год назад
7 лет назад
7 лет назад
8 лет назад