人工智能热潮兴起后,Python这种不太新的语言几乎在一夜之间“弯道超车”,占据了热门编程语言的Top10,成为众多人的热门对象。 在这里,我想告诉大家的是,Python之所以受欢迎,被大多数人接受,是因为在这个非常丰富的第三方库被调用,语法结构比较简单,追求效率的时代,它非常朴素。 但是,作为资深的软件工程师,对于初学者来说,Python一时爽,但绝对不要依赖库。 计算机经典算法和基础结构需要不断研究和探索。
本篇的主要内容是,通过Python Pygame制作简单的小游戏–Bomb Catching Game,将Python作为想进入软件编程行业的小白的敲门砖。 使用的工具主要是Python-3.7.2; pygame 1.9.6;
VSCodeUserSetup-x64-1.30.2。
游戏规则:在游戏窗口点击鼠标左键开始游戏。 通过在窗口内移动鼠标,移动窗口下方的矩形方木。 此时,画面上部会掉落一个黄色的小球,用户需要移动方木来接住。 如果无法准确捕捉,屏幕左上角的生命值将减去1。 接住的,右上角的分数是10,黄色的小球再次开始从屏幕上的随机位置落下。 生命值为0时,游戏结束。
设计要点:该游戏是Python中最简单的演示型游戏之一,主要应用的知识点有:鼠标事件监测(按下、移动)、图形绘制)、矩形和圆形)、分数变量的加减运算和执行后的具体效果如下。
参照代码如下。
1.import pygame,sys,random,time #指的是pygame (与游戏相关),与系统相关),与random ),与时间)延迟相关的库
2 .来自pygame .本地导入*
3 .在def print _ text (字体、x、y、文本、颜色=(255、255、255 ) )窗口中声明一个用文字表示的自定义函数
4.imgtext=font.render(text,True,color ) )定义一个文本变量,内容是由参数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 ) #将游戏窗口的标题设置为“bombcatchinggame”
9.font1=pygame.font.font(none,24 ) #设置字体样式和大小
10.pygame.mouse.set _ visible (假)隐藏游戏中的鼠标指针
11 .定义白色=255、255、255#白色这个变量,用三原色的白色表示数值
12 .定义一个变量red=220、50、50#red,用三原色的红色表示数值
13 .定义变量yellow=230、230、50#yellow,用三原色的黄色表示数值
14 .定义一个变量black、0、black,用三原色的黑色表示数值
15 .定义一个变量“lives=3# lives”,将其初始化为3以存储游戏中剩下的生命数
16 .定义一个变量score=0# score,初始化为0以存储游戏中的得分
17 .定义一个变量game _ over=true # game _ over,并将其分配给true、布尔变量和游戏结束标志位
18 .定义mouse _ x=mouse _ y=0#个变量,将初始化代入设为0,存储游戏中捕捉到的鼠标的x、y坐标值
19 .定义1个变量pos _ x=300 # pos _ x,初始化代入300。 它用于存储矩形方木当前位置的x坐标值
20 .定义1个变量pos _ y=460 # pos _ y,初始化代入460。 它用于存储矩形方木当前位置的y坐标值
21.bomb_x=random.randint (0,500 ) #定义一个名为bomb _ x的变量,用于存储球的当前位置的x坐标值,并初始化0到500之间的随机数
22 .定义名为bomb _ y=-50 # 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, “<click to play>”) #屏幕(100,200)位置以font1样式显示文字“<click to play>”
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