实验二.贪吃蛇的设计

article/2025/10/21 15:44:30

目录

一.实验内容: 

二.贪吃蛇的代码实现

(1)类的声明

(2)初始化界面

(3)游戏界面

(4)蛇的位置

(5)键盘监听

(6)更新蛇的位置

(7)产生食物

(8)是否吃到食物

(9)是否撞到自己

(10)游戏是否胜利

(11)游戏开始与暂停

(12)音乐设置

三 游戏测试

开始游戏

蛇穿墙移动

 游戏结束

 四.打包发布


一.实验内容: 

1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个食物称为豆子。玩家能利用上下左右控制“蛇”的移动,“蛇”吃到“豆子”身体加长一节,得分增加,“碰到边界蛇头与蛇身相撞“蛇”死亡,游戏结束。

2)进行交互界面的设计,要有开始键、暂停键和停止退出的选项,能够控制游戏进程。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。

3)实验设备QT5.9

二.贪吃蛇的代码实现

(1)类的声明

class Snake : public QMainWindow
{Q_OBJECTpublic:Snake(QWidget *parent = nullptr);~Snake();//游戏界面void paintEvent(QPaintEvent *event);//初始化蛇void InitSnake();QRect CreateFood();//产生食物void IsEat();//判断是否吃到了食物void IsHit();//判断是否撞到了自己void IsWin();//判断是否赢得了游戏private slots://定义槽函数的方式//蛇的移动void Snake_update();void on_pushButton_3_clicked();void on_pushButton_5_clicked();void on_pushButton_2_clicked();void on_pushButton_4_clicked();private:Ui::Snake *ui;QTimer *timer;//计时器事件,只要设置了这个,每隔一段时间会去执行指定的东西int nDirection;//蛇的移动方向bool blsRun;//用于控制是否开始的变量bool blsOver;//用于控制是否结束的变量void keyPressEvent(QKeyEvent *key);//键盘事件QVector<QRect> vSnakeRect; //n个小方块组成的vector,代表蛇QRect SnakeHead;//蛇头QString Display;//显示的内容QRect Food;//用来表示食物的变量int Score;//得分int Speed;//蛇的移动速度
};
#endif // SNAKE_H

(2)初始化界面

 ui->setupUi(this);setFixedSize(600,480);//设置图标setWindowIcon(QIcon(":/image/1.jpg"));//设置标题setWindowTitle("贪吃蛇大逃亡");

(3)游戏界面

