软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计)

  • 实验内容
  • 编程语言以及开发环境的选择
  • 实验思路(游戏设计)
    • 一、游戏的逻辑设计
      • 1、猫头的生成
      • 2、鱼的生成
      • 3、猫头和鱼骨的移动
      • 4、按下键盘,改变方向
    • 二、主窗口的绘制
      • 1、使用drawImage显示背景图片
      • 2、使用drawLine绘制行线和列线
      • 3、使用drawText显示分数
      • 4、使用drawImage绘制猫头、鱼、鱼骨
    • 三、游戏开始与结束界面,以及主窗口的按钮
      • 1、开始游戏
      • 2、游戏速度设置
      • 3、猫咪选项设置
      • 4、结束游戏
      • 5、窗口中的按钮:暂停/开始、重来/退出
    • 四、游戏背景音乐

(由于搜寻图片素材、以及在对素材选择的纠结等细节上花费的时间过多,始终对成品不太满意,所以这个实验项目完成得较慢,完全做完才开始进行博客的编写。)

实验内容

1、实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右
控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,
蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏
结束界面。
2、进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进
行分值计算,可以设置游戏速度,游戏音乐等拓展元素。

编程语言以及开发环境的选择

和上一个项目一样,开发环境依然选用PyCharm,编程语言选用Python。

实验思路(游戏设计)

为了更有创意,在这个游戏中,我将贪吃蛇改为贪吃喵,制作了一只吃鱼的小猫,每吃到一条鱼,身后就多跟一个鱼骨。

一、游戏的逻辑设计

准备工作:
1)定义一个string用来存放猫头位置;
2)定义一个string用来存放鱼的位置;
3)定义一个列表用来存放猫头和鱼骨的位置;
4)定义一个direction来存放猫前进的方向;
5)定义一个score用来计分;
6)定义一个speed用来设置计时器的时间间隔,初始默认值是500ms;
7)定义两个String分别存放猫头和死亡猫头图片的路径。

1、猫头的生成

1)调出背景音乐;
2)随机选取猫头的行与列,生成猫头位置;
3)把猫头位置写入坐标列表中;
4)随机选择猫头前进的方向;
5)调用生成鱼的方法。

2、鱼的生成

1)随机选取鱼的行与列,生成鱼的位置;
2)若随机生成的鱼的位置不在猫头和鱼骨的坐标列表中,则返回鱼的位置,否则重新生成。

3、猫头和鱼骨的移动

此函数由QTimer的timeout函数触发
1)根据direction的值,猫头的行或列相应地+1或-1,并得到猫头坐标;
2)判断是否吃到鱼:

  1. 若吃到鱼了:
    · 鱼骨位置不变,在列表最前面插入猫头位置;
    · 分数score加10;
    · 调用生成鱼的方法,生成下一条鱼。
  2. 若没吃到鱼:
    ①若猫头和鱼骨没有相撞且猫头没有出界:
    · 移动所有鱼骨,即所有坐标等于它的前一个坐标;
    · 更新猫头位置,即将新的猫头坐标放在坐标列表索引为0的位置上。
    ②若猫头和鱼骨相撞或猫头出界,则调用GameOver,游戏结束。

4、按下键盘,改变方向

对QWidget中keyPressEvent方法的重写

1)按下 W 表示向上,direction = 0;
2)按下 S 表示向下,direction = 1;
3)按下 A 表示向左,direction = 2;
4)按下 D 表示向右,direction = 3;

(由于使用上下左右按键时,容易被之后设置在界面上的按钮干扰到,上下左右键去控制按钮,而不再控制猫头移动了。不想深究这个问题,所以直接用WSAD表示上下左右。)

二、主窗口的绘制

使用QPainter进行绘制

1、使用drawImage显示背景图片

2、使用drawLine绘制行线和列线

3、使用drawText显示分数

4、使用drawImage绘制猫头、鱼、鱼骨

定义一个索引:index = 0,表示坐标列表的索引,为0时画猫头,大于0时画鱼骨。遍历坐标列表:

1)若猫头没出界且没有与鱼骨相撞,则画猫头和鱼骨,画正常猫头和鱼骨;
2)若猫头出界了或与鱼骨相撞,则画死亡猫头和鱼骨;
3)画鱼。

三、游戏开始与结束界面,以及主窗口的按钮

1、开始游戏

1)开始游戏消息框的大小和样式设置;
2)click to start按钮的设置;
3)速度选项下拉框,设置Low、Middle、High三个速度选项,更改时触发speedChanging方法;
4)猫咪选项下拉框,有五种猫咪可选,更改时触发catChoosing方法;
5)退出游戏开始消息框,进入游戏主界面,调出背景音乐,生成猫头,游戏开始。

2、游戏速度设置

此方法由开始游戏中的速度下拉框的currentIndexChanged方法触发,由currentIndex()传递下拉框选中的项目的索引。

1)索引为1时,表示下拉框选中Low,speed设置为500ms;
2)索引为2时,表示下拉框选中Middle,speed设置为300ms;
3)索引为3时,表示下拉框选中High,speed设置为200ms;

若此方法未被触发,说明speed为默认值,500ms。

3、猫咪选项设置

此方法由开始游戏中的猫咪下拉框的currentIndexChanged方法触发,由currentIndex()传递下拉框选中的项目的索引。与游戏速度设置方法类似,判断传递过来的索引值,并设置相应的猫头图片和死亡猫头图片。

若此方法未被触发,说明head_pic和dead_pic为默认值,都是英短猫的对应图片。

4、结束游戏

