外星人大战----------------------游戏开发(四)

前面已经实现外星人的移动,现在开始完成射杀外星人。我们将要使用sprite.groupcollide()检测两个编组的碰撞。我们要在碰撞的时候立马就让外星人消失,所以在更新位置的时候就检测有无碰撞。


在功能模块检测子弹与外星人,方法sprite.groupcollide()将每颗子弹的rect同外星人的rect比较,返回一个字典,其中包含发生碰撞的子弹与外星人,在这个字典里每个键都是一颗子弹,而相应的值都是被击中的外星人。这样两者就相互对应起来了。

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygame
from bullet import Bullet
from alien import Aliendef check_keydown_events(event,ai_settings,screen,ship,bullets):           #响应按键if event.key==pygame.K_RIGHT:ship.moving_right=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(aliens,bullets):  #更新子弹的位置,并删除已消失的子弹bullets.update()for bullet in bullets.copy():if bullet.rect.bottom<=0:bullets.remove(bullet)#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  #创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,aliens):check_fleet_edges(ai_settings,aliens)aliens.update()#对于外星人到达边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

在函数update_bullets()添加一行代码,这行代码遍历编组里bullets的所有子弹,再遍历aliens的每个外星人,当有两者重叠的时候,groupcollide()就在它返回的字典中添加键-值。两个实参true告知pygame删除发生碰撞的子弹与外星人。(第一个实参true是代表的是删除子弹,第二个实参true是外星人。我们也可以设置子弹不删除,外星人删除,只要子弹与外星人碰撞,就会外星人消失,子弹可以一直移动到顶端,就把第一个布尔实参设为False,第二个布尔实参设为true)

主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Groupdef run_game():pygame.init()  #初始化,创建屏幕对象ai_settings=Setting()    #创建一个800*800的屏幕screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasionship=Ship(ai_settings,screen)   #创建飞船bullets=Group()aliens=Group()gf.creat_fleet(ai_settings,screen,ship,aliens)while True:gf.check_events(ai_settings,screen,ship,bullets)ship.update()gf.update_bullets(aliens,bullets)gf.update_aliens(ai_settings,aliens)gf.update_screen(ai_settings,screen,ship,aliens,bullets)run_game()

运行程序,看看验证结果:

生成新的外星人:

当射击的外星人都没有了,就要产生新的外星人,首先,我们要去确定外星人都被杀死,就要检查aliens编组是否为空,如果为空,就要调用creat_fleet().我们要在update_bullets()里执行检查,因为外星人在这里被击杀,

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygame
from bullet import Bullet
from alien import Aliendef check_keydown_events(event,ai_settings,screen,ship,bullets):           #响应按键if event.key==pygame.K_RIGHT:ship.moving_right=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(ai_settings,screen,ship,aliens,bullets):  #更新子弹的位置,并删除已消失的子弹bullets.update()for bullet in bullets.copy():if bullet.rect.bottom<=0:bullets.remove(bullet)#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  if len(aliens)==0:bullets.empty()  #删除现有的子弹并新建新的外星人群creat_fleet(ai_settings,screen,ship,aliens)#创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,aliens):check_fleet_edges(ai_settings,aliens)aliens.update()#对于外星人到达边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Groupdef run_game():pygame.init()  #初始化,创建屏幕对象ai_settings=Setting()    #创建一个800*800的屏幕screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasionship=Ship(ai_settings,screen)   #创建飞船bullets=Group()aliens=Group()gf.creat_fleet(ai_settings,screen,ship,aliens)while True:gf.check_events(ai_settings,screen,ship,bullets)ship.update()gf.update_bullets(ai_settings,screen,ship,aliens,bullets)gf.update_aliens(ai_settings,aliens)gf.update_screen(ai_settings,screen,ship,aliens,bullets)run_game()

运行程序,验证结果:

当我射杀完外星人后,就会出现新的外星人群。

重构功能模块里的update_bullets():

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygame
from bullet import Bullet
from alien import Aliendef check_keydown_events(event,ai_settings,screen,ship,bullets):           #响应按键if event.key==pygame.K_RIGHT:ship.moving_right=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(ai_settings,screen,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,ship,aliens,bullets)   def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  if len(aliens)==0:bullets.empty()  #删除现有的子弹并新建新的外星人群creat_fleet(ai_settings,screen,ship,aliens)#创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,aliens):check_fleet_edges(ai_settings,aliens)aliens.update()#对于外星人到达边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

