QT实现贪吃蛇
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_OBJECT
public:
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
QT实现贪吃蛇的更多相关文章
- QT下的贪吃蛇
QT写的贪吃蛇,学习于https://www.devbean.net/2012/12/qt-study-road-2-snake-1/ 建议就学习一下开发思想,开发游戏还是用专门的编译器. 多加了墙, ...
- Qt 学习之路 2(34):贪吃蛇游戏(4)
Qt 学习之路 2(34):贪吃蛇游戏(4) 豆子 2012年12月30日 Qt 学习之路 2 73条评论 这将是我们这个稍大一些的示例程序的最后一部分.在本章中,我们将完成GameControlle ...
- Qt 学习之路 2(33):贪吃蛇游戏(3)
Qt 学习之路 2(33):贪吃蛇游戏(3) 豆子 2012年12月29日 Qt 学习之路 2 16条评论 继续前面一章的内容.上次我们讲完了有关蛇的静态部分,也就是绘制部分.现在,我们开始添加游戏控 ...
- Qt 学习之路 2(32):贪吃蛇游戏(2)
Qt 学习之路 2(32):贪吃蛇游戏(2) 豆子 2012年12月27日 Qt 学习之路 2 55条评论 下面我们继续上一章的内容.在上一章中,我们已经完成了地图的设计,当然是相当简单的.在我们的游 ...
- Qt 学习之路 2(31):贪吃蛇游戏(1)
Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知 ...
- easyx图形库做贪吃蛇游戏
编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
随机推荐
- 中间值为什么为l+(r-l)/2,而不是(l+r)/2
二分法的算法中,我们看到一些代码里取中间值: MID=l+(r-l)/2; 为什么是这个呢?不就是(l+r)/2吗?为什么要多此一举呢? 其实还是有不一样的,看看他们的区别吧: l,r是指针的时候只能 ...
- css-IE中的border-radius和box-shadow
1.今天遇到一个问题,在给一个图片设置border-radius时,firefox和chrome表现正常,但是在IE中就无效,在IE中必须给图片设置一个边框,比如设置一个透明的边框就可以正常显示. 2 ...
- hadoop报错:WARN mapred.JobClient: Error reading task outputNo route to host
解决方案: /etc/sysconfig/network/etc/hosts$hostname 这三处的主机名都要一样. 具体参考:http://blog.itpub.net/28254374/vie ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- 【vijos1900】 学姐吃寿司
https://vijos.org/p/1900 (题目链接) 题意 给出一个01环,问最少经过多少次相邻互换使得所有的0聚在一坨,所有的1聚在一坨. Solution 源自:LCF Solution ...
- Node.js使用Mongoose包操作MongoDB数据库
1. 安装Mongoose npm install mongoose 2. 使用 2.1 创建连接 var mongoose = require('mongoose'); mongoose.conne ...
- GridView控件RowDataBound事件的一个实例
实现点击两个按钮,跳转到同一个界面,HyperLink显示不同的东西,主要代码段如下 前台代码: <asp:TemplateField HeaderText="操作"> ...
- Python编码格式的指定方式
参考自: http://python.jobbole.com/85852/, 原文探究的更深,有兴趣的可以去看看. 简介来讲就是使用一种特殊的注释来声明编码格式,如何判断这种格式也用了很简单粗暴有效的 ...
- BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution
权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...
- js009-客户端检测
js009-客户端检测 本章内容: 1.使用能力检测 2.用户代理检测的历史 3.选择检测方式 一般不使用客户端检测. 9.1 能力检测 也称特性检测.基本模式如下: if(object.proper ...