在人工智能热兴起后,Python这门不算很新的语言,几乎一夜之间就“弯道超车”,占据了热门编程语言的Top10,成为众多人追捧的对象。在此,我想告诉大家的是,Python之所以被追捧,被大多数人所接受,那是因为它有着非常丰富的第三方的库可供调用,语法结构又相对简单,在这个追求效率的时代,是非常接地气的。不过,作为资深的软件工程师,对于初学者,我的忠告是:Python一时爽,但千万不要对库产生依赖,计算机的经典算法和底层结构还是需要不断地研究和探索的。


本篇的主要内容是,通过Python+Pygame来制作一个简单的小游戏--Bomb Catching Game,作为一些想以Python作为踏入软件编程行业的小白的敲门砖。用到的工具主要有:Python-3.7.2;pygame 1.9.6;

VSCodeUserSetup-x64-1.30.2。

游戏规则:在游戏窗口单击鼠标左键开始游戏。通过在窗口内移动鼠标来移动窗口下方的长方形木块,此时,会从屏幕顶部掉落1个黄色的小球,用户必须移动木块去接住小球。如果不能准确接住,屏幕左上方的生命值会被扣除1,接住的,右上方分数+10,黄色小球从屏幕上方的随机位置重新开始下落。当生命值为0时,游戏结束。

设计要点:该游戏为Python中最简单的演示型游戏之一,主要应用到的知识点为:鼠标事件的监测(按下、移动)、图形绘制(圆形、矩形)、图形的碰撞检测(矩形和圆形)、分数变量的加减运算和图形窗口的创建与刷新。运行后的具体效果如下所示:

参考代码如下:

1.import pygame, sys, random, time #引用pygame(游戏相关)、sys(系统相关)、random(随机数相关)、time(延时相关)库

2.from pygame.locals import *

3.def print_text(font, x, y, text, color=(255,255,255)): #声明1个在窗口上进行文字显示的自定义函数

4. imgtext = font.render(text, True, color) #定义1个文本变量,内容为参数text传递的字符串,颜色为color(255,255,255),即白色字

5. screen.blit(imgtext, (x,y)) #在窗口以左上角为(0,0)点的坐标系中,参数X、Y对应的位置显示该本文

6.pygame.init() #初始化pygame库

7.screen = pygame.display.set_mode((600, 500)) #设置游戏窗口的显示大小为宽600,高500

8.pygame.display.set_caption("Bomb catching game") #设置游戏窗口的标题为“Bomb catching game”

9.font1 = pygame.font.Font(None, 24) #设置字体样式及大小

10.pygame.mouse.set_visible(False) #设置游戏中鼠标指针为不可见

11.white = 255,255,255 # 定义1个名为white的变量并赋值为3原色的白色表示数值

12.red = 220, 50, 50 # 定义1个名为red的变量并赋值为3原色的红色表示数值

13.yellow = 230,230,50 # 定义1个名为yellow的变量并赋值为3原色的黄色表示数值

14.black = 0,0,0 # 定义1个名为black的变量并赋值为3原色的黑色表示数值

15.lives = 3 # 定义1个名为lives的变量并初始化赋值为3,用来存储游戏过程中的剩余生命的条数

16.score = 0 #定义1个名为score的变量并初始化赋值为0,用来存储游戏过程中的得分数

17.game_over = True #定义1个名为game_over的变量并赋值为True,布尔型变量,游戏是否结束标志位

18.mouse_x = mouse_y = 0 #定义2个变量并初始化赋值为0,用来存储游戏过程中捕获到的鼠标的X、Y坐标值

19.pos_x = 300 #定义1个名为POS_X的变量并初始化赋值为300,用来存储矩形木块的当前位置的X坐标值

20.pos_y = 460 #定义1个名为POS_Y的变量并初始化赋值为460,用来存储矩形木块的当前位置的Y坐标值

21.bomb_x = random.randint(0,500) #定义1个名为bomb_X的变量并初始化赋值为0~500之间的一个随机数,用来存储圆球的当前位置的X坐标值

22.bomb_y = -50 #定义1个名为bomb_Y的变量并初始化赋值为-50,用来存储圆球的当前位置的Y坐标值

23.vel_y = 0.7 #定义1个名为vel_y的常量并赋值为0.7,其为圆球下落的步长值

24.while True: #程序主循环,一般为死循环

25. for event in pygame.event.get(): #系统事件消息监测,计算机系统产生的所有操作消息,在for循环中进行遍历,对需要进行响应的消息进行判断并做出响应

26. if event.type == QUIT: #系统要求退出当前的游戏窗口,即结束游戏

27. sys.exit() #退出,执行后游戏窗口被关闭

28. elif event.type == MOUSEMOTION: #鼠标移动了

29. mouse_x,mouse_y = event.pos #获取当前的鼠标所在位置坐标,并对变量值进行刷新

30. move_x,move_y = event.rel #定义2个变量move_x、move_y

,同时获取当前操作鼠标在X和Y方向上移动的相对值,并对变量进行刷新