验证结果:没有问题

现在看来整个游戏开发的大体框架都已经完成了,现在可以实现移动飞船,发射子弹,子弹射杀外星人,外星人会重新补全等大概的功能,但是这个游戏会一直继续下去,除非你点击退出,但一个没有输赢的游戏大概会很无聊,所以接下来就来设置如何结束游戏,结束游戏有以下几种情况,1.不想玩了,直接点击退出键就结束游戏。2.如果玩家在限制的时间内未射杀完外星人,或者外星人撞到飞船以及外星人到达屏幕底端,飞船会被摧毁,最多可提供三架飞船,飞船摧毁完游戏自动结束。

1.监测外星人和飞船相撞的情况,就像子弹和外星人的相撞一样,在更新外星人的位置后就检测有无相撞。现在就是简单检查有没有撞到,对于后续的行为先不设置。

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygame
from bullet import Bullet
from alien import Aliendef check_keydown_events(event,ai_settings,screen,ship,bullets):           #响应按键if event.key==pygame.K_RIGHT:ship.moving_right=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(ai_settings,screen,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,ship,aliens,bullets)   def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  if len(aliens)==0:bullets.empty()  #删除现有的子弹并新建新的外星人群creat_fleet(ai_settings,screen,ship,aliens)#创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,ship,aliens):check_fleet_edges(ai_settings,aliens)aliens.update()#监测外星人和飞船的相撞if pygame.sprite.spritecollideany(ship,aliens):print("ship hit!!!")#对于外星人到达边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

方法sprite.spritecollideany()接受两个实参,一个精灵和一个编组,它检查编组是否有成员与精灵发生了碰撞,找到与精灵发生碰撞的成员后就停止遍历编组。如果没有发生碰撞,返回none。 

主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Groupdef run_game():pygame.init()  #初始化,创建屏幕对象ai_settings=Setting()    #创建一个800*800的屏幕screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasionship=Ship(ai_settings,screen)   #创建飞船bullets=Group()aliens=Group()gf.creat_fleet(ai_settings,screen,ship,aliens)while True:gf.check_events(ai_settings,screen,ship,bullets)ship.update()gf.update_bullets(ai_settings,screen,ship,aliens,bullets)gf.update_aliens(ai_settings,ship,aliens)gf.update_screen(ai_settings,screen,ship,aliens,bullets)run_game()

运行程序。看看验证结果:

按上面的代码现在已经检测到相撞了,现在就在来响应下相撞后该有什么行为;现在创建一个新的飞船实例 ,记录游戏飞船被撞毁几次

创建一个用于记录跟踪游戏信息的新类Gamestats

#跟踪游戏统计信息的类
class GameStats():def __init__(self,ai_settings):self.ai_settings=ai_settingsself.reset_stats()self.game_active=True     #游戏活动标志def reset_stats(self):      #初始化在游戏里可能会变化的统计信息self.ships_left=self.ai_settings.ship_limit

创建一个GameStats的实例,每当开始新游戏的时候,重置设置一些统计信息,当前只有一项统计信息ships_left。

修改设置类;

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#存储外星人游戏开发的设置
class Setting():def __init__(self):self.screen_width=800    #设置屏幕高度宽度,背景颜色self.screen_height=600self.bg_color=(230,230,230)#飞船设置self.ship_speed_factor=1.5   #设置飞船移动self.ship_limit=3           #设置飞船数量#子弹设置self.bullet_speed_factor=1self.bullet_width=3self.bullet_height=15self.bullet_color=(0,0,255)self.bullets_allowed=3#外星人设置self.alien_speed_factor=1self.fleet_drop_speed=5self.fleet_direction=1    #fleet_direction 为1表示右移,为-1表示左移

修改功能模块:当外星人撞到飞船,将飞船的数量减一,创建一群新的外星人,并将飞船放置到初始位置。

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等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=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(ai_settings,screen,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,ship,aliens,bullets)   def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  if len(aliens)==0:bullets.empty()  #删除现有的子弹并新建新的外星人群creat_fleet(ai_settings,screen,ship,aliens)#创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):check_fleet_edges(ai_settings,aliens)aliens.update()#监测外星人和飞船的相撞if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,stats,screen,ship,aliens,bullets)#响应被外星人撞到的飞船
def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):stats.ships_left-=1aliens.empty()      #清空外星人列表bullets.empty()     #清空子弹列表#创建新的外星人,飞船放入中间creat_fleet(ai_settings,screen,ship,aliens)ship.center_ship()sleep(0.5)        #暂停#对于外星人到达边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

 从模块time导入sleep,用于让游戏暂停;

