当前位置: 首页 > news >正文

珠海工程建设信息网站品牌网站策划

珠海工程建设信息网站,品牌网站策划,如何推广网上国网,潍坊seo按天收费文章目录 #x1f3a5;前言#x1f4bc;安装Pygame#x1f50b;游戏的实现读写并存储【外星人入侵】游戏最高分游戏源码alien_invasion.pygame_functions.pyship.pyalien.pybullet.pybutton.pyscoreboard.pygame_stats.pysettings.py宇宙飞船和外星人的 .bmp类型文件 #… 文章目录 前言安装Pygame游戏的实现读写并存储【外星人入侵】游戏最高分游戏源码alien_invasion.pygame_functions.pyship.pyalien.pybullet.pybutton.pyscoreboard.pygame_stats.pysettings.py宇宙飞船和外星人的 .bmp类型文件 将游戏程序整理为 .exe文件第一步在pycharm中安装Pyinstaller库第二步生成 .exe可执行程序错误处理 将【外星人入侵】改变为【梅西vsC罗】及其他趣味改编方法 前言 本篇文章将介绍python游戏【外星人入侵】代码的环境安装具体介绍如何将游戏的最高分写入文件并在下次启动时读取、生成 .exe可执行文件、如何趣味性的改变游戏。游戏相关的所有源码已经在文章游戏实现———————游戏源码部分。 游戏介绍 玩家控制着一艘出现在屏幕底部的飞船使用左右键来左右移动飞船使用空格键来发射子弹玩家的任务就是击落每个从屏幕上方移动下来的外星人当外星人碰到飞船或者屏幕底部时该飞船被摧毁每个玩家可拥有艘飞船当三艘飞船都被摧毁时结束游戏并得出最高分。 由于不能上传视频给大家看一下游戏图片效果 有三个备用飞船中间的数字是最高得分每次打开游戏会加载右边最上面的数字是当前得分下面的数字是当前关卡等级。 安装Pygame 首先使用pip来安装Pygame目前下载的编译器大部分都是自带pip的如是更老的版本大家可以去搜索一下相关的安装方法也不难由于Python编译器在安装的过程中大多数人其实那时候还不会python然后在安装Pygame的时候发现编译器的路径不一样或者也找不到了终端命令也没用很难搞。所以我们直接使用 Pycharm 来安装Pygame这时候Pycharm的优势就体现出来了。这种的安装还是看视频教程比较靠谱给大家推荐一个短且非常有用的安装视频。 Pygame安装我是用的是里面的方法2.1亲测有效。 游戏的实现 由于网上有很多【外星人入侵】小游戏的教程我就不过多赘述原理了讲的也不一定比别人好代码直接在本模块后给大家主要将一下如何将游戏得到的最高分写入文件并在下次运行游戏时读取这个最高分。 读写并存储【外星人入侵】游戏最高分 此项目含有多个python文件如果要将最高分写入文件需要在此项目下文件夹中再多创建一个空白的.pkl文件文件这个文件负责读写玩游戏时取得的最高分要实现读取还需要在读写最高分文件的python程序中导入pickel模块。每次检测到即将退出游戏就保存当前最高分。 圈起来的部分就是主要进行读写最高分操作的python文件中需要添加的代码同时别忘了在文件夹中自己创建一个.pkl 的空白文件否则就会报错FileNotFoundError: [Errno 2] No such file or directory: high_score.pkl zhey这一点大家一定要注意。 下图是项目文件中添加的.pkl文件这个文件的名称必须与代码中读写文件的那个文件名相同。 在识别点击错号就退出这部分代码中也要调用一个保存最高分的函数 save_high_score() 如此就完美实现了将最高分存入文档并在下次运行游戏时读取最高分。 参考博客Python——Pygame实现Alien Invasion之用pickle类保存最高分至本地 这个博客讲的还是蛮清晰的但由于没有讲到必须要创建一个.pkl文件很多人都会在这里出错。 游戏源码 alien_invasion.py import pygame from settings import Settings # 导入外观设置类 from ship import Ship from alien import Alien import game_functions as gf # as gf是指定别名为了方便 from pygame.sprite import Group from game_stats import GameStates from button import Button from scoreboard import Scoreboarddef run_game():pygame.init()# 创建 设置类 的实例用来访问并修改 Settings类 里的内容ai_settings Settings()# 创建一个名为 screen 的显示窗口后面的参数是设置类里的屏幕属性screen pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))ship Ship(ai_settings, screen)pygame.display.set_caption(外星人入侵)# 创建Play按钮play_button Button(ai_settings, screen, Play)stats GameStates(ai_settings)sb Scoreboard(ai_settings, screen, stats)bullets Group()aliens Group()gf.create_fleet(ai_settings, screen, ship, aliens)# 开始游戏主循环while True:gf.check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets,sb)if stats.game_active:#重新绘制更新屏幕上的子弹和飞船ship.update()gf.update_bullets(ai_settings, screen, stats,sb,ship, aliens, bullets)gf.update_aliens(ai_settings, ship, aliens, stats, screen, bullets,sb)gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button) run_game() game_functions.py import sys import pygame from bullet import Bullet from alien import Alien from time import sleepdef check_keydown_events(event, ai_settings, screen, ship, bullets):if event.key pygame.K_RIGHT:ship.moving_right Trueelif event.key pygame.K_LEFT:ship.moving_left Trueelif event.key pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)def check_keyup_events(event, ship):if event.key pygame.K_RIGHT:ship.moving_right Falseelif event.key pygame.K_LEFT:ship.moving_left Falseelif event.key pygame.K_q:sys.exit()def check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets,sb):for event in pygame.event.get():# 用户点击错号就识别出来退出游戏退出程序if event.type pygame.QUIT:stats.save_high_score()sys.exit()# 按下方向键触发KEYDOWN事件elif event.type pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)# 松开方向键触发KEYUP事件elif event.type pygame.KEYUP:check_keyup_events(event, ship)elif event.typepygame.MOUSEBUTTONDOWN:mouse_x,mouse_ypygame.mouse.get_pos()check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y,sb) def check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y,sb ):button_clickedplay_button.rect.collidepoint(mouse_x,mouse_y)if button_clicked and not stats.game_active:#重置游戏设置ai_settings.initialize_dynamic_settings()#隐藏光标pygame.mouse.set_visible(False)# 重置游戏统计信息stats.reset_stats()stats.game_activeTrue# 清空外星人列表和子弹列表sb.prep_score()sb.prep_high_score()sb.prep_level()sb.prep_ships()aliens.empty()bullets.empty()#创建一群新的外星人并让飞船居中create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):# 每次循环完都要刷新屏幕并用背景色充满屏幕screen.fill(ai_settings.bg_color)# 在飞船和外星人后面重绘子弹for bullet in bullets.sprites():bullet.draw_bullet()# 使用 Ship类中的blitme方法 在底部绘制飞船ship.blitme()aliens.draw(screen)sb.show_score()#如果游戏处于非活动状态if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()def update_bullets(ai_settings, screen, stats,sb,ship, aliens, bullets):bullets.update()for bullet in bullets.copy():if bullet.rect.bottom 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen,stats,sb, ship, aliens, bullets)def check_bullet_alien_collisions(ai_settings, screen,stats,sb,ship, aliens, bullets):collisions pygame.sprite.groupcollide(bullets, aliens, True, True)if collisions:stats.scoreai_settings.alien_pointssb.prep_score()for aliens in collisions.values():stats.scoreai_settings.alien_points*len(aliens)sb.prep_score()check_high_score(stats, sb)# 检查外星人是否被消灭完if (len(aliens) 0):bullets.empty()ai_settings.increase_speed()create_fleet(ai_settings, screen, ship, aliens)#提高等级stats.level1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens) #检查是否是最高分 def check_high_score(stats, sb):if stats.score stats.high_score:stats.high_score stats.scoresb.prep_high_score()def fire_bullet(ai_settings, screen, ship, bullets):# 如果玩家按下空格就创建一个子弹实例,并将其加入到编组bullets中if len(bullets) ai_settings.bullets_allowed:new_bullet Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def get_number_aliens_x(ai_settings, alien_width):available_space_x ai_settings.screen_width - 2 * alien_widthnumber_aliens_x int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(ai_setting, screen, aliens, alien_number, row_number):alien Alien(ai_setting, screen)alien_width alien.rect.widthalien.x alien_width 2 * alien_width * alien_numberalien.rect.x alien.xalien.rect.y alien.rect.height 2 * alien.rect.height * row_numberaliens.add(alien)def create_fleet(ai_settings, screen, ship, aliens):alien Alien(ai_settings, screen)number_aliens_x get_number_aliens_x(ai_settings, alien.rect.width)number_rows get_number_rows(ai_settings, ship.rect.height,alien.rect.height)for row_number in range(number_rows):for alien_number in range(number_aliens_x):create_alien(ai_settings, screen, aliens, alien_number, row_number)# 计算外星人有多少行 def get_number_rows(ai_settings, ship_height, alien_height):available_space_y (ai_settings.screen_height -(3 * alien_height) - ship_height)number_rows int(available_space_y / (2 * alien_height))return number_rowsdef check_fleet_edges(ai_seetings, aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_seetings, aliens)break# 将整体外星人下移并改变他们的方向 def change_fleet_direction(ai_seetings, aliens):for alien in aliens.sprites():alien.rect.y ai_seetings.fleet_drop_speedai_seetings.fleet_direction * -1# 检查是否有外星人位于屏幕边缘并更新整群外星人的位置 def update_aliens(ai_settings, ship, aliens, stats, screen, bullets,sb):check_fleet_edges(ai_settings, aliens)aliens.update()if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb)check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb)def ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb):if stats.ships_left 0:# 相应被外星人撞到的飞将ship_left减1stats.ships_left - 1sb.prep_ships()# 清空子弹和外星人aliens.empty()bullets.empty()# 创建一群新的外星人并将飞船放到屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.game_active Falsepygame.mouse.set_visible(True)def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb):# 检查是否有外星人到达了屏幕底端screen_rect screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom screen_rect.bottom:# 与飞船被撞到是一样的方法ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb)breakship.py import pygame from pygame.sprite import Sprite class Ship(Sprite):def __init__(self,ai_settings,screen):super(Ship,self).__init__()self.screenscreenself.ai_settingsai_settingsself.imagepygame.image.load(ship.bmp) #加载同路径下的图片self.rectself.image.get_rect()self.screen_rectscreen.get_rect() #获取飞船图像的外接矩形# 让新飞船放在屏幕底部中央self.rect.centerxself.screen_rect.centerxself.rect.bottomself.screen_rect.bottomself.centerfloat(self.rect.centerx)self.moving_rightFalseself.moving_left Falsedef update(self):# 左右移动飞船if self.moving_right and self.rect.rightself.screen_rect.right:self.centerself.ai_settings.ship_speed_factorif self.moving_left and self.rect.left0:self.center-self.ai_settings.ship_speed_factorself.rect.centerxself.centerdef blitme(self):self.screen.blit(self.image, self.rect)def center_ship(self):self.centerself.screen_rect.centerxalien.py import pygame from pygame.sprite import Sprite class Alien(Sprite):def __init__(self,ai_settings,screen):super(Alien,self).__init__()self.ai_settings ai_settingsself.screenscreenself.image pygame.image.load(alien.bmp)self.rectself.image.get_rect()self.rect.xself.rect.widthself.rect.yself.rect.heightself.xfloat(self.rect.x)def blitme(self):self.screen.blit(self.image,self.rect)def update(self):#向左或者向右移动外星人撞墙后就反向移动self.x(self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)self.rect.xself.x#如果外星人撞到了屏幕边缘就返回Truedef check_edges(self):screen_rectself.screen.get_rect()if self.rect.rightscreen_rect.right:return Trueelif self.rect.left0:return Truebullet.py import pygame from pygame.sprite import Sprite class Bullet(Sprite):def __init__(self,ai_settings,screen,ship):super().__init__()self.screenscreen# 在(0,0)处创建一个表示矩形的子弹self.rectpygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerxship.rect.centerxself.rect.topship.rect.topself.yfloat(self.rect.y)self.colorai_settings.bullet_colorself.speed_factorai_settings.bullet_speed_factordef update(self):#更新表示子弹的小数值self.y-self.speed_factor#更新表示子弹的rect位置self.rect.yself.ydef draw_bullet(self):#在屏幕上绘制子弹pygame.draw.rect(self.screen,self.color,self.rect)button.py import pygame.font class Button():def __init__(self,ai_settings,screen,msg):self.screenscreenself.screen_rectscreen.get_rect()#设置按钮的尺寸和其他属性self.width,self.height200,50self.button_color(0,255,0)self.text_color(255,255,255)self.fontpygame.font.SysFont(None,48)#创建按钮的rect对象并让其居中self.rectpygame.Rect(0,0,self.width,self.height)self.rect.centerself.screen_rect.center#按钮的标签只需要创建一次self.prep_msg(msg)def prep_msg(self,msg):self.msg_imageself.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rectself.msg_image.get_rect()self.msg_image_rect.centerself.rect.centerdef draw_button(self):self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)scoreboard.py import pygame.ftfont from ship import Ship from pygame.sprite import Group class Scoreboard():def __init__(self,ai_settings,screen,stats):self.screenscreenself.screen_rectscreen.get_rect()self.ai_settingsai_settingsself.statsstats# 显示得分时的字体self.text_color(30,30,30)self.fontpygame.font.SysFont(arial,48)self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):rounded_scoreint(round(self.stats.score,-1))score_str{:,}.format(rounded_score)self.score_imageself.font.render(score_str,True,self.text_color,self.ai_settings.bg_color)self.score_rectself.score_image.get_rect()self.score_rect.rightself.screen_rect.right-20self.score_rect.top20def prep_high_score(self):high_scoreint(round(self.stats.high_score,-1))high_score_str {:,}.format((high_score))self.high_score_imageself.font.render(high_score_str,True,self.text_color,self.ai_settings.bg_color)self.high_score_rectself.high_score_image.get_rect()self.high_score_rect.centerxself.screen_rect.centerxself.high_score_rect.top20def prep_level(self):self.level_imageself.font.render(str(self.stats.level),True,self.text_color,self.ai_settings.bg_color)self.level_rectself.level_image.get_rect()self.level_rect.rightself.score_rect.rightself.level_rect.topself.score_rect.bottom10def prep_ships(self):self.shipsGroup()for ship_number in range(self.stats.ships_left):shipShip(self.ai_settings,self.screen)ship.rect.x10ship_number*ship.rect.widthship.rect.y10self.ships.add(ship)def show_score(self):self.screen.blit(self.score_image,self.score_rect)self.screen.blit(self.high_score_image,self.high_score_rect)self.screen.blit(self.level_image,self.level_rect)self.ships.draw(self.screen)game_stats.py import pickle class GameStates():def __init__(self,ai_settings):self.ai_settingsai_settingsself.reset_stats()self.game_activeFalseself.high_score0def reset_stats(self):#初始化在游戏期间可能变化的统计信息self.ships_leftself.ai_settings.ship_limitself.score 0self.level 1self.load_high_score()def save_high_score(self):fopen(high_score.pkl,wb)pickle.dump(str(self.high_score),f,0)f.close()def load_high_score(self):fopen(high_score.pkl,rb)try:str_high_scorepickle.load(f)self.high_scoreint(str_high_score)except EOFError:self.high_score0finally:f.close()settings.py class Settings():def __init__(self):self.screen_width1350self.screen_height780self.bg_color(230,230,230)#飞船设置self.ship_limit3#子弹设置self.bullet_width300self.bullet_height15#深灰色子弹self.bullet_color60,60,60self.bullets_allowed4# 外星人设置self.fleet_drop_speed25self.speedup_scale1.1#外星人点数的提高速度self.score_scale1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):self.ship_speed_factor1self.bullet_speed_factor3self.alien_speed_factor 0.7# fleet_direction 为1表示向右移动为-1表示向左移动self.fleet_direction 1#计分self.alien_points30def increase_speed(self):self.ship_speed_factor*self.speedup_scaleself.bullet_speed_factor*self.speedup_scaleself.alien_speed_factor*self.speedup_scaleself.alien_pointsint(self.alien_points*self.score_scale)宇宙飞船和外星人的 .bmp类型文件 将游戏程序整理为 .exe文件 第一步在pycharm中安装Pyinstaller库 有中文插件的话就打开左上方文件——设置——项目——python解释器——点击加号搜索Pyinstaller安装即可。 在pycharm底部会显示安装正在进行安装结束后这个进程就消失意味着安装成功。 第二步生成 .exe可执行程序 在pycharm终端中输入 pyinstaller -F alien_invasion.py如果你的游戏主程序不是 alien_invasion.py 也可使用 pyinstaller -F 主程序.py的形式 在终端输入后点击回车 这个命令运行结束后在此项目底下会生成一个 dist 文件夹里面包含一个可执行程序.exe文件这个.exe文件目前还是不能运行的还要将程序所需文件添加进 dist 中如外星人和宇宙飞船的bmp图如果你创建了读取最高分的文件还要将这个文件添加进这个文件中。 如此这个exe程序就能正常运行了。 错误处理 先声明一下并不是所有的设备都会出错如果上述操作都无误还出现了 .exe文件闪退的情况可能是字体有问题将代码中的字体由 None 改为一个系统自带的字体如arial 然后将上面生成的文件都删除再次在终端输入 pyinstaller -F alien_invasion.py生成 dist 文件后再将相关文件复制进 dist 文件即可。 如果要将可执行程序发送给好友需要将本模块提到的文件全部放入一个文件夹中再压缩为.zip文件好友点击文件中的.exe文件即可运行游戏好友不需要下载任何的编译器。 将【外星人入侵】改变为【梅西vsC罗】及其他趣味改编方法 相信了解过这个游戏的同学都知道如何修改以及修改后的效果了吧。 在网上找一张画质比较高的两个人物图片先抠图并缩放图片尺寸一定要和外星人、宇宙飞船的图片尺寸差不多再利用电脑自带的画图功能将这两张图片转化为 .bmp格式将这两个图片加入到项目中。 我这里给大家两张图片大家可以直接保存。如果大家想创作别的人物的话可以按照我上面的步骤来。 这就可以设置谁是‘外星人’谁是‘宇宙飞船’了我就将梅西设置为外星人C罗设置为宇宙飞船了啊仅供娱乐 假如我将一张命名为CR7.bmp一张命名为MESSI.bmp 然后将ship.py文件代码中的ship.bmp换成 CR7.bmp 将alien文件代码中的alien.bmp换成MESSI.bmp 当然由于抠图的底色是白的而我们代码中设置的RGB值(230,230,230)是浅灰色底色看起来就像图片放在屏幕上一样很难看。所以还要将这个参数改为255,255,255RGB值255,255,255是纯白色可以与抠图的底色完全融合。 最后将游戏名改为 梅西vsC罗可以不改 这样【梅西vsC罗】就做好了。
http://www.ihoyoo.com/news/37026.html

