当前位置:网站首页>Qt版的贪食蛇游戏项目
Qt版的贪食蛇游戏项目
2022-07-29 05:08:00 【cpp编程】
1. 创建项目
选择模板
选择编译器:
准备游戏素材
准备素材

添加数据成员
enum Direct{Left,Right,Up,Down};
QList<QRectF> snake;//贪吃蛇本体
int snakeNodeWidth = 20;
int snakeNodeHeight = 20;
QTimer *timer;
int time = 150;
int moveFlage = Up;
bool gameStart = false;
QRectF rewardNode;添加方法的声明
protected:
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *);
void addTop();
void addDown();
void addLeft();
void addRight();
void deleteLast();
bool checkContact();
void addNewReward();
添加槽函数
protected slots:
void timeOut();
构造函数
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
resize(600, 368);
snake.append(QRectF(300,180,snakeNodeWidth,snakeNodeHeight));
addTop();
addTop();
timer = new QTimer;
connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));
addNewReward();
}
按键时间处理
#include <QKeyEvent>
void Widget::keyPressEvent(QKeyEvent *event)
{
switch(event->key()){
case Qt::Key_Up:
if(moveFlage != Down){
moveFlage = Up;
}
break;
case Qt::Key_Down:
if(moveFlage != Up){
moveFlage = Down;
}
break;
case Qt::Key_Right:
if(moveFlage != Left){
moveFlage = Right;
}
break;
case Qt::Key_Left:
if(moveFlage != Right){
moveFlage = Left;
}
break;
case Qt::Key_Space:
if(!gameStart){
timer->start(time);
gameStart = true;
}else {
timer->stop();
gameStart = false;
}
break;
default:
break;
}
}超时事件处理
void Widget::timeOut()
{
int count = 1;
if (snake.at(0).intersects(rewardNode)) {
addNewReward();
count++;
}
while (count--) {
switch (moveFlage) {
case Up:
addTop();
break;
case Down:
addDown();
break;
case Right:
addRight();
break;
case Left:
addLeft();
break;
default:
break;
}
}
deleteLast();
update();
}添加新方块
void Widget::addNewReward() {
rewardNode = QRectF(
qrand()%(this->width()/20)*20,
qrand()%(this->height()/20)*20,
snakeNodeWidth,
snakeNodeWidth);
}各个方向的运动实现
//向上移动
void Widget::addTop()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).y()-snakeNodeHeight < 0){
leftTop = QPointF(
snake.at(0).x(), //左上角x坐标
this->height()-snakeNodeHeight); //左上角y坐标
rightBotom = QPointF(
snake.at(0).x()+snakeNodeWidth,
this->height());
}else{
leftTop = QPointF(snake.at(0).x(),
snake.at(0).y() - snakeNodeHeight);
rightBotom = snake.at(0).topRight();
}
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向下移动
void Widget::addDown()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).y()+snakeNodeHeight*2 > this->height()){
leftTop = QPointF(snake.at(0).x(), 0);
rightBotom = QPointF(snake.at(0).x()+snakeNodeWidth, snakeNodeHeight);
}else{
leftTop = snake.at(0).bottomLeft();
rightBotom = snake.at(0).bottomRight() + QPointF(0, snakeNodeHeight);
}
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向左移动
void Widget::addLeft()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).x()-snakeNodeWidth < 0){
leftTop = QPointF(this->width() -snakeNodeWidth, snake[0].y());
}else{
leftTop = snake[0].topLeft() - QPointF(snakeNodeWidth, 0);
}
rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向右移动
void Widget::addRight()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).x()+snakeNodeWidth*2 > this->width()){
leftTop = QPointF(0, snake[0].y());
}else{
leftTop = snake[0].topRight();
}
rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
snake.insert(0, QRectF(leftTop, rightBotom));绘制贪食蛇
#include <QPainter>
#include <QPen>
#include <QBrush>
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen; //画笔,用于绘制轮廓
QBrush brush; //画刷,用于填充
QPixmap pix;
pix.load("D:/tmp/snake.jpg");
painter.drawPixmap(0,0, 600, 368,pix);
//反锯齿
painter.setRenderHint(QPainter::Antialiasing);
pen.setColor(Qt::black);
brush.setColor(Qt::darkMagenta);
for(int i=0; i<snake.length(); i++){
painter.drawRect(snake.at(i));
}
brush.setColor(Qt::red);
painter.setBrush(brush);
painter.drawEllipse(rewardNode);
pen.setColor(Qt::black);
painter.setPen(pen);
QFont font("微软雅黑", 12,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText(560, 32, QString("%1").arg(snake.length()));
if(checkContact()){
QFont font("方正舒体",30,QFont::ExtraLight,false);
}
QWidget::paintEvent(event);
}失败检测
//判断蛇头是否和蛇身相撞, 以及蛇身和蛇身相撞
bool Widget::checkContact()
{
for(int i=0; i<snake.length();i++) {
for(int j=i+1; j<snake.length(); j++){
if(snake.at(i) == snake.at(j)){
return true;
}
}
}
return false;
}游戏结束效果

今天的分享就到这里了,大家要好好学C语言/C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
C语言C++编程学习交流圈子,QQ群:763855696【点击进入】
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享:


边栏推荐
- sql日志
- JS (foreach) return cannot end the function solution
- QT学习:QDropEvent拖拽事件
- 【微信小程序--解决display:flex最后一行对齐问题。(不连续排列会分到两边)】
- Young freshmen yearn for more open source | here comes the escape guide from open source to employment!
- Google GTEST event mechanism
- [file download] easyexcel quick start
- MySQL sorts the queried result set according to the specified sequence
- 三层项目的架构分析及构造方法的参数名称注入
- Original code, inverse code, complement code
猜你喜欢

Learn the first program of database

6.2 function-parameters

Jackson解析JSON详细教程

ODOO开发教程之透视表

How does word view document modification traces? How word views document modification traces

传奇开区网站如何添加流量统计代码

Arfoundation starts from zero 9-ar anchor

ARFoundation入门教程7-url动态加载图像跟踪库

Jackson parsing JSON detailed tutorial

Scikit learn -- steps and understanding of machine learning application development
随机推荐
About realizing page Jump of website in Servlet
7.1-default-arguments
【微信小程序--解决display:flex最后一行对齐问题。(不连续排列会分到两边)】
Adb常用命令列表
6.2 function-parameters
力扣------对奇偶下标分别排序
Young freshmen yearn for more open source | here comes the escape guide from open source to employment!
2021-10-11
What if excel is stuck and not saved? The solution of Excel not saved but stuck
Mysql把查询到的结果集按指定顺寻进行排序
"Invisible Bridge" built in the free trade economy: domestic products and Chinese AI power
How to make the characters in the photos laugh? HMS core video editing service one click smile function makes people smile more naturally
7.3-function-templates
Self join and joint query of MySQL
JS daily question (12)
Numpy Foundation
Jackson parsing JSON detailed tutorial
What if the computer cannot open excel? The solution of Excel not opening
AttributeError: ‘module‘ object has no attribute ‘create_connection‘
SQL log