修改ship类:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#创建飞船类
import pygameclass Ship(): def __init__(self,ai_settings,screen):self.screen=screenself.ai_settings=ai_settings#图片存在images文件夹下,名字是ship.bmp    self.image=pygame.image.load('images/ship.bmp')  self.rect=self.image.get_rect()self.screen_rect=screen.get_rect()self.rect.centerx=self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.center=float(self.rect.centerx)   #因为rect的centerx只能储存整数值,在飞船的center储存小数值self.moving_right=False            #设置移动标志self.moving_left=Falsedef update(self):if self.moving_right and self.rect.right <self.screen_rect.right:        #根据移动标志,来调整位置self.center+=self.ai_settings.ship_speed_factor      #更新飞船的center的值,不是rectif self.moving_left and self.rect.left>0:self.center-=self.ai_settings.ship_speed_factorself.rect.centerx=self.center    #来更新rect对象def blitme(self):self.screen.blit(self.image,self.rect)  def center_ship(self):self.center=self.screen_rect.centerx

修改主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStatsdef run_game():pygame.init()  #初始化,创建屏幕对象ai_settings=Setting()    #创建一个800*800的屏幕screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasionstats=GameStats(ai_settings)    #创建一个用于存储统计信息的实例ship=Ship(ai_settings,screen)   #创建飞船bullets=Group()aliens=Group()gf.creat_fleet(ai_settings,screen,ship,aliens)while True:gf.check_events(ai_settings,screen,ship,bullets)ship.update()gf.update_bullets(ai_settings,screen,ship,aliens,bullets)gf.update_aliens(ai_settings,stats,screen,ship,aliens,bullets)gf.update_screen(ai_settings,screen,ship,aliens,bullets)run_game()

运行程序,验证结果如下:

当相撞后,飞船与外星人重新出现,飞船在初始位置

2.有外星人到达屏幕底端:

上面已经处理相撞的情况,现在来处理到达底端的时候,

修改功能模块,添加一个检查函数,来检查是否到达底部

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等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=True    #改变标志位elif event.key==pygame.K_LEFT:ship.moving_left=Trueelif event.key==pygame.K_SPACE:      #响应按空格键fire_bullet(ai_settings,screen,ship,bullets)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 check_keyup_events(event,ship):   #响应按键松开if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef check_events(ai_settings,screen,ship,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)def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新屏幕screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)pygame.display.flip()def update_bullets(ai_settings,screen,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,ship,aliens,bullets)   def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):#检查是否两者碰撞,是的话,删除相应的子弹与外星人collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)  if len(aliens)==0:bullets.empty()  #删除现有的子弹并新建新的外星人群creat_fleet(ai_settings,screen,ship,aliens)#创建外星人群
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_x def creat_alien(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 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 creat_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):creat_alien(ai_settings,screen,aliens,alien_number,row_number)#更新外星人的位置
def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):check_fleet_edges(ai_settings,aliens)aliens.update()check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets)#监测外星人和飞船的相撞if pygame.sprite.spritecollideany(ship,aliens):ship_hit(ai_settings,stats,screen,ship,aliens,bullets)#响应被外星人撞到的飞船
def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):if stats.ships_left>0:stats.ships_left-=1aliens.empty()      #清空外星人列表bullets.empty()     #清空子弹列表#创建新的外星人,飞船放入中间creat_fleet(ai_settings,screen,ship,aliens)ship.center_ship()sleep(0.5)        #暂停else:stats.game_active=False#检查是否有外星人到达屏幕底端
def check_aliens_bottom(ai_settings,stats,screen,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,ship,aliens,bullets)break#对于外星人到达左右边缘采取的措施:
def check_fleet_edges(ai_settings,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)break#下移外星人
def change_fleet_direction(ai_settings,aliens):for alien in aliens.sprites():alien.rect.y+=ai_settings.fleet_drop_speedai_settings.fleet_direction*=-1

