Qt 贪吃蛇小游戏
简单的实现了走和变大的样子,剩下的还在完善
贴代码
#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QPainter>
#include <QRect>
#include <QMessageBox>
#include <QString>
#include <QDebug> #define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 static int rect_width = 10;
static int COL = 0;
static int ROW = 0; MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),m_foodCount(0),m_currentGrade(0),m_currentSpeed(500)
{
ui->setupUi(this);
this->setWindowTitle("Snake"); //set window title "Snake"
ui->widget->installEventFilter(this); //install eventfilter
COL =ui->widget->width()/rect_width;
ROW =ui->widget->height()/rect_width;
init();
} MainWindow::~MainWindow()
{
timer->stop();
delete ui;
} bool MainWindow::eventFilter(QObject *watched, QEvent *event) //eventfilter
{
if(watched == ui->widget && event->type() == QEvent::Paint )
{
painter_rects();
// return true;
}
else
{
return 0;
} return QWidget::eventFilter(watched,event);
} void MainWindow::creatFood()
{
foodPosition[0] = qrand()%COL;
foodPosition[1] = qrand()%ROW;
for(int bodyId=0;bodyId<m_foodCount;bodyId++)
{
if(foodPosition[0] == snake[bodyId][0]&&foodPosition[1] == snake[bodyId][1])
{
foodPosition[0] = qrand()%COL-1;
foodPosition[1] = qrand()%ROW-1;
}
}
} void MainWindow::drawSnakeHead()
{
snake[0][0] = qrand()%COL;
snake[0][1] = qrand()%ROW; m_direction = qrand()%4;
} void MainWindow::init()
{
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(slot_Timerout()));
timer->start(m_currentSpeed);
creatFood();
drawSnakeHead();
} bool MainWindow::dealGuoJie()
{
if(snake[0][0]>(COL-1)|| snake[0][0]<0 || snake[0][1]>(ROW-1)|| snake[0][1]<0)
{
gameOver();
return true;
}
for(int i =1;i<m_foodCount;++i)
{
if(snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1])
{
gameOver();
return true;
}
} return false;
} void MainWindow::gameOver()
{
QMessageBox::information(this,QString("敬告"),QString("游戏结束"));
} void MainWindow::flashgrade()
{
ui->label_grade->setText(QString::number(m_currentGrade,10));
} void MainWindow::snakeRun()
{
if(dealGuoJie())
{
return;
}
checkEatFood();
update();
} void MainWindow::snakeHeadRun()
{
switch (m_direction) {
case UP:
--snake[0][1];
break;
case DOWN:
++snake[0][1];
break;
case LEFT:
--snake[0][0];
break;
case RIGHT:
++snake[0][0];
break;
default:
break;
}
} void MainWindow::checkEatFood()
{
if(snake[0][0] == foodPosition[0] && snake[0][1] == foodPosition[1])
{
++m_foodCount;
ungrade();
flashgrade();
creatFood();
}
for(int snId = m_foodCount;snId>0;--snId)
{
snake[snId][0] = snake[snId-1][0];
snake[snId][1] = snake[snId-1][1];
}
snakeHeadRun();
} void MainWindow::ungrade()
{ } void MainWindow::painter_rects()
{
QPainter painer(ui->widget);
/*
* draw the rects
*/
for(int x=0;x<COL;x++)
{
for(int y=0;y<ROW;y++)
{
painer.drawRect(QRect(x*rect_width,y*rect_width,rect_width,rect_width));
}
}
/*
* draw food
*/
painer.fillRect(QRect(foodPosition[0]*rect_width,foodPosition[1]*rect_width,rect_width,rect_width),Qt::green);
/*
* draw snake head
*/
painer.fillRect(QRect(snake[0][0]*rect_width,snake[0][1]*rect_width,rect_width,rect_width),Qt::red);
/*
* draw snake body
*/
for(int snakebody=1;snakebody<m_foodCount;snakebody++)
{
painer.fillRect(QRect(snake[snakebody][0]*rect_width,snake[snakebody][1]*rect_width,rect_width,rect_width),Qt::black);
} } void MainWindow::on_pushButton_up_clicked()
{
m_direction = UP;
qDebug()<<"up active";
} void MainWindow::on_pushButton_left_clicked()
{
m_direction = LEFT;
qDebug()<<"left active";
} void MainWindow::on_pushButton_right_clicked()
{
m_direction = RIGHT;
qDebug()<<"right active";
} void MainWindow::on_pushButton_down_clicked()
{
m_direction = DOWN;
qDebug()<<"down active";
} void MainWindow::slot_Timerout()
{
snakeRun();
qDebug()<<"timrt is Run";
}
Qt 贪吃蛇小游戏的更多相关文章
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
- 用python+pygame写贪吃蛇小游戏
因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...
- Java贪吃蛇小游戏
贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...
随机推荐
- 使用ToString方法格式化日期
实现效果: 关键知识: Environment类的NewLine属性 //用于获取为此环境定义的换行字符串,程序执行过程中方便对字符串进行换行 Environment类的EXIT方法 //用 ...
- 【转】Java类加载原理解析
原链接 1 基本信息 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载. Java的类加载机制是j ...
- CGAL 4.6 - Surface Reconstruction from Point Sets
http://doc.cgal.org/latest/Surface_reconstruction_points_3/ The following example reads a point set, ...
- SqlSugar之SqlQueryDynamic返回值处理
现在有个需求,有一张表每个月表名都会变的,但结构是一样的,我们不能再用类映射来完成的,我不能每个月都去手动添加,我们只能使用sql语句来完成这个需求.为了方便我这边选择的是SqlQueryDynami ...
- ProjectOnline同步数据到线下
根据微软官方文档 我们能将office365上的应用系统projectonline数据同步到线下. 我们看看projectonline上面的数据: 同步后到达sqlserver的数据 这样office ...
- JavaScript js调用堆栈(三)
本文主要深入介绍JavaScript内存机制 内存模型 JS内存空间分为栈(stack),堆(heap),池(一般也会归类为栈中),其中栈存放变量,堆存放复杂对象,池存放常量. 注:闭包中的变量并不保 ...
- Linux中软件使用笔记
刚刚接触Linux的小白,难免会碰到各种小问题,不要灰心,总有办法的... 1.搜狗输入法崩溃,打不出中文?都是乱码?一招制敌! 在Terminal中输入下面命令后重启电脑即可重生- 还有,是Sogo ...
- Python学习之路——基础2(含深浅拷贝)
逻辑运算符:not and or 等同于c/c++中的 !.&&.||,除了写法上的不同,实际原理是一样的. 运算也遵循短路原则.由于Python本身不支持++/--操作符,所以避 ...
- linux各种抓包情况说明
大家都知道抓包指令:tcpdump 抓包的主要目的是测试端口.网络协议通不通,以及对抓取的数据包进行分析.测试,抓包对熟悉linux的大神都不陌生,网络对于我来说也是一窍不通,只是在这里记录一下 ...
- 给xcode项目重命名
在xcode项目开发中,经常会遇到需要修改项目名字的问题, 但是xcode本身修改项目名字比较麻烦,有时候修改的不完全,有时候修改了项目无法打开,无奈只能建一个新项目.这里提供一种修改xcode项目名 ...