多语言展示
当前在线:125今日阅读:142今日分享:25

python实现飞船射击矩形的小游戏

本文介绍怎么利用python+pygame来实现飞船射击矩形的小游戏,效果图如下图:
工具/原料
1

Sublime Text

2

Git

游戏规则
1

启动程序后,程序全屏显示,并播放背景音乐及显示飞船、矩形、三条命(飞船)、最高分(获取文件的最高分)、分数(0)、等级(1)和最中间“Play”按钮;

2

点击“Play”或者按键盘“P”开始游戏,默认情况下,飞船在左边缘垂直居中,而矩形在右边缘顶部,并上下移动(先从上往下,到底部再往上,到了顶部再往下,这样一直循环);

3

游戏开始后,键盘上下键控制飞船上下移动,按空格键控制飞船射击,每次只能射击一次,当子弹消失在右边缘或者击中矩形,按空格键才能射击第二次;

4

游戏开始后,射中一次矩形得分50,当射中3次后,游戏升高一级;级别升高后,飞船移动速度和矩形移动速度都变的更快,射中一次的分数也变多;

5

游戏开始后,如果有三次未射中到矩形,游戏结束,并显示“Play”按钮。

新建类
1

新建类之前,需要先来分析一个公共模块file,代码如下图:  1.函数“load_file”用来读取文件的信息(为了方便,使用字典)并返回,使用“try...except...”,如果存在文件,则返回文件的信息(pickle.load(f));如果不存在文件,则输出错误信息并返回0;  2.函数“save_file”用来保存信息到文件,分两种情况,如果文件不存在(statsObj == 0),则直接把字典信息保存到文件;如果文件存在,则修改文件中的最高分数据。

2

根据游戏需要,新建类“Settings”,用来定义一些必须的基本属性和初始值(分析代码重点):  1.“game_active”用来控制游戏的开始(True)和停止(False);  2.最高分“high_score”获取文件的最高分数据,分两种情况,第一种情况,不存在文件的时候(statsObj == 0),显示0分;存在文件的时候,获取文件中最高分字段的数据;  3.函数“initialize_settings”用来初始化游戏的基本属性;  4.函数“increase_speed”用来实现等级提高后,飞船速度、子弹速度、矩形速度和分数变快和变多;  5.函数“reset_stats”重置游戏期间变化的基本属性,使点击“Play”后,基本属性是一致的。

3

新建类“Ship”,用来定义“Ship”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图:  1.调用“super(Ship, self).__init__()”,用于继承父类(Ship用到数组,需要精灵“Sprite”);  2.由于“ship_move_speed”设置1.5,所以这里需要设置“float(self.rect.centery)”,不加float会导致出问题;  3.函数“rotate”用来旋转图片,游戏有两处地方用到飞船,角度不一致;  4.函数“scale”使用“smoothscale”来进行缩放,可以产生比较平滑的图像(该函数的意义是,游戏有两处地方用到飞船,大小不一致);  5.函数“update”分两种情况,如果按下上箭头,则飞船往上移动(最高到顶部);如果按下下箭头,则飞船往下移动(最低到底部)。

4

新建类“Bullet”,用来定义“Bullet”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图:  1.调用“super(Bullet, self).__init__()”,用于继承父类(Bullet用到数组,需要精灵“Sprite”);  2.函数“update”用来增加x坐标,让子弹右飞行。

5

新建类“Rectangle”,用来定义“Rectangle”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图:  1.调用“super(Rectangle, self).__init__()”,用于继承父类(Rectangle用到数组,需要精灵“Sprite”);  2.由于“rectangle_move_speed”设置0.5,所以这里需要设置“float(self.rect.centery)”,不加float会导致出问题;  3.函数“update”分两种情况,先从上往下移动,到了底部再往上移动,而到了顶部再往下移动,如此循环。

6

新建类“Button”,用来定义“Button”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图:  1.注意函数“__init__”调用“self.prep_msg(msg)”,不然后面调用“draw_button”函数时,会找不到对象;  2.函数“prep_msg”用来将msg渲染为图像,并使其在按钮上居中(参数msg必须是字符串);  3.函数“draw_button”用来绘制一个用颜色填充的按钮,再绘制文本(文本在色块的中间)。