主程序如下:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStatsdef run_game():pygame.init()  #初始化,创建屏幕对象ai_settings=Setting()    #创建一个800*800的屏幕screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasionstats=GameStats(ai_settings)    #创建一个用于存储统计信息的实例ship=Ship(ai_settings,screen)   #创建飞船bullets=Group()aliens=Group()gf.creat_fleet(ai_settings,screen,ship,aliens)while True:gf.check_events(ai_settings,screen,ship,bullets)if stats.game_active:ship.update()gf.update_bullets(ai_settings,screen,ship,aliens,bullets)gf.update_aliens(ai_settings,stats,screen,ship,aliens,bullets)gf.update_screen(ai_settings,screen,ship,aliens,bullets)run_game()

当把飞船次数用完后,屏幕到停止不动了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11100.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外星人大战---------------------游戏开发

因为基本知识已经学习的差不多了&#xff0c;做三个实例更加上手学习&#xff0c;第一个实例是游戏开发&#xff0c;外星人&#xff0c;第二个是数据处理&#xff0c;第三个是web开发&#xff0c;这一个月尽量完成第一个实例。 首先对于游戏开发&#xff0c;会经常使用pygame模…

波克城市:从Impala到StarRocks,让游戏分析焕发新活力

作者&#xff1a;波克城市大数据平台部门 波克科技股份有限公司&#xff08;以下简称“波克城市”&#xff09;成立于 2010 年&#xff0c;立足于精品休闲游戏的全球化研发、发行&#xff0c;旗下拥有《爆炒江湖》《我是航天员》《猫咪公寓》等精品休闲游戏&#xff0c;连续五年…

一个人把数学建模比赛打完 520特辑

导读340s## 一个人把数学建模比赛打完 高中生也能听懂的教程 一个记笔记的工具分享&#xff1a;https://pan.baidu.com/s/1lfVn8xa-3xpJnDUVBtdqNQ?pwdv3fk 【https://www.bilibili.com/video/BV1zX4y1X73T/?spm_id_from333.337.search-card.all.click&vd_source6ff28d…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(中)

注&#xff1a;本文由ChatGPT与Claude联合生成 51、Effective ReDoS Detection by Principled Vulnerability Modeling and Exploit Generation 正则表达式拒绝服务攻击&#xff08;ReDoS&#xff09;是一种算法复杂度攻击。对于易受攻击的正则表达式&#xff0c;攻击者可以精心…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(上)

注意&#xff1a;本文由GPT4与Claude联合生成。 按语&#xff1a;ChatGPT在计算机领域的翻译质量还是欠缺一些&#xff0c;翻译出来的中文有的不够自然&#xff0c;经常完全按照英文的表达方式来&#xff0c;导致中文特别长&#xff0c;很绕。GPT4的翻译效果相对ChatGPT效果要好…

李开复新公司正式上线!强啊!

点击关注公众号&#xff1a;互联网架构师&#xff0c;后台回复 2T获取2TB学习资源&#xff01; 上一篇&#xff1a;Alibaba开源内网高并发编程手册.pdf 就在昨天&#xff0c;李开复麾下大模型公司的官网正式上线了。 名为&#xff1a;零一万物。 而且官方域名可以说非常有个性&…

#Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐

关于Edge浏览器以及插件推荐 1.关于Microsoft Edge......1.1 什么是Microsoft Edge1.2Microsoft Edge的优势 2.Microsoft Edge的分屏功能2.1 如何分屏&#xff1f;2.2分屏的优势 3.Microsoft Edge插件推荐3.1 AIX智能下载器(图片/视频/音乐/文档)3.2 AdGuard 广告拦截器3.3 破解…

ChatGPT、文心一言、New Bing介绍,以及如何选用。新时代,起风了

这里写自定义目录标题 ChatGPT平台介绍特点 New Bing平台介绍特点 文心一言平台介绍特点 总结 随着互联网、物联网技术的发展&#xff0c;人工智能在各行各业中的应用越来越广泛&#xff0c;同时也取得了突破性的进展。以微软小冰为例&#xff0c;它最初只能进行简单的对话&…

百度文心一言可以完胜ChatGPT的4点可能性

文心一言&#xff0c;百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。但说实话&#xff0c;很多人拿他与ChatGPT相对比&#x…

上手使用百度文心一言

3月16日&#xff0c;在距离新一代的GPT模型GPT-4发布还不足一天的时间内&#xff0c;百度便发布了对标ChatGPT的人工智能产品&#xff0c;名字叫&#xff1a;文心一言。成为国内首页发布该类型产品的公司。 那么&#xff0c;我们今天就来试一试百度的文心一言好不好用。 首先&a…

