Qt版的贪食蛇游戏项目

1. 创建项目Qt版的贪食蛇游戏项目_第1张图片

选择模板Qt版的贪食蛇游戏项目_第2张图片

选择编译器:Qt版的贪食蛇游戏项目_第3张图片

准备游戏素材

准备素材

Qt版的贪食蛇游戏项目_第4张图片

添加数据成员

enum Direct{Left,Right,Up,Down};
 
 QList 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 
 
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 
 
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 
#include 
#include 
 
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

失败检测

//判断蛇头是否和蛇身相撞, 以及蛇身和蛇身相撞
bool Widget::checkContact()
{
 for(int i=0; i

游戏结束效果

Qt版的贪食蛇游戏项目_第5张图片

今天的分享就到这里了,大家要好好学C语言/C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:763855696【点击进入】

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

Qt版的贪食蛇游戏项目_第6张图片Qt版的贪食蛇游戏项目_第7张图片 

Qt版的贪食蛇游戏项目_第8张图片

你可能感兴趣的:(C语言游戏开发,c语言,开发语言,后端)