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

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

VSCodeUserSetup-x64-1.30.2。

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

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

参考代码如下:

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

2.frompygame.localsimport*

3.defprint_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("Bombcatchinggame")#设置游戏窗口的标题为“Bombcatchinggame”

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坐标值

「Python小游戏」Bomb Catching--代码分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

52.ifbomb_x>pos_xandbomb_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.ifpos_x<0:#如果木块的最左侧移出了窗口最左侧,则执行后续代码

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

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

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

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

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

pythonbombcatching.py

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

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

提取码:hyrw

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。