用Qt实现一个贪吃蛇项目
一、项目介绍
贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 在编程语⾔的教学中,我们以贪吃蛇为例,从设计到代码实现来提升编程能⼒和逻辑能⼒。它通过控制蛇头⽅向吃⻝物,从⽽使得蛇变得越来越⻓。在本游戏中设置了上下左右四个⽅向键来控制蛇的移动⽅向。⻝物的产⽣是随机⽣成的,当蛇每吃⼀次⻝物 就会增加⼀节⾝体,同时游戏积分也会相应的加⼀。
在本游戏的设计中,蛇的⾝体会越吃越⻓,⾝体越⻓对应的难度就越⼤,因为⼀旦蛇头和⾝体相交游戏就会结束。
本项⽬使⽤ Qt 实现⼀款简单的贪吃蛇游戏。
项目的目标:
- 游戏大厅界面实现
- 难度选择界面实现
- 游戏界面实现
- 分数记录界面实现
二、游戏大厅界面实现
2.1完成游戏大厅的背景图。
1.背景图的渲染,我们通过QT的绘图事件完成
void gamehall::paintEvent(QPaintEvent *event)
{
//实例化一个画家
QPainter paint(this);
//实例化一个设备
QPixmap pix(":res/game_hall.png");
//进行绘画
paint.drawPixmap(0,0,this->width(),this->height(),pix);
}
2.对我们的标题栏进行设置
//设置窗口大小
this->setFixedSize(1000,800);
//设置标题栏图标
this->setWindowIcon(QIcon(":res/ico.png"));
//设置标题栏标签
this->setWindowTitle("游戏大厅");
2.2创建一个按钮,给它设置样式,并且可以跳转到别的页面
1.创建一个按钮,给它设置样式
QFont font("华文行楷",25);
//设置按钮
QPushButton *intoBtn= new QPushButton(this);
intoBtn->setFont(font);
intoBtn->setText("开始游戏");
intoBtn->setStyleSheet("QPushButton{border:0px;}");
intoBtn->move(450,520);
2.创建的新页面
点击add new
3. 建立信号槽,使按钮被点击后跳转界面(这个跳转的界面,是新创建的文件,点击按钮会发出声音)
//创建另一个窗口
GameSelect *select=new GameSelect();
connect(intoBtn,&QPushButton::clicked,[=]{
//关闭上个窗口
this->close();
//设置窗口大小
select->setGeometry(this->geometry());
//显示窗口
select->show();
//发出声音
QSound::play(":res/clicked.wav");
4.总代码
#include "gamesnake.h"
#include "ui_gamesnake.h"
#include "gameselect.h"
#include <QPainter>
#include <QPixmap>
#include <QIcon>
#include <QPushButton>
#include <QSound>
GameSnake::GameSnake(QWidget *parent)
: QWidget(parent)
, ui(new Ui::GameSnake)
{
ui->setupUi(this);
//设置窗口大小
this->setFixedSize(1000,800);
//设置窗口图标
this->setWindowIcon(QIcon(":res/ico.png"));
//设置窗口标签
this->setWindowTitle("游戏大厅");
//设置字体
QFont font("华文行楷",25);
//设置按钮
QPushButton *intoBtn= new QPushButton(this);
intoBtn->setFont(font);
intoBtn->setText("开始游戏");
intoBtn->setStyleSheet("QPushButton{border:0px;}");
intoBtn->move(450,520);
//创建另一个窗口
GameSelect *select=new GameSelect();
connect(intoBtn,&QPushButton::clicked,[=]{
//关闭上个窗口
this->close();
select->setGeometry(this->geometry());
select->show();
QSound::play(":res/clicked.wav");
});
}
GameSnake::~GameSnake()
{
delete ui;
}
void GameSnake::paintEvent(QPaintEvent *event)
{
//实例化一个画家
QPainter paint(this);
//实例化一个设备
QPixmap pix(":res/game_hall.png");
//进行绘画
paint.drawPixmap(0,0,this->width(),this->height(),pix);
}
注意pro文件里的配置加上multimedai
三、难度选择界面实现
我们已经把贪吃蛇的游戏界面完成了,下面就进入关卡选择界面。
在关卡选择界⾯上设置了四个游戏模式按钮,分别是:容易模式、正常模式、困难模式、地狱模式;⼀个 “历史战绩” 按钮;⼀个返回游戏⼤厅界⾯的按钮。
1. 创建按钮,给它设置样式。
//容易关卡
QPushButton *briefnessBtn= new QPushButton(this);
briefnessBtn->setStyleSheet("QPushButton{background-color:#0072C6;color: black; border:0px groove gray;border-radius:10px;padding:6px;}");
briefnessBtn->move(400,200);
QFont font("华文行楷",25);
briefnessBtn->setFont(font);
briefnessBtn->setText("容易模式");
如图,我已经创建了5个按钮:
2. 为了使第二个界面可以返回到第一个界面,创建一个按钮,按下按钮触发信号,就可以返回第一个页面。(返回按钮)
//返回按钮
QPushButton *returnBtn= new QPushButton(this);
returnBtn->move(850,700);
returnBtn->setIcon(QIcon(":res/up.png"));
connect(returnBtn,&QPushButton::clicked,[=]{
this->close();
GameSnake *snake= new GameSnake();
snake->show();
QSound::play(":res/clicked.wav");
});
3. 游戏选择页面跳转到游戏大厅
实现页面之间的跳转
//实现游戏房间和选择关卡切换
//创建另一个窗口
GameRoom *room=new GameRoom();
//创建按钮,给按钮设置格式
//容易关卡
QPushButton *briefnessBtn= new QPushButton(this);
briefnessBtn->setStyleSheet("QPushButton{background-color:#0072C6;color: black; border:0px groove gray;border-radius:10px;padding:6px;}");
briefnessBtn->move(400,200);
QFont font("华文行楷",25);
briefnessBtn->setFont(font);
briefnessBtn->setText("容易模式");
connect(briefnessBtn,&QPushButton::clicked,[=]{
//关闭上个窗口
this->close();
room->setGeometry(this->geometry());