相关文章:

  • 网站建设域名和空间卖家如何做阿里巴巴国际网站
  • 网站qq登录原理网站建设管理ppt
  • 百度网站优化排名兰州做it网站运营的怎么样
  • 做网站后期费用官方网站建设的目标
  • 便宜的vps租用网站用jsp怎么做的购物网站
  • wordpress怎么写网站关键词和描述今天哈尔滨最新通告
  • 沈阳网站搭建画网站 模板
  • 网站怎么做透明导航影视公司网站设计
  • 大学生创业服务网站建设方案铜川网站seo
  • 做网站推广的方法app混合开发框架哪个好
  • 百度统计网站概况定制网络教研系统
  • 山东丽天建设集团网站哪个杭州seo好
  • 电子商务公司建设网站方案设计搭建wordpress靶机
  • 如何查询网站是否备案曲沃县建站塔山双喜
  • 微网站后台企业网页建设
  • 天津制作网站平湖专业网站制作
  • 乐山电商网站开发惠州网站建设教程
  • 做视频网站用什么源码苏州网站建设网
  • 网站建设 厦门logo库官网
  • 温州做网站制作高端娱乐网站建设
  • 怎么做网站空间wordpress主题带采集
  • 想做网站怎么做wordpress内置分页方法
  • 南通做网站公司哪家好wordpress 内容页调用
  • 珠海商城网站建设建一个网页
  • 有网站的源代码如何做网站淄博定制网站建设公司
  • 做美食直播哪个网站最好做网站最低服务器配置
  • 电影网站建设模板wordpress 盈利
  • 邹城市住房和建设局网站小马网站建设
  • 网站系统jsp模板哪个网站可以做ppt赚钱
  • 网站的建设与维护有什么作用货代网站建设