一、问题分析和任务定义:
1.贪吃蛇游戏基本规则:
屏幕上随机出现一个“食物”,称为豆子。玩家能利用上下左右键控制“蛇”的移动,“蛇”吃到“豆子”后“蛇”身体加长一节,得分增加,“蛇”碰到边界或蛇头与蛇身相撞,“蛇”死亡,游戏结束。
2.学习任务:
1)实现贪吃蛇游戏基本功能。
2)进行交互界面的设计,要有开始键、暂停键和停止退出的选项,能够控制游戏进程。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。
二、逻辑设计:
1.数据构成
1)设置二维数组存放地图
2)设置随机生成一个点表示蛇
3)设置能够通过上下左右按钮按动的身体,能够实现蛇的移动
4)设置分数值,计数
5)设置计时器
6)设置身体移动速度
2.各数据间逻辑关系
1)点随机生成,而且每一次身体移动到点的位置,点就会在身体之外的二维数组里的其他位置自动生成
2)每次身体头部吃到自己,就会死亡,身体就会停止移动,并且弹出界面“游戏结束,分数,用时”
3)每次吃到一个点,分数都能加1,并计数分值
4)速度可以按照规定加快或者减慢
5)计时会和时钟频率一致,从身体移动开始计时,直到身体死亡
6)通过上下左右移动改变位置,可以用switch语法通过按动相应的按钮实现相应功能
三、物理设计(伪代码)
1.通过QPaintEvent来绘图和绘制蛇
//画游戏界面
QPainter painter(this);
QPen pen;
QBrush brush;
//背景图
QPixmap pix;
pix.load("D:/C++/1.jpg");
painter.drawPixmap(0,0,1524,950,pix);
//画蛇
pen.setColor(Qt::yellow);
brush.setColor(Qt::blue);
brush.setStyle(Qt::SolidPattern);
painter.setPen(pen);
painter.setBrush(brush);
2.通过keyPressEvent类引用对象来控制蛇的移动,通过按钮实现蛇的加速、减速
switch (event->key()) {
//朝上
case Qt::Key_Up:
if(moveFlag != DIR_DOWN){
moveFlag = DIR_UP;
}
break;
//朝下
case Qt::Key_Down:
if(moveFlag != DIR_UP){
moveFlag = DIR_DOWN;
}
break;
//朝左
case Qt::Key_Left:
if(moveFlag != DIR_RIGHT){
moveFlag = DIR_LEFT;
}
break;
//朝右
case Qt::Key_Right:
if(moveFlag != DIR_LEFT){
moveFlag = DIR_RIGHT;
}
break;
//暂停
case Qt::Key_K:
latency=50;timer->start(latency);
break;
case Qt::Key_M:
latency=400;timer->start(latency);
break;
3.通过使用QTimer来创造时延,同时可以规定蛇的速度和自行前进的动力
timer = new QTimer(this);
//使用QTimer定时器类,首先创建一个定时器类的对象
connect(timer,SIGNAL(timeout()),this,SLOT(counttimeout()));
//timer 超时后会发出timeout()信号,所以在创建好定时器对象后给其建立信号与槽
case Qt::Key_Space:
if(gamestart==false)//如果一开始就等于false,那么游戏是没开始的,那么按下空格键就会让游戏开始
{
gamestart = true;
// 可以把这里的界面改了,
// 改成初始界面选择速度
//启动定时器
timer->start(latency);
}
else
//表示gamestart一开始是true,说明游戏是正在进行的,那么就让gamestart变为false
{
gamestart=false;
timer ->stop();
}
4.吃到食物
//吃到食物
int counter = 1;
if(snake[0].intersects(rewardNode)){
counter++;
score++;
latency=latency-2;
timer->start(latency);
//吃到以后随机生成食物
addNewReward();
}