python实现人接球的小游戏
本文介绍怎么利用python+pygame实现人接球的小游戏,游戏规则:游戏开始后,每一次会从顶部掉落一个球,底部有一个人可以左右移动接球;当人接住球时,右上角的积分会增加10分,而当人接不住球时,左上角的球数量会减1,当连续三次接不住球时,屏幕中间会显示“Game Over”并停止游戏,效果图如下图: Tips:游戏可优化的地方,增加等级(每接到多少球,球的速度变快或者球变多,注意等级变高,接球的分数也要跟着变)、增加游戏最高分、增加声效和碰撞效果等。
工具/原料
Sublime Text
Git
新建类
1、 根据游戏需要,新建类“Settings”,用来定义一些必须的基本属性和初始值: 1.scre髫潋啜缅en_width和screen_height用于设置屏幕宽高,后面为了方便操作,改为全屏显示; 2.bg_color用于设置屏幕背景色,系统默认是黑色; 3.people_move_speed用于设置人物左右移动速度,数值越大移动越快; 4.ball_drop_speed用于设置球落下的速度,数值越大速度越快(实现等级越高,速度越快,可以修改这里的值*基数); 5.game_score用于显示右上角的得分情况; 6.ball_score用于设置接到一个球得多少分(实现等级越高,分数越高,可以修改这里的值*基数); 7.ball_miss_number用于设置丢失多少个球就结束游戏。
2、 新建类“Ball”,用来定义“Ball”类的基本属性及初始值,和所需要的函数(分析重点代码),沪枭诽纾代码如下图: 1.调用“super(Ball, self).__init__()”,用于继承父类(Ball用到数组,需要精灵“Sprite”); 2.由于“ball_drop_speed”设置0.5,所以这里需要设置“float(self.rect.centerx)”,不加float会导致出问题; 3.函数“scale”使用“smoothscale”来进行缩放,可以产生比较平滑的图像(该函数的意义是因为该游戏有两个地方显示球,只是大小不一样); 4.函数“update”用来更新球y轴的位置,从而实现落下的效果。
3、 新建类“People”,用来定义“People”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图: 1.设置两个初始移动状态moving_left和moving_right用来判断左右移动; 2.函数“update”,当按下右键并且未到右边缘时(self.moving_right and self.rect.right < self.screen_rect.right),增加centerx的值,从而实现右移动效果(左移动原理类似); 3.函数“blitme”用来绘制人物图片到屏幕上(blit只会绘制到缓冲区,需要flip才能显示在屏幕)。
4、 新建类“Button”,用来定义“Button”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图: 1.注意函数“__init__”调用“self.prep_msg(msg)”,不然后面调用“draw_button”函数时,会找不到对象; 2.函数“prep_msg”用来将msg渲染为图像,并使其在按钮上居中(参数msg必须是字符串); 3.函数“draw_button”用来绘制一个用颜色填充的按钮,再绘制文本(文本在色块的中间)。
5、 新建类“Scoreboard”,用来定义“Scoreboard”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图: 1.函数“__init__”的“scaleValue”为左上角球图片的缩放值; 2.函数“prep_score”用来将得分转换为渲染的图像(代码中的“format”语句让得分显示格式为“1,000”); 3.函数“prep_balls”根据可接失数量“ball_miss_number”循环添加ball到编组(balls)里面; 4.函数“show_score”用来绘制可接失的数量图和游戏得分到屏幕上。
业务逻辑函数
1、 文件“game_functions.py”存放跟游戏有关的所有业务逻辑函数(分析重点代码),代洁船诼抨码如下图: 关于事件的函数: 1.函数“check_keydown_events”,当按下键盘右键“K_RIGHT”,移动状态“moving_right”为true;当按下键盘左键“K_LEFT”,移动状态“moving_left”为true;当按下“q”键时,则退出程序“sys.exit()”; 2.函数“check_keyup_events”,当松开右键“K_RIGHT”,移动状态“moving_right”为False;当松开左键“K_LEFT”,移动状态“moving_left”为False; 3.函数“check_events”用来响应按键和鼠标事件,当点击屏幕关闭按钮“QUIT”,则退出系统“sys.exit()”;当按键时(KEYDOWN),调用函数“check_keydown_events”;当松开按键时(check_keyup_events),调用函数“check_keyup_events”。 关于球的函数: 1.函数“create_ball”用来创建单个球,为了增加游戏趣味性,创建球的位置设置为随机(randint(0, settings.screen_width)); 2.函数“update_balls”: 1)当程序没有球的时候(len(balls)),创建一个球,保证程序只有一个球落下; 2)当人接住球时(pygame.sprite.spritecollideany),删掉创建的球,并增加游戏得分(注意执行scoreboard.prep_score(),不然不会更新最新分数); 3)当人没接住球,球落到底部时(ball.rect.bottom >= screen_rect.bottom),删除创建的球,并减少可接失的数量(注意执行scoreboard.prep_balls(),不然左上角显示的球数量不会更新); 4)当可接失的数量“settings.ball_miss_number”为0时,显示“Game Over”并停止程序。
主函数
1、 主函数用来初始化程序,并同步更新程序的信息,代码如下图(分析重点代码): 1.“pygame.init()”初始化所有导入的 pygame 模块; 2.“pygame.display.set_mode((0, 0), pygame.FULLSCREEN)”全屏显示; 3.设置“while True”让程序一直运行,不然会导致程序闪退; 4.“screen.fill”设置背景色; 5.调用“balls.draw”来绘制编组里面创建的所有球到屏幕上; 6.调用“pygame.display.flip()”,不然屏幕会显示空白。
运行程序
1、 如下图环境下(catchball.py文件路径下),执行语句“python catchball.py”,则弹出程序窗口,并可对其操作游玩。