计算机软件实习项目二预习

一、问题分析和任务定义:

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();
         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值