文心一言 VS ChatGpt

介绍 百度刚推出的文心一言&#xff0c;我们拿到了内测码。来从对比分析、市场预测、文档编写测试一下两个模型。国产AI到底怎么样我们往下看。 对比分析 市场分析 文档编写 总结 其实简单从这三个方便我们就能观察出一点东西&#xff0c;国产AI还需要一段路程要走。但也不是…

浅谈chatGPT——百度文心一言

等了好久终于等到了测试名额&#xff0c;真的有一些意外。从去年chatGPT发布&#xff0c;自然语言处理一下子又火热了起来。还记得研究生期间的方向就是自然语言处理&#xff0c;虽然那是几年前的事了&#xff0c;那时候就想过会有一天机器能“听懂”人类的语言&#xff0c;只是…

chatgpt VS 文心一言使用对比实测

chatgpt VS 文心一言使用对比实测 什么是文心一言 文心一言&#xff08;英语&#xff1a;ERNIE Bot&#xff09;是由百度公司开发的聊天机器人&#xff0c;能够与人交互、回答问题及协作创作。该产品被传媒称为国际著名聊天机器人ChatGPT的中国版及其竞争对手[1][2]。目前已开…

ChatGpt vs 文心一言,谁更厉害

前言 ​ 当下最火的人工智能毫无疑问是大模型的聊天机器人&#xff0c;ChatGpt的出现&#xff0c;让无数人为之惊叹&#xff0c;它聪明、逻辑清晰、又什么都懂&#xff0c;甚至被人们认为是第四次工业革命的开端。AI的大模型之争&#xff0c;美国的OpenAI已经率先拔得头筹&…

硬刚ChatGPT!文心一言能否为百度止颓?

引言&#xff1a; 近年来&#xff0c;人工智能领域的发展突飞猛进&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;方面。OpenAI的ChatGPT无疑是这个领域的佼佼者[1]。那么&#xff0c;面对这样一款高度智能的AI模型&#xff0c;国内市场上是否有相应的产品能与之…

openAI之ChatGPT与百度的文言一心比较分析(以ChatGPT口吻的自述)

引言 话说最近百度出了一个叫做“文言一心”的AI写作工具&#xff0c;被很多人吐槽成了“古文机”&#xff0c;因为它能够将现代汉语转化为文言文。而在这个时候&#xff0c;我作为一个最厉害的 AI之---大规模语言模型&#xff0c;感到有必要跟文言一心切磋一下。 首先&#x…

在ONLYOFFICE中如何借助 chatGPT编写一篇属于自己的推广软文

前言&#xff1b; OpenAI chatGPT如何在上线短短几个月的时间内火爆全球的&#xff0c;因为他不仅仅是一个在线聊天工具&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码&#xff0c;写论文等&#xff0c;是个非常有趣并且很受用户欢迎的软件&#xff0c;但是还没有…

谷歌怕了!ChatGPT狂砸搜索引擎饭碗,CEO开会拉响「红色警报」

来源&#xff1a;新智元 这个月&#xff0c;OpenAI的ChatGPT横空出世&#xff0c;立刻在AI圈掀起一股大风暴。 清晰、智能、循循善诱&#xff0c;甚至能包办论文和代码。当时许多人就预言&#xff1a;谷歌恐怕药丸。 这不是空口虚言&#xff0c;现在&#xff0c;谷歌是真的怕了…

谷歌最高优先级项目曝光:下一代AI搜索,誓要打败ChatGPT

为了应战&#xff0c;「无为而治」多年的谷歌创始人回来抓起了大方向。 岁末年初&#xff0c;科技公司似乎集体进入了反思阶段。过去一个月里&#xff0c;谷歌创始人拉里・佩奇、谢尔盖・布林与公司高管一直在开会&#xff0c;讨论新型 AI 聊天机器人。 自 11 月 30 日 OpenAI …

Gmail之父发声:有了ChatGPT,搜索引擎活不过两年了...

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>CV微信技术交流群 转载自&#xff1a;新智元 | 编辑&#xff1a;David 【导读】Gmail创始人表示&#xff1a;再有两年时间&#xff0c;ChatGPT将彻底摧毁谷歌赖以生存的搜索引…