1)背景音乐停止;
2)结束游戏消息框的大小和样式设置,并显示游戏得分;
3)设置 Retry 和 Exit 两个按钮;
4)若点击 Retry,则退出消息框,回到游戏主界面,调用生成猫头的方法,游戏开始;若点击 Exit,则退出程序。

5、窗口中的按钮:暂停/开始、重来/退出

1)点击暂停按钮则触发windowPause方法:计时器停止,暂停播放音乐;
2)点击继续按钮则触发windowContinue方法:计时器重新开始计时,继续播放音乐;
3)点击退出按钮则退出程序;
4)点击重新开始则重新生成猫头,游戏重新开始。

四、游戏背景音乐

使用pygame.mixer.music对音乐进行控制。

——2020/12/16(殷越)

软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计)相关推荐

  1. 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)

    软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(代码实现) 类变量的定义以及类的初始化__init__ 一.游戏的逻辑 1.猫头的生成 2.鱼的生成 3.猫头和鱼骨的移动 4.按下键盘,改变方向 二.主窗 ...

  2. 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(成品展示)

    软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(成品展示) 成品展示 1.开始游戏界面 2.游戏主界面 3.结束游戏界面 视频演示 成品展示 1.开始游戏界面 速度选择: 猫咪类型选择: 2.游戏主界面 ...

  3. 软件实习项目4——校园一卡通管理系统(成品展示)

    软件实习项目4--校园一卡通管理系统(成品展示) 成品展示 1.登录界面 2.密保验证 3.重置密码 4.主界面 视频演示 成品展示 1.登录界面 2.密保验证 3.重置密码 4.主界面 1)学生基本 ...

  4. 【训练4】猫吃鱼,狗吃肉(匿名内部类)

    [训练4]猫吃鱼,狗吃肉 参照下面的代码,创建Animal类的匿名子类对象,重写eat()方法,执行该方法后会在控制台打印"猫吃鱼,狗吃肉"字样. /*[训练4]猫吃鱼,狗吃肉* ...

  5. 【使用java swing制作简易贪吃蛇游戏】软件实习项目二

    一.项目准备 需求分析: 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后" ...

  6. 软件实习项目二:贪吃蛇的游戏开发

    目录 一.实验内容: 二.实验准备 三.程序代码 四.成果展示 一.实验内容: 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子.玩家能利用上下左右键控制" ...

  7. Java主人喂猫吃鱼的实验总结,小猫吃鱼的作文4篇

    小猫吃鱼的作文4篇 小猫吃鱼的作文1 夏天的一个星期天的早晨,万里晴空,骄阳似火.一只好看的小花猫肚子饿了,到野外找食吃.它来到小河边,看到河边的老槐树下拴着一条狗,黑黑的绒毛,四肢雪白,长长的尾巴往 ...

  8. JavaScript实现猫吃鱼小游戏

    贪吃猫小游戏 作为一名前端人员,撸猫我决定使用面向对象的方式书写贪吃猫小游戏,灵感来自有贪食蛇小游戏. 我们可以把整个游戏看成是一个游戏类,游戏类可以有各种各样的属性. 我们可以把贪吃猫中的猫作为一个 ...

  9. python入门小项目 | 开发一个《小猫抓鱼》小游戏

    小猫抓鱼 开发工具 讲解部分 一.游戏原理 二.游戏逻辑 三.重点代码实现 开发工具 python3.6.4 第三方库: pygame,random 讲解部分 一.游戏原理 游戏原理很简单,和接水果的 ...

最新文章

  1. 进程状态控制-进程创建
  2. vue手机端回退_华为官方教程:以 P40 为例,鸿蒙 OS 2.0 Beta 版本回退到 EMUI 11 稳定版...
  3. 导入os模块执行文件和目录管理操作
  4. 云调用,小程序鉴权正确姿势
  5. JS 常用函数二(改变HTML样式)
  6. Delphi通过Map文件查找内存地址出错代码所在行
  7. ps aux 中的状态说明
  8. Spring容器启动后注入service到Servlet并自动执行
  9. 用VB.net编写的Windows服务管理程序(堪称经典)全部源代码
  10. Zcash钱包(ZEC钱包)官方客户端常见命令实测(一)
  11. 这些单晶XRD测试问题你了解吗?(一)
  12. 身份证编号前六位对应地区(上)
  13. idb 怎么回复mysql_mysql中的.idb文件 怎么正常显示
  14. 蓝牙音乐和导航语音播放混音卡顿问题
  15. 美的集团的命,智能家居来续?
  16. 手机照片删了怎么恢复
  17. 从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己...
  18. 在网页项目中集成扫码枪设备,实现二维码扫码识别实战
  19. 用Java实现的eChat聊天服务器
  20. 今日干货|如何自学视频剪辑(自学视频剪辑容易吗)

热门文章

  1. ISP—图像调试实习生(第二天)
  2. 乡村老师网络计算机培训日志,乡村教师网络研修心得体会
  3. 每一个数据分析师都要掌握的方法:多维度分析法
  4. matplotlib绘制多维度分类散点图
  5. 黑龙江移动新魔百盒M411A_2+8_S905L3A_线刷固件包
  6. kubernetes存储:local,openEBS,rook ceph
  7. 淘宝API 淘宝链接获取解析获取商品id
  8. 【Spring Web教程】SpringBoot 实现一应用多Tomcat容器
  9. 概述史:五胡十六国过这么乱的历史怎么可能搞得懂?6000字短文帮您整个清清楚楚...
  10. [HNOI2006]鬼谷子的钱袋