31. elif event.type == MOUSEBUTTONUP: #鼠标按下后抬起事件,游戏开始时提示“按下鼠标开始游戏”后会执行以下代码

32. if game_over: #如果游戏结束标志位为True,则执行后续操作

33. game_over = False #将游戏结束标志位置为False,开始游戏

34. lives = 3 #游戏剩余生命数恢复初始化数值

35. score = 0 #游戏得分初始化清零

36. keys = pygame.key.get_pressed() #定义列表keys,同时监听键盘按键事件的消息并将所有消息存入到keys列表中

37. if keys[K_ESCAPE]: #判断是否有ESC键按下

38. sys.exit() #退出游戏

39. screen.fill((0,0,100)) #以RGB(0,0,100)的颜色,即蓝色,绘制游戏窗口

40. if game_over: #如果游戏结束标志位为True,则执行后续代码

41. print_text(font1, 100, 200, "") #屏幕(100,200)位置以font1样式显示文字“”

42. else: #游戏尚未结束,则执行后续代码

43. bomb_y += vel_y #改变圆球的Y坐标,使其增加0.7,即圆球在屏幕中的位置会下落0.7

44. pygame.time.wait(10) #程序等待10毫秒后再执行后续代码

45. if bomb_y > 500: #位置判断,如果圆球的Y坐标超过500,即圆球从游戏窗口的下边框移出窗口

46. bomb_x = random.randint(0, 500)#重新随机调整圆球的X坐标,即在游戏窗口中的左右位置

47. bomb_y = -50 #让圆球重新回到游戏窗口上边框以外,即圆球下落超出窗口后会重新回到上边重新开始新1轮的下落

48. lives -= 1 #圆球超出下边框后,即木块没有接住圆球,生命值减1

49. if lives == 0: #如果生命值为0后,执行后续代码

50. game_over = True #将游戏结束标志位置为True,在while True的下1次循环时会触发上述的“ if game_over:”代码,使游戏结束。

51. elif bomb_y > pos_y: #如果圆球的Y坐标大于木块的Y坐标,即圆球和木块在同1高度时,执行后续代码

52. if bomb_x > pos_x and bomb_x < pos_x + 120:#进一步判断圆球和木块的X坐标,如果圆球的X坐标在木块的左侧和右侧坐标值之间,即此时圆球和木块重叠,执行后续代码

53. score += 10 #木块接住了圆球,游戏得分加10

54. bomb_x = random.randint(0, 500)#圆球重新随机调整X坐标值

55. bomb_y = -50#圆球被接住,重新回到窗口上边框以外,进行新1轮的下落

56. pygame.draw.circle(screen, black, (bomb_x-4,int(bomb_y)-4), 30, 0) #在bomb_x左偏4,bomb_y上偏4的位置为圆心绘制1个半径为30的黑色圆

57. pygame.draw.circle(screen, yellow, (bomb_x,int(bomb_y)), 30, 0)#在bomb_x,bomb_y的位置为圆心绘制1个半径为30的黄色圆

58. pos_x = mouse_x #将当前鼠标所在位置的X值赋值给木块的X位置,即移动木块左右位置到当前鼠标所在的位置,但木块的上下位置不变

59. if pos_x <0: #如果木块的最左侧移出了窗口最左侧,则执行后续代码

60. pos_x = 0#强制让木块停留在游戏窗口的最左边框处

61. elif pos_x > 500:#如果木块的最右侧移出了窗口最右侧,则执行后续代码

62. pos_x = 500#强制让木块停留在游戏窗口的最右边框处

63. pygame.draw.rect(screen, black, (pos_x-4,pos_y-4,120,40), 0)# 在pos_x左偏4,pos_y上偏4的位置为起点绘制1个长为120,宽为40的黑色矩形

64. pygame.draw.rect(screen, red, (pos_x,pos_y,120,40), 0)# 在pos_x,pos_y的位置为起点绘制1个长为120,宽为40的红色矩形

65. print_text(font1, 0, 0, "Lives:" + str(lives))#在游戏窗口(0,0)位置,以font1样式显示文字“Lives:”和当前的剩余生命值

66. print_text(font1, 500, 0, "Score:" + str(score))#在游戏窗口(500,0)位置,以font1样式显示文字“Score:”和当前的游戏得分值

67. pygame.display.update() #刷新游戏窗口的显示


注意事项:

1.对于游戏而言,窗口显示的图形的变化,其实就是其利用while True死循环在不断地刷新显示的内容,通过修改显示的内容的位置或文本信息来得到图形运动或分数更新的效果。

2.代码第56行和第63行为什么要各自多画一个黑色的圆和矩形呢?其实运行整个游戏后就会发现,圆和矩形其实各有2个,黑色图形大部分被后画的遮挡住了,多出来的那4个偏移,正好形成圆和矩形的阴影,使得画面看上去更加的逼真,显示效果更好。

3.后画的图案会叠加到先画的图案上面。

4.VSCode保存后的Python文件扩展名为.py,在windows系统上不能直接双击运行,我们可以在该.py文件的同目录下创建1个.bat文件进行启动和执行,.bat文件的文件名没有特殊要求,内容为:

