#2
风卷浪起2024-05-01 10:12
|
程序代码:
import sys
import pygame
from pygame.sprite import Group
from setting import Setting
from ship import Ship
from bullet import Bullet
from allien import Allien
class AlienInvasion:
#管理游戏资源和行为的类
def __init__(self):
pygame.init()
self.setting = Setting()
self.screen = pygame.display.set_mode((self.setting.screen_width,self.setting.screen_height))
#设置背景色
# 创建飞3
self.ship = Ship(self)
# 创建子弹的编组
self.bullets =pygame.sprite.Group()
self.bulelts_allowed = 5
# 创建外星人的编组
self.alliens = pygame.sprite.Group()
pygame.display.set_caption("Alien Invasion")
#开始游戏的主循环
def run_game(self):
while True:
#监视键盘和鼠标的辅助方法
self._check_event()
# 创建外星人
self.ship.update()
# 控制子弹移动方法检查子弹是否达到最上面
self.update_bullet()
self.creat_fleet()
#让最近绘制的屏幕可见的方法
self.update_alliens()
#让最近绘制的屏幕可见的方
self._update_screen()
def update_alliens(self):
self._check_fleet_edges()
self.alliens.update()
def update_bullet(self):
self.bullets.update( )
for bullet in self.bullets.copy():
if bullet.rect.bottom < 0:
self.bullets.remove(bullet)
# 创建外星人组
def creat_fleet(self):
# 创造一个外星人并计算一行可以容纳多少外星人
# 外星人间距等于外星人宽度
allien = Allien(self)
allien_width = allien.rect.width
available_space_x = self.setting.screen_width - (2 * allien_width)
number_allien_x = available_space_x // (2 * allien_width)
# 计算屏幕可以容纳多少行外星人
allien_hegiht = allien.rect.height
available_space_y = self.setting.screen_height - (3 * allien_hegiht)
row_number = available_space_y // (2 * allien_hegiht)
self.creat_allien(row_number,number_allien_x)
def creat_allien(self,row_number,number_allien_x):
for number_row in range(row_number - 1):
for number_x in range(number_allien_x):
allien = Allien(self)
allien_width = allien.rect.width
allien_height = allien.rect.height
allien_width, allien_hegiht = allien.rect.size
allien.x = allien_width + (2 * allien_width * number_x)
allien.y = allien_height + (2 * allien_height * number_row)
allien.rect.x = allien.x
allien.rect.y = allien.y
self.alliens.add(allien)
def _check_fleet_edges(self):
for alien in self.alliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
allien.rect.y += self.setting.fleet_drop_speed
self.setting.fleet_direction *= -1
def _fire_bullet(self):
if len(self.bullets) <= self.bulelts_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
# 响应事件的辅助方法
def _check_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 按下按键的操作
elif event.type == pygame.KEYDOWN:
self._check_event_keydown(event)
# 松开按键的操作
elif event.type == pygame.KEYUP:
self._check_event_keyup(event)
# 按下按键的操作
elif event.type == pygame.KEYDOWN:
self._check_event_keydown(event)
def _check_event_keydown(self,event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_SPACE:
self._fire_bullet()
elif event.key == pygame.K_q:
sys.exit()
def _check_event_keyup(self,event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
# 屏幕刷新的辅助方法
def _update_screen(self):
self.screen.fill(self.setting.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.alliens.draw(self.screen)
pygame.display.flip()
#创建游戏实例并开始游戏
if __name__ == '__main__':
ai_game = AlienInvasion()
ai_game.run_game()
import pygame
from pygame.sprite import Sprite
class Allien(Sprite):
def __init__(self,ai_game):
super().__init__()
self.screen = ai_game.screen
self.setting = ai_game.setting
# 创建图像和其矩形
self.image = pygame.image.load("image/alien.bmp")
self.rect = self.image.get_rect()
# 每个外星人都在左上角附件
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# 储存x的精确位置
self.x = float(self.rect.x)
def update(self):
self.x += (self.setting.allien_speed * self.setting.fleet_direction)
self.rect = self.x
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= screen_rect.left:
return True
#储存游戏中所有设置的类
class Setting:
def __init__(self):
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
# 飞船速度设置
self.ship_speed = 1.5
# 子弹设置
self.bullet_speed = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (60,60,60)
# 外星人设置
self.allien_speed = 1.0
self.fleet_drop_speed = 10
# fleet_direction = 1 为1 表示右移,为-1表示左移
self.fleet_direction = 1
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
# 子弹的类
def __init__(self,ai_game):
super().__init__()
self.screen = ai_game.screen
# 在(0,0)处先创建一个矩形,再移动到飞船
self.rect = pygame.Rect(0,0,ai_game.setting.bullet_width,ai_game.setting.bullet_height)
self.rect.centerx = ai_game.ship.rect.centerx
self.rect.top = ai_game.ship.rect.top
# 储存用小数表达的子弹的y
self.y = float(self.rect.y)
self.color = ai_game.setting.bullet_color
self.speed = ai_game.setting.bullet_speed
# 子弹的移动
def update(self):
#更新表示子弹位置的小数值
self.y -= self.speed
# 更新表示矩形y位置???
self.rect.y = self.y
def draw_bullet(self):
# 在屏幕上绘制子弹
pygame.draw.rect(self.screen,self.color,self.rect)
import pygame
from pygame.sprite import Group
from setting import Setting
from ship import Ship
from bullet import Bullet
from allien import Allien
class AlienInvasion:
#管理游戏资源和行为的类
def __init__(self):
pygame.init()
self.setting = Setting()
self.screen = pygame.display.set_mode((self.setting.screen_width,self.setting.screen_height))
#设置背景色
# 创建飞3
self.ship = Ship(self)
# 创建子弹的编组
self.bullets =pygame.sprite.Group()
self.bulelts_allowed = 5
# 创建外星人的编组
self.alliens = pygame.sprite.Group()
pygame.display.set_caption("Alien Invasion")
#开始游戏的主循环
def run_game(self):
while True:
#监视键盘和鼠标的辅助方法
self._check_event()
# 创建外星人
self.ship.update()
# 控制子弹移动方法检查子弹是否达到最上面
self.update_bullet()
self.creat_fleet()
#让最近绘制的屏幕可见的方法
self.update_alliens()
#让最近绘制的屏幕可见的方
self._update_screen()
def update_alliens(self):
self._check_fleet_edges()
self.alliens.update()
def update_bullet(self):
self.bullets.update( )
for bullet in self.bullets.copy():
if bullet.rect.bottom < 0:
self.bullets.remove(bullet)
# 创建外星人组
def creat_fleet(self):
# 创造一个外星人并计算一行可以容纳多少外星人
# 外星人间距等于外星人宽度
allien = Allien(self)
allien_width = allien.rect.width
available_space_x = self.setting.screen_width - (2 * allien_width)
number_allien_x = available_space_x // (2 * allien_width)
# 计算屏幕可以容纳多少行外星人
allien_hegiht = allien.rect.height
available_space_y = self.setting.screen_height - (3 * allien_hegiht)
row_number = available_space_y // (2 * allien_hegiht)
self.creat_allien(row_number,number_allien_x)
def creat_allien(self,row_number,number_allien_x):
for number_row in range(row_number - 1):
for number_x in range(number_allien_x):
allien = Allien(self)
allien_width = allien.rect.width
allien_height = allien.rect.height
allien_width, allien_hegiht = allien.rect.size
allien.x = allien_width + (2 * allien_width * number_x)
allien.y = allien_height + (2 * allien_height * number_row)
allien.rect.x = allien.x
allien.rect.y = allien.y
self.alliens.add(allien)
def _check_fleet_edges(self):
for alien in self.alliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
allien.rect.y += self.setting.fleet_drop_speed
self.setting.fleet_direction *= -1
def _fire_bullet(self):
if len(self.bullets) <= self.bulelts_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
# 响应事件的辅助方法
def _check_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 按下按键的操作
elif event.type == pygame.KEYDOWN:
self._check_event_keydown(event)
# 松开按键的操作
elif event.type == pygame.KEYUP:
self._check_event_keyup(event)
# 按下按键的操作
elif event.type == pygame.KEYDOWN:
self._check_event_keydown(event)
def _check_event_keydown(self,event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_SPACE:
self._fire_bullet()
elif event.key == pygame.K_q:
sys.exit()
def _check_event_keyup(self,event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
# 屏幕刷新的辅助方法
def _update_screen(self):
self.screen.fill(self.setting.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.alliens.draw(self.screen)
pygame.display.flip()
#创建游戏实例并开始游戏
if __name__ == '__main__':
ai_game = AlienInvasion()
ai_game.run_game()
import pygame
from pygame.sprite import Sprite
class Allien(Sprite):
def __init__(self,ai_game):
super().__init__()
self.screen = ai_game.screen
self.setting = ai_game.setting
# 创建图像和其矩形
self.image = pygame.image.load("image/alien.bmp")
self.rect = self.image.get_rect()
# 每个外星人都在左上角附件
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# 储存x的精确位置
self.x = float(self.rect.x)
def update(self):
self.x += (self.setting.allien_speed * self.setting.fleet_direction)
self.rect = self.x
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= screen_rect.left:
return True
#储存游戏中所有设置的类
class Setting:
def __init__(self):
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
# 飞船速度设置
self.ship_speed = 1.5
# 子弹设置
self.bullet_speed = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (60,60,60)
# 外星人设置
self.allien_speed = 1.0
self.fleet_drop_speed = 10
# fleet_direction = 1 为1 表示右移,为-1表示左移
self.fleet_direction = 1
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
# 子弹的类
def __init__(self,ai_game):
super().__init__()
self.screen = ai_game.screen
# 在(0,0)处先创建一个矩形,再移动到飞船
self.rect = pygame.Rect(0,0,ai_game.setting.bullet_width,ai_game.setting.bullet_height)
self.rect.centerx = ai_game.ship.rect.centerx
self.rect.top = ai_game.ship.rect.top
# 储存用小数表达的子弹的y
self.y = float(self.rect.y)
self.color = ai_game.setting.bullet_color
self.speed = ai_game.setting.bullet_speed
# 子弹的移动
def update(self):
#更新表示子弹位置的小数值
self.y -= self.speed
# 更新表示矩形y位置???
self.rect.y = self.y
def draw_bullet(self):
# 在屏幕上绘制子弹
pygame.draw.rect(self.screen,self.color,self.rect)