7

新建类“Scoreboard”,用来定义“Scoreboard”类的基本属性及初始值,和所需要的函数(分析重点代码),代码如下图:  1.函数“__init__”的“scaleValue”为左上角飞船图片的缩放值;  2.函数“prep_score”用来将得分转换为渲染的图像(代码中的“format”语句让得分显示格式为“1,000”);  3.函数“prep_high_score”用来将最高分转换为渲染的图像,显示在顶部中间;  4.函数“prep_level”用来将等级转换为渲染的图像,显示在分数下面;  5.函数“prep_ships”根据可射失数量“ship_limit”循环添加ship到编组(ships)里面;   4.函数“show_score”用来绘制可射失的数量图和游戏统计信息到屏幕上。

业务逻辑函数

文件“game_functions.py”存放跟游戏有关的所有业务逻辑函数(分析重点代码),代码如下图:  关于事件的函数:  1.函数“check_keydown_events”,当按下键盘下键“K_DOWN”,移动状态“move_down”为true;当按下键盘上键“K_UP”,移动状态“move_up”为true;当按下空格键“K_SPACE”,播放射击音效和发射子弹;当按下“P”键时(“K_p”),则开始游戏;当按下“Q”键时,则退出程序“sys.exit()”;  2.函数“check_keyup_events”,当松开下键“K_DOWN”,移动状态“move_down”为False;当松开上键“K_UP”,移动状态“move_up”为False;  3.函数“check_play_button”用来点击按钮“Play”开始游戏(执行函数“start_game”清空编组的数据和重置统计信息的数据);  4.函数“check_events”用来响应按键和鼠标事件,当点击屏幕关闭按钮“QUIT”,则保存最高分到文件并退出系统“sys.exit()”;当按键时(KEYDOWN),调用函数“check_keydown_events”;当松开按键时(check_keyup_events),调用函数“check_keyup_events”;当点击鼠标时(MOUSEBUTTONDOWN),判断是否按钮“Play”区域,如果是则调用函数“check_play_button”开始游戏。  关于文件的函数:  1.函数“save_file”用来存储最高分的数据到文件;  关于矩形的函数:  1.函数“create_rect”用来创建单个矩形,注意没有矩形才能创建,所以屏幕一直就只有一个矩形进行移动;  关于子弹的函数:  1.函数“fire_bullet”用来创建单颗子弹,按空格键才创建;  2.函数“check_bullet_rect_collisions”用来检查是否有子弹击中矩形:    1)如果击中,播放爆炸声音(explosiveSound.play());    2)计算得分“settings.score”,注意执行scoreboard.prep_score()来重新渲染分数;    3)调用函数“check_high_score”,如果分数大于最高分,则重新渲染分数到最高分;    4)如果每一关设置的通关数量“settings.level_number”为0,则执行“settings.increase_speed()”来提高速度和分数;  3.函数“update_bullets”:    1)当子弹没有击中矩形时(bullet.rect.right > screen.get_rect().right),删除创建的子弹,并减少可射失的数量(注意执行scoreboard.prep_ships(),不然左上角显示的飞船数量不会更新);    2)当可射失的数量“settings.ship_limit”为0时,停止游戏并显示按钮“Play”。   关于屏幕的函数:  1.函数“update_screen”用来更新屏幕的各种信息。

主函数

主函数用来初始化程序,并同步更新程序的信息,代码如下图(分析重点代码):  1.“pygame.init()”和“pygame.mixer.init()”用来初始化所有导入的 pygame 模块和全部音频;  2.“pygame.time.delay(1000)”程序等待1s让mixer完成初始化;  3.由于“pygame.mixer.music”一次只能播放一个,为了播放背景音乐同时又能播放音效,需要混合使用“pygame.mixer.Sound”(Sound不能使用mp3);    4.设置“while True”让程序一直运行,不然会导致程序闪退。

运行程序

如下图环境下(shootingrectangle.py文件路径下),执行语句“python shootingrectangle.py”,则弹出程序窗口,并可对其操作游玩。

推荐信息