python bombcatching.py


本篇例程的源代码可从百度云进行下载:

链接:https://pan.baidu.com/s/1EZRK5D1b7pVcSvc6tOI1yA

提取码:hyrw

python游戏设计需求分析_「Python小游戏」Bomb Catching--代码分析相关推荐

  1. python弹球游戏实验报告_弹珠小游戏课程设计实验报告

    摘要: 这个小程序是关于弹珠的小游戏, 游戏比较简单, 以小球的速度来区分游戏的难易. 该小程序是用左右键控制游戏的开始和挡板的方向,不让小球落到底端,当然,小球的 速度越快,该游戏的难度也就越大.此 ...

  2. python生成一笔画_一笔画小游戏-算法-python+autojs

    一笔画小游戏,好玩的很 就是到了后面比较麻烦,手动找路径太慢了,作为程序员,这又是一个锻炼的好机会是不是!于是乎,了解了一下dfs和bfs算法(都是路径搜索算法),然后就开撸: #pointArr=[ ...

  3. python撩妹技能_猜数字小游戏python实现(可用来撩妹撩汉)

    import random import time number = random.randint(0,199) print("----------猜数字小游戏----------" ...

  4. python做地图导航_「Python」利用高德地图做你想做之事

    玩grasshopper基本上都知道OpenStreetMap 这个地图网站,毕竟有一个好用的地图插件,可以在Rhino中绘制出所需,但是一个不好的地方就在于国内的数据量太少,无法满足我们的需求. 此 ...

  5. java小游戏飞机大战_飞机大战小游戏Java(1)

    雷电游戏大家应该很多都玩过吧(至少95后的我有段时间一直玩····没玩过可能你太年轻了hhh),然后我们今天做一个类似的小游戏.软件:eclipse.exe 编程语言:JAVA 首先,还是要做个窗口界 ...

  6. 基于android平台unity3d游戏设计与实现,Unity3D微信小游戏平台的设计与实现毕业设计(论文)开题报告及工作计划书...

    四.主要参考文献 (8-10篇) [1]  朱玉.基于Unity3D漫游系统的设计与研究[J].信息安全与技术,2014,12:78-81 [2]  蒋元,蔡胜军,何绍勇,祁玮.基于Unity3D的虚 ...

  7. matlab软件imag函数_「复变函数与积分变换」基本计算代码

    使用了Matlab代码,化简平时遇到的计算问题,也可以用于验算结果 来自211工科专业2学分复变函数与积分变换课程 求复角主值 sym(angle(待求复数))%公式 sym(angle(1+sqrt ...

  8. python猜大小程序_「每日一练」巧用python实现猜大小的游戏

    import random 调用random函数,用来生成一个随机数 第二行: def guess(): num=random.randint(1,10) 定义一个guess的函数,刚开始先随机生成一 ...

  9. python闹钟界面程序_「Python编程」自由管理时间之编写一个小闹钟起床

    Python_时间管理 代码中的时间时间戳(Timestamp):1473525444 时间字符串(Format String):2015-02-14 11:25:11 结构化时间:(struct_t ...

  10. python从零开始到精通_「Python 入门学习指南」0基础小白助你从入门到精通!

    Python比较简单,非常适合初学者入门,内置了各种库,还有丰富的大约13万第三方库,掌握了语法和编程思维后,可以直接使用这些库做出自己的产品.这篇 Python 入门学习指南,针对没有任何编程经验. ...

最新文章

  1. java转安卓快吗_安卓Kotlin开发系列之Java快速转Kotlin
  2. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
  3. [BUAA-SE-2018]结对作业测试报告
  4. .NET垃圾回收笔记
  5. CNN的几种经典模型
  6. URL转微信可识别的二维码
  7. 【毕业前夕,畅谈科研】一个清华土著的科研感想
  8. kettle使用记录
  9. 论各类BI工具的“大数据”特性!
  10. iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆
  11. vue前端动态分页模板(记录)
  12. 构建之法1,5,17章学习心得
  13. ros操作系统的介绍
  14. 如何在html中加入背景,html中如何加入背景图片
  15. windows画图板 ESL转RGB 实现区间渐变色
  16. 高中关于人工智能方面的课题_人工智能的课题有什么研究方向
  17. bzoj 4398:福慧双修
  18. JVM垃圾回收中新生代老生代的问题
  19. 有限个无穷小的乘积也是无穷小
  20. 又修改了显示器和电源机箱的配置

热门文章

  1. ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
  2. .net MVC小尝试
  3. CnForums1.0 Alpha RC1 发布
  4. BlockingQueue原理分析(ReentrantLock、Condition的实践)
  5. HashSet源码阅读
  6. 从源码角度分析RocketMQ同步刷盘与异步刷盘的异同
  7. python使用临时文件
  8. Ubuntu下多个gcc版本之间的切换
  9. 造假家族覆灭记:警方联合阿里斩断涉案三千万假耐克产销链
  10. Zuul使用Ribbon配置自动重试