//实现游戏界面,所有在游戏界面中显示的都要在这个函数中实现,在第一次启动程序和调用update的时候会被执行
void Snake::paintEvent(QPaintEvent *event){ //所有的绘图都要在paintEvent函数里面进行QPainter painter(this);if(!blsRun)//只在第一次运行的时候初始化蛇InitSnake();    //在游戏界面中出现蛇//画游戏的背景,这里先设置墙体painter.setPen(Qt::black);//上边框用黑色的画笔去画painter.setBrush(Qt::yellow);//设置填充的颜色为黄色painter.drawRect(0,0,600,70);painter.setPen(Qt::black);painter.setBrush(Qt::blue);painter.drawRect(0,70,600,410);//绘制矩形,换算四个边界的坐标painter.drawPixmap(20,0,200,70,QPixmap(":/image/3 (1).png"));//画格子,用循环实现painter.setPen(Qt::gray);for(int ii = 7;ii <= 48;ii++){painter.drawLine(0,ii*10,600,ii*10);}for(int ii = 0;ii <= 60;ii++){painter.drawLine(ii*10,70,ii*10,600);}//显示游戏开始和结束QFont font1("Courier",50);painter.setFont(font1);painter.setPen(Qt::white);painter.setBrush(Qt::black);painter.drawText(200,150,Display); //将display的内容显示在140,150的位置上//显示分数QFont font2("Courier",15);painter.setFont(font2);painter.setPen(Qt::black);painter.setBrush(Qt::black);painter.drawText(20,65,"得分:");painter.drawText(70,65,QString::number(Score));//把score转换成字符串并显示出来//游戏停止,通过让计时器停止来结束if(blsOver)timer->stop();//画蛇painter.setPen(Qt::black);//设置蛇的边界颜色painter.setBrush(Qt::green);//设置蛇的颜色painter.drawRects(&vSnakeRect[0],vSnakeRect.size());//把整个蛇画出来//在界面中画出食物painter.drawPixmap(Food,QPixmap(":/image/3 (2).png"));}

(4)蛇的位置

//说明代表蛇应该画在什么地方
void Snake::InitSnake(){blsRun=true;blsOver=false;nDirection=2;//默认刚开始蛇的移动方向是向下Food=CreateFood();//在游戏开始的时候产生食物Score=0;//矩形框vSnakeRect.resize(5);//蛇的长度//用for循环实现蛇的移动坐标for(int i=0;i<vSnakeRect.size();i++){QRect rect(30,70+10*i,10,10);vSnakeRect[vSnakeRect.size()-1-i]=rect;}timer=new QTimer(this);//设定计时器timer->start(Speed);//设定计时器的间隔时间为500mstimer->stop();connect(timer,SIGNAL(timeout()),SLOT(Snake_update()));//SIGNAL:信号 SLOT:槽,对信号和槽的连接
}

(5)键盘监听

//键盘事件
void Snake::keyPressEvent(QKeyEvent *event){QKeyEvent *key=(QKeyEvent*) event;//用switch语句判断键盘输入的是哪个按键switch (key->key()) {case Qt::Key_W://如果按的是上键,规定蛇的移动方向记为1,也就是说1对应向上,且向上的时候不能向下if(nDirection!=2){nDirection=1;}break;//下面三个方向同理case Qt::Key_S:if(nDirection!=1){nDirection=2;}break;case Qt::Key_A:if(nDirection!=4){nDirection=3;}break;case Qt::Key_D:if(nDirection!=3){nDirection=4;}break;default:;//}
}

(6)更新蛇的位置

//更新蛇
void Snake::Snake_update(){Display="";SnakeHead=vSnakeRect.first();//获取蛇头,让蛇头等于vector中的第一个元素IsEat();//判断是否吃到食物IsHit();//判断是否撞到自己IsWin();//判断是否赢了//非蛇头的蛇身的移动for(int j=0;j<vSnakeRect.size()-1;j++){vSnakeRect[vSnakeRect.size()-1-j]=vSnakeRect[vSnakeRect.size()-2-j];}//根据蛇头的朝向来更新蛇的位置switch (nDirection) {case 1:SnakeHead.setTop(SnakeHead.top()-10);//如果是往上移动,让蛇的上面的坐标减10SnakeHead.setBottom(SnakeHead.bottom()-10);//同时蛇的底部也向上移动10break;case 2:SnakeHead.setTop(SnakeHead.top()+10);SnakeHead.setBottom(SnakeHead.bottom()+10);break;case 3:SnakeHead.setLeft(SnakeHead.left()-10);SnakeHead.setRight(SnakeHead.right()-10);break;case 4:SnakeHead.setLeft(SnakeHead.left()+10);SnakeHead.setRight(SnakeHead.right()+10);break;default:; //默认情况下就什么都不做}vSnakeRect[0]=SnakeHead;//如果蛇头离开了墙壁的范围,即蛇头撞墙,则游戏结束//穿墙更新蛇头位置if(SnakeHead.left()<0){QRect rect(590,SnakeHead.top(),10,10);vSnakeRect[0]=rect;}if(SnakeHead.right()>600){QRect rect(0,SnakeHead.top(),10,10);vSnakeRect[0]=rect;}if(SnakeHead.top()<70){QRect rect(SnakeHead.left(),470,10,10);vSnakeRect[0]=rect;}if(SnakeHead.bottom()>480){QRect rect(SnakeHead.left(),70,10,10);vSnakeRect[0]=rect;}update();//刷屏,更新print

(7)产生食物

//产生食物
QRect Snake::CreateFood(){int x,y;//随机产生食物,使用到随机函数//x和y是0到25之间的随机的整数x=qrand()%25;y=qrand()%25;QRect rect(10+x*10,80+y*10,10,10);return rect;
}

(8)是否吃到食物

//产生食物
QRect Snake::CreateFood(){int x,y;//随机产生食物,使用到随机函数//x和y是0到25之间的随机的整数x=qrand()%25;y=qrand()%25;QRect rect(10+x*10,80+y*10,10,10);return rect;
}

(9)是否撞到自己

//判断是否撞到自己
void Snake::IsHit(){//用for循环遍历蛇身,0是蛇头,因此从1开始for(int i=1;i<vSnakeRect.size();i++){//如果撞上了if(SnakeHead==vSnakeRect[i]){SnakeHead==vSnakeRect[i-1];Display="游戏结束";blsOver=true;QMessageBox::StandardButton box;box = QMessageBox::question(this, "提示", "游戏结束,是否重开?", QMessageBox::Yes|QMessageBox::No);if(box==QMessageBox::No)timer->stop();//return;if(box==QMessageBox::Yes){InitSnake();Snake_update();timer->start();}}}
}

(10)游戏是否胜利

//判断是否游戏胜利
void Snake::IsWin(){if(Score==500){Display="恭喜你赢了";blsOver=true;update();}
}

(11)游戏开始与暂停

void Snake::on_pushButton_3_clicked()//暂停游戏
{timer->stop();}
void Snake::on_pushButton_4_clicked()//继续游戏
{timer->start();}

(12)音乐设置

void Snake::on_pushButton_2_clicked()//打开音乐设置
{QSound *startSound = new QSound(":/image/武汉麻将-背景音乐 - 小旭音乐.wav",this);startSound->play();startSound->setLoops(100);
}

三 游戏测试

开始游戏

蛇穿墙移动

 游戏结束

 四.打包发布

 


http://chatgpt.dhexx.cn/article/cblcc3Lm.shtml

相关文章

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

文章目录 代码运行截图笔记补充参考博客&#xff08;阿里嘎多&#xff01;&#xff09; 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&am…

k-means聚类算法及matlab实现(简单实现)

k-means简介 k-means算法也称k均值算法&#xff0c;是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。   聚类试图将数据集中的样本划分为若干个通常是不相交的子集&#xff0c;每个子集称为一个“簇”。通过这样的划分&#xff0c;每个簇里的样本可…

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…

K-means聚类算法及其MATLAB实现

参考&#xff1a; http://www.csdn.net/article/2012-07-03/2807073-k-means http://www.cnblogs.com/zhzhang/p/5437778.html http://blog.csdn.net/qll125596718/article/details/8243404/ K-means属于无监督学习方法 K表示类别数&#xff0c;Means表示均值&#xff0c;K…

基于MATLAB的K-means聚类算法

实验数据说明 Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集。通过花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度4个属性预测鸢尾花卉属于&#xff08;Setosa(山鸢尾)&#xff0c;Versicolour(杂色鸢尾)&#xff0c;Virginica(维吉尼…

k-means聚类算法(matlab实现)

k-means聚类算法 文章目录 k-means聚类算法前言一、k-means聚类算法简介二、k-means聚类算法步骤三、代码实现总结 前言 k-means聚类算法是硬聚类算法的一种&#xff0c;即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本&#xf…

Kmeans聚类算法——Matlab

聚类算法 原理步骤代码绘图选取四个迭代步骤进行可视化&#xff08;散点图&#xff0c;条形图&#xff09;聚类结果可视化&#xff08;散点图&#xff09; 原理 聚类算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对距离他们最近的对象进行归类。通过迭…

matlab实现聚类算法

simulate2020625数据集 clear;clc load simulate2020625;kmax(subcluster(:,3));%设置聚类数目 data subcluster(:,1:2); cata subcluster; [m,n]size(data); c1subcluster(:,3); c1c1;%% 实际聚类图 figure(1); plot(cata(cata(:,3)1,1),cata(cata(:,3)1,2),r*) hold on pl…

K-means++聚类算法(matlab实现)

K-means聚类算法 文章目录 K-means聚类算法前言一、算法简介二、K-means算法步骤三、K-means算法matlab实现总结 前言 K-means算法&#xff1a;K-means算法是K-means算法的改进版&#xff0c;其在选择初始质心时采用了一种更加聪明的方法&#xff0c;能够有效地避免局部最优解…

MATLAB聚类分析(Cluster Analysis)

使用环境&#xff1a;MATLAB2016a、MATLAB2010a 聚类分析是一种无监督式学习&#xff0c;不像回归分析等需要Inputs 和 Targets &#xff0c;聚类分析是只通过提供一组数据实现分类的算法。下面给出本人在学习聚类分析的MATLAB程序 x15*[randn(500,1)5,randn(500,1)5]; x25*[…

matlab统计与机器学习工具箱中的7种聚类算法

1. matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法&#xff0c;并给出了其聚类函数。在使用过程中&#xff0c;直接调用该函数即可&#xff0c;十分方便&#xff0c;不得不感慨matlab的强大。 聚类分析&#xff0c;又称分割分析或分类分…

K-mean(多维度)聚类算法(matlab代码)

申明: 仅个人小记。 Email: officeforcsdn163.com 目录 效果演示二维度三维度 k-mean 算法思想简要说明代码分析二维度k-mean代码三维度k-mean代码多维度k-mean代码功能使用示范后期函数接口改造 (借助matlab中cell结构实现)新的函数接口使用范例 小结 效果演示 二维度 (1) K…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

MATLAB K-means聚类的介绍与使用

K-means算法是硬聚类算法 &#xff0c;是典型的基于原型的目标函数 聚类方法的代表&#xff0c;它是数据点到原型的某种距离作为优化的目标函数&#xff0c;利用函数求极值的方法得到迭代运算的调整规则。K-means算法以偶是距离 作为相似度测度&#xff0c;它是求对应某一初…

MatLab Kmeans聚类

机器学习以及人工智能的学习需要扎实的数学功底才能走的更远&#xff0c;爬的更高&#xff0c;所以打好数学基础是关键&#xff0c;但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了&#xff0c;这里我建议大家找几个比较靠谱入门的机器学习或者人工智能学习平…

聚类分析(二)k-means及matlab程序

1.介绍 k-means是一种常见的基于划分的聚类算法。划分方法的基本思想是&#xff1a;给定一个有N个元组或者记录的数据集&#xff0c;将数据集依据样本之间的距离进行迭代分裂&#xff0c;划分为K个簇&#xff0c;其中每个簇至少包含一条实验数据。 2.k-means原理分析 2.1工作原…

数据挖掘实验(七)Matlab实现聚类算法【clusterdata / kmeans】

本文代码均已在 MATLAB R2019b 测试通过&#xff0c;如有错误&#xff0c;欢迎指正。 另外&#xff0c;这次实验都是调用Matlab现成的函数&#xff0c;没什么技术含量。 &#xff08;一&#xff09;聚类分析的原理 聚类是将数据分类到不同的类或者簇这样的一个过程&#xff…

K-means聚类 —— matlab

目录 1.简介 2.算法原理 3.实例分析 3.1 读取数据 3.2 原理推导K均值过程 3.3 自带kmeans函数求解过程 完整代码 1.简介 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程&#xff0c;聚类就是一种发现这种内在结构的技术&#xff0c;聚类技术经常被称为…

聚类分析的Matlab 程序—系统聚类(附有案例分析)

聚类分析的Matlab 程序—系统聚类 (1)计算数据集每对元素之间的距离,对应函数为pdistw. 调用格式&#xff1a;Ypdist(X),Ypdist(X,’metric’), Ypdist(X,’distfun’),Ypdist(X,’minkowski’,p) 说明&#xff1a;X是m*n的矩阵&#xff0c;metric是计算距离的方法选项&…

如何运用MATLAB实现K-MEANS聚类分析

由于自己最近在学习聚类分析&#xff0c;也算是一个入门&#xff0c;相当于将自己这段时间的学习成果进行一个总结&#xff0c;分享给更多打算学习聚类分析或者需要用到聚类分析的同学们~ 在了解K-MEANS聚类分析之前&#xff0c;我们首先明确聚类的含义&#xff0c;聚类是将数…