QT实现贪吃蛇
来源:互联网 发布:充电宝牌子 知乎 编辑:程序博客网 时间:2024/04/28 16:33
board.h
#ifndef BOARD_H#define BOARD_H#define MAX_X 40#define MAX_Y 30#define NORMAL_LABEL 0//普通label#define BORDER_LABEL 1//边界label#define SNAKE_LABEL 2//蛇身label#define FOOD_LABEL 3//食物label#include <QWidget>#include <QLabel>#include <QList>#include <QTimer>#include <QKeyEvent>struct Node{ QLabel *label; int type;//边界:1 蛇身:2 普通:0 食物:3 int x; int y;};class Board : public QWidget{ Q_OBJECTpublic: explicit Board(QWidget *parent = 0); void init(); void drawBorder();//画边界 void initSnake(); void moveStep(); void getHeadTail();//得到头和尾 bool left();//判断是否能上下左右移动 bool right(); bool up(); bool down(); void keyPressEvent(QKeyEvent *e);//键盘事件// void gameover();// void showAllType(); void generateFood();//生成食物signals:public slots: void slotMoveStep();//槽函数,可以当做普通函数使用private: Node *matrix[MAX_X][MAX_Y]; QList<Node*> snake;//蛇身 int dx, dy; Node *head;//蛇头指针 Node *tail;//蛇尾指针 QTimer timer;};#endif // BOARD_H
boarder.cpp
#include "board.h"#include <QDebug>#include <QString>#include <QTimer>#include <QMessageBox>#include <QKeyEvent>#include <ctime>Board::Board(QWidget *parent) : QWidget(parent){ this->setWindowTitle("贪吃蛇"); init();//初始化 drawBorder();//画边界 initSnake();//初始化蛇身 moveStep(); generateFood();//初始化完就产生一个食物 connect(&timer, SIGNAL(timeout()), this, SLOT(slotMoveStep())); timer.start(100);}void Board::init(){ int gridSize = 25; for(int x = 0; x < MAX_X; x++){ for(int y = 0; y < MAX_Y; y++){ QLabel *label = new QLabel(this); label->setStyleSheet("background:red"); label->setGeometry(x * gridSize, y * gridSize, gridSize - 1, gridSize - 1); label->hide(); matrix[x][y]= new Node; matrix[x][y]->label =label; matrix[x][y]->type = NORMAL_LABEL;//将所有的都初始化成普通label matrix[x][y]->x = x; matrix[x][y]->y = y; } }}void Board::drawBorder(){//画边界 for(int x = 0; x < MAX_X; x++){ for(int y = 0; y < MAX_Y; y++){ if(x == 0 || x == MAX_X - 1 || y == 0 || y == MAX_Y - 1){ matrix[x][y]->label->show(); matrix[x][y]->type = BORDER_LABEL;//边界label } } }}void Board::initSnake(){//画蛇身 int x0 = 5, y0 = 5; int snakeLen = 5;//初始蛇身长5 dx = 1; dy = 0; snake.clear(); for(int x = x0; x < x0 + snakeLen; x++){ snake.append(matrix[x][y0]); snake.at(snake.length() - 1)->x = x; snake.at(snake.length() - 1)->y = y0; matrix[x][y0]->type = SNAKE_LABEL;//蛇身label matrix[x][y0]->label->show(); }}void Board::moveStep(){ getHeadTail();//获取蛇头和蛇尾指针 Node *n = matrix[head->x + dx][head->y + dy]; n->label->show(); //n是即将变成蛇头的那个label if(n->type == BORDER_LABEL || n->type == SNAKE_LABEL){ qDebug() << "Game over@!!!"; timer.stop(); QMessageBox::information(this, "提示", "*** Game Over ***", QMessageBox::Ok); }else{ if(n->type == FOOD_LABEL){//吃到食物了 n->type = SNAKE_LABEL; snake.append(n); //不移除尾巴 generateFood();//生成下一个食物 }else{ n->type = SNAKE_LABEL; snake.append(n); tail->label->hide(); tail->type = NORMAL_LABEL; snake.removeFirst(); } }}void Board::getHeadTail(){ head = snake.at(snake.length() - 1);//蛇头其实是list的尾巴 tail = snake.at(0);//蛇尾其实是list的第一个元素 // gameover();}void Board::slotMoveStep(){ // qDebug() << "movestep"; moveStep();}void Board::keyPressEvent(QKeyEvent *e){ //qDebug() << Qt::Key_up; qDebug() << e->key(); switch (e->key()) { case 16777235://上 if(up()){ dy = -1; dx = 0; } break; case 16777237://下 if(down()){ dy = 1; dx = 0; } break; case 16777234://左 if(left()){ dx = -1; dy = 0; } break; case 16777236://右 if(right()){ dx = 1; dy = 0; } break; default: break;; }}void Board::generateFood(){//生成食物 int food_x,food_y; srand((unsigned)time(0)); do{ food_x = rand()%MAX_X; food_y = rand()%MAX_Y; }while(matrix[food_x][food_y]->type != NORMAL_LABEL);// matrix[food_x][food_y]->label->setText("food"); matrix[food_x][food_y]->type = FOOD_LABEL; matrix[food_x][food_y]->label->show();}bool Board::left(){ if(dy == 0){//向左或向右走 return false; } return true;}bool Board::right(){ if(dy == 0){//向左或向右走 return false; } return true;}bool Board::up(){ if(dx == 0){//向上或向下走 return false; } return true;}bool Board::down(){ if(dx == 0){//向上或向下走 return false; } return true;}
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1426968
0 0
- QT实现贪吃蛇
- 基于Qt 的贪吃蛇实现
- qt写贪吃蛇
- [QT]别样贪吃蛇
- qt之贪吃蛇
- Qt 贪吃蛇小游戏
- 09 qt画图与贪吃蛇游戏的实现
- Qt版贪吃蛇游戏
- Qt小游戏开发:贪吃蛇
- Qt贪吃蛇游戏(2):
- QT 简单编写贪吃蛇
- Qt制作贪吃蛇游戏
- Qt开发实例-贪吃蛇
- 贪吃蛇C实现
- js实现贪吃蛇
- JavaScript实现贪吃蛇
- javascript实现贪吃蛇
- javascript实现贪吃蛇
- QT笔记
- 进程控制 [fork() exec() wait() waitpid()]
- R语言入门笔记
- C++基础入门
- PuzzleGame部分核心算法
- QT实现贪吃蛇
- C语言打乱一组数字顺序
- QT读写ini配置文件
- Windows下安装Tomcat服务
- ActionScript学习笔记
- Java操作Oracle
- Flex入门笔记
- JDBC连接池
- JSTL I18N 格式标签库