python精品教学课件(温州大学)实验6 游戏:外星人入侵
- 格式:doc
- 大小:31.50 KB
- 文档页数:4
Python外星⼈⼊侵游戏编程完整版PYTHON游戏编程外星⼈⼊侵的完整实现思路,具体内容如下准备⼯作:下载python,⽐如Anaconda3(64 bit),导⼊pygame游戏包1.外星⼈设置,alien.py,代码:import pygamefrom pygame.sprite import Spriteclass Alien(Sprite):"""表⽰单个外星⼈的类"""def __init__(self,ai_settings,screen):"""初始化外星⼈并设置其他位置"""super(Alien,self).__init__()self.screen = screenself.ai_settings = ai_settings#加载外星⼈图像,并设置其rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()#每个外星⼈最初都在屏幕左上⾓附近self.rect.x = self.rect.widthself.rect.y = self.rect.height#存储外星⼈的准确位置self.x = float(self.rect.x)def blitme(self):"""在指定位置绘制外星⼈"""self.screen.blit(self.image,self.rect)def check_edges(self):"""如果外星⼈位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truedef update(self):"""向右移动外星⼈"""self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.x2.游戏主程序,alien_invasion.py,代码:import pygamefrom settings import Settingsfrom game_stats import GameStatsfrom button import Buttonfrom ship import Shipfrom pygame.sprite import Groupimport game_functions as gffrom scoreboard import Scoreboarddef run_game():pygame.init() # 初始化背景设置ai_settings = Settings() # 全局设置screen = pygame.display.set_mode( # 创建screen显⽰窗⼝(ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption('Alien Invasion') # 标题#新建Play按钮play_button = Button(ai_settings,screen,"Play")#创建⼀个⽤于存储游戏统计信息的实例,并创建记分牌stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)# 创建飞船ship = Ship(ai_settings,screen)# 创建⼦弹编组bullets = Group()#创建⼀个外星⼈aliens = Group()#创建外星⼈群gf.create_fleet(ai_settings,screen,ship,aliens)# 开始游戏主循环while True:# 监视键盘和⿏标事件gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets) if stats.game_active:# 移动飞船gf.update_ship(ship)# 更新⼦弹位置gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)#更新外星⼈gf.update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets)# 更新屏幕gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button) run_game()3.设置⼦弹,bullet.py,代码:import pygamefrom pygame.sprite import Spriteimport timeclass Bullet(Sprite):'''飞船⼦弹进⾏管理'''def __init__(self,ai_settings,screen,ship):super(Bullet,self).__init__()self.screen = screen# 创建⼦弹矩形初始位置(0,0,3,15)分别对应lef,top,宽,⾼self.rect = pygame.Rect(0,0,ai_settings.bullet_width, ai_settings.bullet_height)self.rect.centerx = ship.rect.centerx # 设置中⼼点x轴坐标跟飞船⼀致self.rect.top = ship.rect.top # 设置y轴坐标顶部跟飞船⼀致# 设置成⼩数进⾏计算self.top = float(self.rect.top)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):self.top -=self.speed_factorself.rect.top = self.topprint(self.rect.top)def draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)4.设置Play按钮,button.py,代码:import pygame.fontclass Button():def __init__(self,ai_settings,screen,msg):"""初始化按钮属性"""self.screen = screenself.screen_rect = screen.get_rect()#设置按钮的尺⼨和其他属性self.width,self.height = 200,50self.button_color = (0,255,0)self.text_color = (255,255,255)self.font = pygame.font.SysFont(None,48)#创建按钮的rect对象,并使其居中self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center#按钮的标签只需创建⼀次self.prep_msg(msg)def prep_msg(self,msg):"""将msg渲染为图像,并使其在按钮上居中"""self.msg_image = self.font.render(msg,True,self.text_color,self.button_color) self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center =self.rect.centerdef draw_button(self):#绘制⼀个⽤颜⾊填充的按钮,再绘制⽂本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)5.设置游戏功能,game_functions.py,代码:import sysimport pygamefrom bullet import Bulletfrom alien import Alienfrom time import sleepdef check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):# 监视键盘和⿏标事件for event in pygame.event.get():if event.type == pygame.QUIT: # 关闭窗⼝退出sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event,ai_settings,screen,ship,bullets)elif event.type == pygame.KEYUP:check_keyup_events(event,ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x, mouse_y) def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x, mouse_y): """在玩家单击Play按钮时开始游戏"""button_clicked = play_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_active = True#重置计分牌图像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) # 设置背景颜⾊ship.blitme() # 绘制飞船aliens.draw(screen)# 循环⼦弹组⾥⾯的元素,进⾏绘制为空时不执⾏for bullet in bullets.sprites():bullet.draw_bullet() # 绘制⼦弹#显⽰得分sb.show_score()#如果游戏处于⾮活跃状态,就显⽰Play按钮if not stats.game_active:play_button.draw_button()# 显⽰最新屏幕,擦拭旧屏幕pygame.display.flip()# print('1')def 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)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):'''更新⼦弹位置,删除⼦弹'''bullets.update() # ⼦弹组每个成员执⾏self.update()操作for bullet in bullets.sprites():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:for aliens in collisions.values():stats.score += ai_settings.alien_points * len(aliens)sb.prep_score()check_high_score(stats,sb)if len(aliens)==0:#删除现有的⼦弹并新建⼀群外星⼈,加快游戏进度节奏bullets.empty()ai_settings.increase_speed()#提⾼等级stats.level += 1sb.prep_level()create_fleet(ai_settings,screen,ship,aliens)def update_ship(ship):ship.update()def fire_bullet(ai_settings,screen,ship,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 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 create_aliens(ai_settings,screen,aliens,alien_number,row_number): """创建⼀个外星⼈并将其放在当期⾏"""alien = Alien(ai_settings,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_aliens(ai_settings,screen,aliens,alien_number,row_number)def check_fleet_edges(ai_settings,aliens):"""有外星⼈到达边缘时采取相应措施"""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)breakdef change_fleet_direction(ai_settings,aliens):"""将整群外星⼈下移,并改变他们的运动⽅向"""for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets):"""响应被外星⼈撞到的飞船"""if stats.ships_left > 0:#将ship_left减1stats.ships_left -= 1#更新记分牌sb.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,sb,ship,aliens,bullets): """检查是否有外星⼈到达屏幕低端"""screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:#像飞船被撞到⼀样进⾏处理ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)breakdef update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets):"""更新外星⼈群中所有外星⼈的位置"""check_fleet_edges(ai_settings,aliens)aliens.update()#检测外星⼈和飞船之间的碰撞if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)#检查是否有外星⼈到达屏幕低端check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets)def check_high_score(stats,sb):"""检查是否诞⽣了新的最⾼纪录"""if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()6.游戏统计信息,game_stats.py,代码:class GameStats():"""跟踪游戏的统计信息"""def __init__(self,ai_settings):"""初始化统计信息"""self.ai_settings = ai_settingsself.reset_stats()#游戏刚启动时处于⾮活动状态self.game_active = False#在任何情况下不应该重置最⾼分self.high_score = 0self.level = 1def reset_stats(self):"""初始化在游戏运⾏期间可能变化的统计信息"""self.ships_left = self.ai_settings.ship_limitself.score = 07.分数设置,scoreboard.py,代码:import pygame.fontfrom pygame.sprite import Groupfrom ship import Shipclass Scoreboard():"""显⽰得分信息的类"""def __init__(self, ai_settings, screen, stats):"""初始化显⽰得分涉及的属性"""self.screen =screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = stats#显⽰得分信息时使⽤的字体设置self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)#准备初始化得分图像和当前最⾼分数self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""将得分转换为⼀幅渲染的图像"""rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)#将得分放在右上⾓self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 5def prep_high_score(self):"""将最⾼得分转换为渲染图像"""high_score = int(round(self.stats.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color) #将最⾼分放在屏幕最中央self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = 5def prep_level(self):"""将等级转换为渲染图像"""self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color) #将得分放在右上⾓self.level_rect = self.score_image.get_rect()self.level_rect.right = self.screen_rect.rightself.level_rect.top = self.score_rect.bottomdef prep_ships(self):"""显⽰还剩下多少艘飞船"""self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.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)8.设置,settings.py,代码:class Settings():'''存储外星⼈⼊侵中所有的设置'''def __init__(self):'''初始化设置'''#屏幕设置self.screen_width = 1200self.screen_height = 600self.bg_color = (230,230,230) # 设置背景⾊灰⾊#飞船设置self.ship_limit = 3self.ship_image_path = 'images/ship.bmp' # 飞船图⽚路径#⼦弹设置self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60,60,60self.bullets_allowed = 3 # 允许屏幕中出现⼦弹的数量#外星⼈设置self.fleet_drop_speed = 10#以什么样的速度加快游戏节奏self.speedup_scale = 1.1#外星⼈点数提⾼速度self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""初始化随游戏进⾏⽽变化的设置"""self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 1#fleet_direction为1表⽰向右移,为-1表⽰向左移self.fleet_direction = 1#计分self.alien_points = 50def increase_speed(self):"""提⾼速度设置,外星⼈点数"""self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)print(self.alien_points)9.飞船设置,ship.py,代码:import pygamefrom pygame.sprite import Spriteclass Ship(Sprite):'''飞船所有信息'''def __init__(self,ai_settings,screen):"""初始化飞船,并设置其起始位置"""super(Ship,self).__init__()self.screen=screenself.ai_settings = ai_settings# 加载飞船图⽚、获取外接矩形self.image = pygame.image.load(self.ai_settings.ship_image_path) # 加载图⽚self.image = pygame.transform.smoothscale(self.image,(40,60))self.rect = self.image.get_rect() # 获取图⽚外接矩形self.screen_rect = screen.get_rect() #获取屏幕外接矩形# 将每搜新飞船放到并⽊底部中⼼self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 设置成浮点类型self.center = float(self.rect.centerx) # self.rect.centerx设置不了浮点数只能另设置⼀个变量进⾏运算 # 移动标志self.moving_right = Falseself.moving_left = Falsedef blitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image,self.rect)def update(self):# 向右移动飞船if self.moving_right and self.rect.right < self.screen_rect.right:self.center +=self.ai_settings.ship_speed_factor# 向左移动飞船if self.moving_left and self.rect.left > self.screen_rect.left:self.center -= self.ai_settings.ship_speed_factorself.rect.centerx = self.centerdef center_ship(self):"""让飞船在屏幕上居中"""self.center = self.screen_rect.centerx效果展⽰:游戏资源:图⽚资源更多关于python游戏的精彩⽂章请点击查看以下专题:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Python实战之外星⼈⼊侵游戏⽰例代码⽬录0.前⾔1.效果展⽰2.实现代码2.1 image2.2 alien_invasion.py2.3 alien.py2.4 bullet.py2.5 button.py2.6 game_stats.py2.7 scoreboarf.py2.8 settings.py2.9 ship.py0.前⾔最近学习的python第⼀个项⽬实战,《外星⼈⼊侵》,成功实现所有功能,给⼤家提供源代码环境安装:python 3.7+ pygame安装 pygamepip install -- user pygame或者conda install --user pygame1.效果展⽰先展⽰效果,消灭外星⼈,有三条命,按Q是退出全屏,空格键是⼦弹,按下play键开始游戏,击败外星⼈飞船会有积分加,三条命之后需要点击play才能再次启动2.实现代码外星⼈⼊侵⼩游戏⽂件排版如下,先创建这⼏个.py⽂件2.1 image2.2 alien_invasion.pyimport sysfrom time import sleepimport pygamefrom settings import Settingsfrom ship import Shipfrom bullet import Bulletfrom alien import Alienfrom game_stats import GameStatsfrom button import Buttonfrom scoreboard import Scoreboardclass AlienInvasion:'''管理游戏资源和⾏为的类'''def __init__(self):'''初始化游戏并创建游戏资源'''pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN) self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightpygame.display.set_caption('Alien Invasion')'''创建存储游戏统计信息的实例''''''并创建记分牌''''''创建⼀个⽤于存储游戏统计信息的实例'''self.stats =GameStats(self)self.sb = Scoreboard(self)self.ship =Ship(self)self.bullets = pygame.sprite.Group()self.aliens = pygame.sprite.Group()self._create_fleet()'''创建play按钮'''self.play_button = Button(self,"Play")# '''设置背景⾊'''# self.bg_color = (self.settings.bg_color) cuowudef _ship_hit(self):'''响应飞船被外星⼈撞到'''if self.stats.ships_left >0:'''将ship_left减1并更新记分牌'''self.stats.ships_left -= 1self.sb.prep_ships()'''清除余下的外星⼈和⼦弹'''self.aliens.empty()self.bullets.empty()'''创建⼀群新的外星⼈,并将飞船放到屏幕底端的中央'''self._create_fleet()self.ship.center_ship()'''暂停'''sleep(0.5)else:self.stats.game_active = Falsepygame.mouse.set_visible(True)def _create_fleet(self):'''创建外星⼈群''''''创建⼀个外星⼈并计算⼀⾏可容纳多少个外星⼈''''''外星⼈的间距为外星⼈宽度'''alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width )'''计算屏幕可容纳多少⾏外星⼈'''ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)'''创建外星⼈群'''for row_number in range(number_rows):'''创建第⼀⾏外星⼈'''for alien_number in range(number_aliens_x):self._create_alien(alien_number,row_number)def _create_alien(self,alien_number,row_number):'''创建⼀个外星⼈并将其加⼊当前⾏'''alien = Alien(self)alien_width, alien_height =alien.rect.sizealien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y =alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def run_game(self):'''开始游戏的主循环'''while True:'''监视键盘和⿏标事件'''self._check_events()if self.stats.game_active:'''调⽤飞船的⽅法'''self.ship.update()'''⼦弹更新'''self._update_bullets()'''让外星⼈移动'''self._update_aliens() #suojin+weizhi'''每次循环时都会重绘屏幕'''self._update_screen()def _check_fleet_edges(self):'''有外星⼈到达边缘时采取相应的措施'''for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):'''将整群⼈外星⼈下⼀,并改变它们的⽅向'''for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _update_aliens(self):'''检测是否有外星⼈位于屏幕边缘,更新外星⼈群中所有外星⼈的位置''' self._check_fleet_edges()self.aliens.update()'''检测外星⼈和飞船之间的碰撞'''if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()'''检查是否有外星⼈到达了屏幕底端'''self._check_aliens_bottom() #suojindef _check_events(self):'''响应按键和⿏标事件'''for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos)def _check_play_button(self,mouse_pos):'''在玩家单机play按钮时开始新游戏'''button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:'''重置游戏设置'''self.settings.initialize_dynamic_settings()'''重置游戏统计信息'''self.stats.reset_stats()self.stats.game_active = Trueself.sb.prep_score()self.sb.prep_level()self.sb.prep_ships()'''清空余下的外星⼈和⼦弹'''self.aliens.empty()self.bullets.empty()'''创建⼀群新的外星⼈并让飞船居中'''self._create_fleet()self.ship.center_ship()'''隐藏⿏标光标'''pygame.mouse.set_visible(False)def _check_aliens_bottom(self):'''检查是否有外星⼈到达了屏幕底端'''screen_rect =self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:'''像飞船被撞⼀样处理'''self._ship_hit()breakdef _check_keydown_events(self,event):'''响应按键'''if event.key == pygame.K_RIGHT:'''向右移动飞船'''self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:'''向左移动飞船'''self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self,event):'''响应松开'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):'''创建⼀颗⼦弹,并将其加⼊编组bullets中'''if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):'''更新⼦弹的位置并删除消失的⼦弹''''''更新⼦弹的位置'''self.bullets.update()'''删除消失的⼦弹'''for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):'''检查是否有⼦弹击中了外星⼈如果是,就删除相应的⼦弹和外星⼈'''collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True,True) if collisions:for aliens in collisions.values():self.stats.score += self.settings.alien_points * len(aliens)self.sb.prep_score()self.sb.check_high_score()if not self.aliens:'''删除现有的⼦弹并新建⼀群外星⼈'''self.bullets.empty()self._create_fleet()self.settings.increase_speed()'''提⾼等级'''self.stats.level += 1self.sb.prep_level()def _update_screen(self):'''更新屏幕上的图像,并切换到新屏幕'''self.screen.fill(self.settings.bg_color)#loule settings.self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)'''显⽰得分'''self.sb.show_score()'''如果游戏处于⾮活动状态,就绘制Play按钮'''if not self.stats.game_active:self.play_button.draw_button()'''让最近绘制的屏幕可见'''pygame.display.flip()if __name__ == "__main__":'''创建游戏实例并运⾏游戏'''ai = AlienInvasion()ai.run_game()2.3 alien.pyimport pygamefrom pygame.sprite import Spriteclass Alien(Sprite):'''表⽰单个外星⼈的类'''def __init__(self,ai_game):'''初始化外星⼈并设置其起始位置'''super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings'''加载外星⼈图像并设置其rect属性'''self.image = pygame.image.load('image/alien.bmp')self.rect =self.image.get_rect()'''每个外星⼈最初都在屏幕左下⾓附近'''self.rect.x = self.rect.widthself.rect.y = self.rect.height'''存储外星⼈的精确⽔平位置'''self.x = float(self.rect.x)def check_edges(self):'''如果外星⼈位于屏幕边缘,就返回True'''screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self):'''向左或者向右移动外星⼈'''self.x += (self.settings.alien_speed * self.settings.fleet_direction) # self.x += self.settings.alien_speed向右移动外星⼈self.rect.x = self.x2.4 bullet.pyimport pygamefrom pygame.sprite import Spriteclass Bullet(Sprite):'''管理飞船所发射⼦弹的类'''def __init__(self,ai_game):'''在飞船当前位置创建⼀个⼦弹对象'''super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color =self.settings.bullet_color'''在(0,0)处创建⼀个表⽰⼦弹的矩形,在设置正确的位置'''self.rect =pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop =ai_game.ship.rect.midtop'''存储⽤⼩数表⽰⼦弹位置'''self.y =float(self.rect.y)def update(self):'''向上移动⼦弹''''''更新表⽰⼦弹位置的⼩数值'''self.y -= self.settings.bullet_speed'''更新表⽰⼦弹的rect的位置'''self.rect.y = self.ydef draw_bullet(self):'''在屏幕上绘制⼦弹'''pygame.draw.rect(self.screen, self.color, self.rect)2.5 button.pyimport pygame.fontclass Button:def __init__(self,ai_game,msg):'''初始化按钮的属性'''self.screen = ai_game.screenself.screen_rect = self.screen.get_rect()'''设置按钮的尺⼨和其他属性'''self.width, self.height = 200,50self.button_color = (0,255,0)self.text_color =(255,255,255)self.font = pygame.font.SysFont(None,48)'''创建按钮的rect对象,并使其居中'''self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center'''按钮的标签只需要创建⼀次'''self._prep_msg(msg)def _prep_msg(self,msg):'''将msg渲染为图像,并使其在按钮上居中'''self.msg_image = self.font.render(msg,True,self.text_color,self.button_color) self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):'''绘制⼀个⽤颜⾊填充的按钮,再绘制⽂本'''self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)2.6 game_stats.pyclass GameStats:'''跟踪游戏的统计信息'''def __init__(self,ai_game):'''初始化统计信息'''self.settings = ai_game.settingsself.reset_stats()'''游戏刚启动时处于活动状态'''self.game_active = False'''任何情况下都不应该重置最⾼得分'''self.high_score = 0def reset_stats(self):'''初始化在游戏运⾏期间可能变化的统计信息'''self.ships_left = self.settings.ship_limitself.score = 0self.level = 12.7 scoreboarf.pyimport pygame.fontfrom pygame.sprite import Groupfrom ship import Shipclass Scoreboard:'''显⽰得分信息的类'''def __init__(self,ai_game):'''初始化显⽰得分涉及的属性'''self.ai_game = ai_gameself.screen = ai_game.screenself.screen_rect = self.screen.get_rect()self.settings = ai_game.settingsself.stats = ai_game.stats'''显⽰得分信息时使⽤的字体设置'''self.text_color = (30,30,30)self.font = pygame.font.SysFont(None,48)'''准备包含最⾼得分和当前得分的图像'''self.prep_score()self.prep_ships()self.prep_high_score()self.prep_level()#cuowudef prep_ships(self):'''显⽰还剩下多少艘飞船'''self.ships = Group()for ship_number in range(self.stats.ships_left): #cuowuship =Ship(self.ai_game)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship) #cuowudef prep_high_score(self):'''将最⾼得分转换为渲染的图像'''high_score =round(self.stats.high_score, -1)high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str,True, self.text_color,self.settings.bg_color)'''将最⾼得分放在屏幕顶部中央'''self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef prep_score(self):'''将得分转换成⼀副渲染的图像'''rounded_score = round(self.stats.score, -1)score_str ="{:,}".format(rounded_score)self.score_image =self.font.render(score_str,True,self.text_color,self.settings.bg_color)'''在屏幕右下显⽰得分'''self.score_rect =self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def 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)def check_high_score(self):'''检查是否诞⽣了新的最⾼得分'''if self.stats.score > self.stats.high_score:self.stats.high_score = self.stats.scoreself.prep_high_score()def prep_level(self):'''将等级转化为渲染的图像'''level_str = str(self.stats.level)self.level_image = self.font.render(level_str,True,self.text_color, self.settings.bg_color)'''将等级放在得分下⾯'''self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom +102.8 settings.pyclass Settings:'''存储游戏《外星⼈⼊侵》中所有设置的类'''def __init__(self):'''初始化游戏的静态设置''''''屏幕设置'''self.screen_width = 1200self.screen_height =800self.bg_color = (230,230,230)self.ship_limit = 3self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3 # 设置存储的最⼤⼦弹数为3self.fleet_drop_speed = 10'''加快游戏节奏的速度'''self.speedup_scale = 1.1self.score_scale = 1.5self.initialize_dynamic_settings()# '''设置飞船速度'''# self.ship_speed = 1.5# '''⼦弹设置'''# self.bullet_speed = 1.5# self.alien_speed = 1.0# '''fleet_direction为1表⽰向有意,-1表⽰向左移'''# self.fleet_direction = 1 cuowudef initialize_dynamic_settings(self):'''初始化随游戏进⾏⽽变化的设置'''self.ship_speed = 1.5self.bullet_speed =3.0self.alien_speed = 1.0'''fleet_direction为1表⽰向右,为-1表⽰向左'''self.fleet_direction = 1# '''计分'''self.alien_points = 50def increase_speed(self):'''提⾼速度设置和外星⼈分数'''self.ship_speed *= self.speedup_scaleself.bullet_speed *= self.speedup_scaleself.alien_speed *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale) # print(self.alien_points) cuowu2.9 ship.pyimport pygamefrom pygame.sprite import Spriteclass Ship(Sprite):'''管理飞船的类'''def __init__(self,ai_game):'''初始化飞船并设置其初始化位置'''super().__init__()self.screen = ai_game.screen'''设置飞船速度'''self.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()'''加载飞船图像并获取其外接矩阵'''self.image = pygame.image.load('image/ship.bmp')self.rect = self.image.get_rect()'''对于每艘新飞船,都将其放在屏幕底部的中央'''self.rect.midbottom = self.screen_rect.midbottom'''在飞船的属性x中存储⼩数值'''self.x = float(self.rect.x)'''移动标志'''self.moving_right = Falseself.moving_left = Falsedef update(self):'''根据移动标志调整飞船的位置''''''更新飞船⽽不是rect对象的值'''if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed'''根据self.x更新rect对象'''self.rect.x = self.xdef blitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image, self.rect)def center_ship(self):'''让飞船在屏幕底端剧中'''self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)以上就是Python实战之外星⼈⼊侵游戏⽰例代码的详细内容,更多关于Python外星⼈⼊侵游戏的资料请关注其它相关⽂章!。
Python教案----教学设计(DOC97页)–脚本语言:说明执行•编译和说明的区别–编译:一次性的翻译,需对目标代码优化–说明:每次运行都需要•编译:源代码〔高级语言〕转换成目标代码〔机器语言〕说明:源代码逐条转化成目标代码同时逐条运行目标代码的过程•编译的好处–目标代码执行速度更快–目标代码在相同操作系统上使用灵活–说明的好处–便于爱护源代码–良好的可移植性•Python语言:将说明器和编译器结合的脚本语言•运算机已成为一般工具•学会编程:满足感和安全感•C/C++等语言:复杂•Python语言:充满欢乐和制造性的全新旅程•3.Python语言概述•Python语言的历史–产生于1989年,已有25年,达到成熟期–2000年, Python 2.0, 2,.7.6–2020年, Python 3.0, 3.4.x•Python语言的特点–强制缩进保证可读性–不需要主函数–能够同时被说明和编译执行–语言简洁–编程模式灵活〔面向过程和面向对象〕4.Python语言的开发环境配置•安装Python运行环境–到Python主页下载并安装Python差不多开发和运行环境,:// /download/–依照操作系统选择不同版本–下载相应的Python 2.7.6版本程序,跟随提示安装•使用Python运行环境–方法一:启动Windows命令行工具,输入python,在>>>后输入Python语句,如下图输入exit()或quit()退出–方法二:调用已安装的IDLE来启动Python运行环境,–方法三:按照语法格式编写代码,储存为文件,例如源文件hello.py。
打开Windows命令行,使用命令python hello.py来运行文件•使用Python运行环境–方法四:打开IDLE,Ctrl+N打开一个新窗口,输入语句并储存,使用快键建F5即可运行该程序–方法五:将Python集成到Eclipse等面向较大规模项目开发的集成开发环境中–其他操作系统上配置Python环境与上述在Windows上的配置方法类似5.Hello程序•你的第一个程序:在屏幕上打印出〝Hello World〞–print 〝Hello World〞–表示将引号中的信息输出到屏幕上显示成效如下:二、上机练习第一进行Python的安装与开发环境配置,接着完成第一个程序〝Hello World〞三、本课小结运算机的差不多概念程序设计语言分类编译和说明Python语言概述Python的Hello程序编写及开发环境配置课后反思时刻:tries = 0print "你好,同学……我和你们班主任之间有一个隐秘!?"print "那个隐秘就在1-99之间的一个数字。
(六)1.创建alien的模块,创建Alien的类,是Sprite的子类,参数为ai_settings,screen导入外星人图像,使用get_rect()方法将图像的矩形属性赋值给rect,将图像的x,y坐标赋值其宽度和高度2.在Alien这个类中,创建一个函数,作用为将图像与窗口重合3.在主模块中,创建一个aliens的组,并创建方法create_fleet(ai_settings, screen, aliens)其作用是计算一行中能够存放多少个外星人,在这个窗口里能排放多少行的外星人,并用for 循环,创建多个Alien类的实例,并对每一个实例的x,y坐标进行修改:其中计算每行能够存放多少外星人的变量为number_aliens_x,能够存放多少行的变量为number_rows,其中关于外星人x坐标为alien.x = alien_width + 2 * alien_width * alien_number关于外星人y坐标的为alien.rect.y = alien_height + 2*alien_height*alien_row。
将实例添加到组里面4.在gf.update_screen()中添加一个aliens参数,并在其函数中调用aliens.draw(screen)5.在游戏属性中定义外星人运行速度alien_speed_factor,并在alien模块中的Alien类创建一个新方法update(),功能是使外星人实例进行移动6.在game_functions模块中创建update_aliens()方法,功能是调用Alien中的update方法7.在settings设定两个变量,分别表示外星人下落速度和改变方向fleet_direction8.在alien模块Alien类中创建函数check_edges().其功能是检测外星人实例是否超出右边边框或左边边框,若超出,则返回true9.在game_functions模块中,创建函数check_fleet_edges(),其功能是对外星人组进行遍历,if语句对其中对象调用check_edges(),若继续执行,则再进行for循环,改变外星人实例的y坐标,执行完第二个for循环后,将fleet_direction*-1,并执行break语句,跳出第一个for循环。
软件设计基础期末大作业期末大作业要求根据给出的双色球抽奖数据进行研究,并在此基础上完成以下列举的任务。
在研究过程中,请查阅相关文献并设计算法处理数据表,完成相应的研究论文。
基本的设计过程要求如下:1.附件ssq.xls文档中提供了最新的双色球数据,如果数据没有更新,点击“点击这里,自动更新双色球”按钮进行刷新,请以此文件中的数据为基础进行研究;2.将此excel文件(*.xls)转换为sqlite3的数据库文件(*.db);3.设计算法,预测接下来既将开出的双色球的中奖号码,并估计可能的获奖金额;4.如果你有1000元进行投注,采用什么策略最佳?请通过对历史数据的分析来支撑你的选择;5.设计算法,对历史数据进行分析,评估历史上中奖号码的可预测性;6.设计各种数据可视化方法,向彩民展示你的数据分析过程和研究成果。
7.对以上工作进行总结,就双色球问题撰写一篇研究性论文。
注意:以上算法没有统一的、唯一正确的解决方案,应该通过搜索和研究各种算法去探索;大作业要求:1.自己设计解决方案,简易的解决方案得分较低,完整的解决方案,即使部分完成,得分也会较高;2.作业上交形式为电子版文件。
所有文件打包为一个文件,以“学号+姓名”的方式命名;3.上交各算法的python源程序(py文件);4.论文包括前言(简介),总体解决方案,各算法详述部分(算法流程图为核心),各算法程序设计部分(程序流程图为核心),实验结果和分析,小结等内容(doc文件);5.论文必须有规范的发表论文格式,包括题目、作者、单位、摘要、关键字、正文及参考文献;字数:论文部分字数限于2500±300,太多太少均扣分。
上交期限:16周周日,由班长收齐统一上交。
抄袭0分!。
---------------------------------------------------------------最新资料推荐------------------------------------------------------
python精品教学课件(温州大学)实验6 游戏:外
星人入侵
温州大学物理与电子信息工程学院软件设计基础实验报告实验名称:
实验 6 游戏:
外星人入侵班班级:
14 电科 1 班姓姓名:
徐炜学学号:
14211111132 实验地点:
5B105 日日期:
2019/4/21 一、实验目的:
用利用 Python 模拟游戏体验二、实验环境:
win 7 + python 3.6 三、实验内容和要求:
内容1:
按教材第 2 部分项目 1 的指引,实现外星人入侵的游戏,其中包含飞船、外星人、积分等元素。
内容2:
自己设计一个小游戏项目,并使用 pygam 模块实现之。
通过本次实验,掌握以下编程知识点:
各种函数方法的套用四、实验步骤:
(对实验步骤的说明应该能够保证根据该说明即可重复完整的
1 / 4
实验内容,得到正确结果。
)我是通过以下步骤来完成实验任务,得到结果的:
(在编辑器输入代码,通过调试发现何种问题,修改程序,得到计算结果,判别结果的正确性,修改错误的结果,得到正确的结果或更好的结果,分析结果并得出结论,等等。
) 1.通过模拟书上的代码加以改编,测试并实现。
2.通过同类型的游戏相比较,加以改进。
3.通过模拟的实验加以复制。
五、实验结果与分析(含程序、数据记录及分析和实验总结等):
每个程序的代码(重要语句要有注释)和运行结果(均使用屏幕拷贝图像的方式)罗列和说明如下:
内容 1 的代码:
第一部分:
外星人的类第二部分:
主要函数第三部分:
子弹的类第四部分:
按钮的类第五部分:
功能管理的类第六部分:
统计相关的类第七部分:
现实得分信息第八部分:
---------------------------------------------------------------最新资料推荐------------------------------------------------------ 关于初始值设置的类第九部分:
飞船设置运行结果:
内容二代码部分:
主要代码与内容一相同现在展示不同部分的代码:
运行结果: 改进之处:
相比于内容一,内容二的坦克大战,能够实现坦克动态运转,能够四个方向运行,子弹也可以四个方向运行。
六:
思考题:
1. 游戏项目外星人入侵是按照什么顺序逐步开发成功的?答:
三个步骤分别是项目一:
飞船有关方法函数的设置项目二:
外星人有关方法函数的设置项目三:
界面、分数统计等方法函数的设置 2. 游戏中的动画效果是如何实现的?答:
通过随着时间轴推移的位置改变,无论是子弹还是外星人。
3. 对游戏的操控是如何实现的?答:
通过鼠标点击play按钮开始,随即键盘输入操作指令并控制飞
3 / 4
船。
七、教师评语:
实验成绩:
教师:
(签名要全称)年月日注:
1 。
此模板为专业实验报告的基本要求,若有特殊要求的实验,可在此模板基础上增加,但不可减少。
2.实验报告必须在学生提交报告后一星期内批改。
说明:
① 上下页边距改成 2 厘米,左边距为 2.0 厘米,右边距为 1.5 厘米。
② 表格位置为居中。