教材第十二章习题
12-1 蓝色天空
import sys import pygame pygame.init() screen = pygame.display.set_mode((1200,800)) pygame.display.set_caption("Alien Invasion") bg_color = (0,0,255) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(bg_color) pygame.display.flip()
12-3 火箭
"""alien_invasion.py""" import sys import pygame from Settings import Settings from ship import * import game_functions as gf def run_game(): pygame.init() #bg_color = Image.open('images/ship.bmp').getcolors() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #bg_color = (0,0,0) ship = Ship(ai_settings, screen) while(True): gf.check_events(ship) ship.update() gf.update_screen(ai_settings, screen, ship) run_game()
"""settings.py""" class Settings(): def __init__(self): self.screen_width = 600 self.screen_height = 400 self.bg_color = (230,230,230) self.ship_speed_factor = 1.5
"""ship.py""" import pygame #from PIL import Image class Ship(): def __init__(self,ai_settings, screen): self.ai_settings = ai_settings self.screen = screen 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.centerx self.rect.bottom = self.screen_rect.bottom #self.color = Image.open('images/ship.bmp').getcolors() #self.width, self.height = self.image.get_size() self.moving_right = False self.moving_left = False self.moving_up = False self.moving_down = False #self.ship_speed_factor = ai_settings.ship_speed_factor def update(self): if self.moving_right and self.rect.right<self.screen_rect.right: self.rect.centerx += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left>0: self.rect.centerx -= self.ai_settings.ship_speed_factor if self.moving_up and self.rect.top>0: self.rect.centery -= self.ai_settings.ship_speed_factor if self.moving_down and self.rect.bottom<self.screen_rect.bottom: self.rect.centery += self.ai_settings.ship_speed_factor def blitme(self): #self.screen.blit(self.image, (300-self.width/2,200-self.height/2)) self.screen.blit(self.image, self.rect)
"""game_functions.py""" import sys import pygame def check_events(ship): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_UP: ship.moving_up = True elif event.key == pygame.K_DOWN: ship.moving_down = True elif event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False elif event.key == pygame.K_UP: ship.moving_up = False elif event.key == pygame.K_DOWN: ship.moving_down = False def update_screen(ai_settings, screen, ship): screen.fill(ai_settings.bg_color) ship.blitme() pygame.display.flip()
12-4 按键
"""按键""" import sys import pygame def run_game(): pygame.init() screen = pygame.display.set_mode((600, 400)) pygame.display.set_caption("Blank") while(True): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: print(event.type) screen.fill((230,230,230)) pygame.display.flip() run_game()
12-5 侧面射击
"""alien_invasion.py""" import sys import pygame from Settings import Settings from ship import * import game_functions as gf from pygame.sprite import Group def run_game(): pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") bullets = Group() ship = Ship(ai_settings, screen) while(True): gf.check_events(ai_settings, screen, ship, bullets) ship.update() bullets.update() gf.update_bullets(bullets,screen) gf.update_screen(ai_settings, screen, ship,bullets) run_game()
"""settings.py""" class Settings(): def __init__(self): self.screen_width = 600 self.screen_height = 400 self.bg_color = (230,230,230) self.ship_speed_factor = 1.5 self.bullet_width = 15 self.bullet_height = 3 self.bullet_color = 60,60,60 self.bullet_speed_factor = 1 self.bullet_allowed = 3
"""ship.py""" import pygame class Ship(): def __init__(self,ai_settings, screen): self.ai_settings = ai_settings self.screen = screen self.image = pygame.image.load('images/ship.bmp') self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.rect.left = self.screen_rect.left self.rect.centery = self.screen_rect.centery self.moving_up = False self.moving_down = False def update(self): if self.moving_up and self.rect.top>0: self.rect.centery -= self.ai_settings.ship_speed_factor if self.moving_down and self.rect.bottom<self.screen_rect.bottom: self.rect.centery += self.ai_settings.ship_speed_factor def blitme(self): #self.screen.blit(self.image, (300-self.width/2,200-self.height/2)) self.screen.blit(self.image, self.rect)
"""game_functions.py""" import sys import pygame from bullet import Bullet def check_keydown_events(event, ai_settings, screen, ship, bullets): if event.key == pygame.K_UP: ship.moving_up = True elif event.key == pygame.K_DOWN: ship.moving_down = True elif 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.bullet_allowed: new_bullet = Bullet(ai_settings, screen, ship) bullets.add(new_bullet) def check_keyup_events(event, ship): if event.key == pygame.K_UP: ship.moving_up = False elif event.key == pygame.K_DOWN: ship.moving_down = False def 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, bullets): screen.fill(ai_settings.bg_color) for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() pygame.display.flip() def update_bullets(bullets,screen): bullets.update() for bullet in bullets.copy(): if bullet.rect.left>=screen.get_rect().right: bullets.remove(bullet)
import pygame from pygame.sprite import Sprite class Bullet(Sprite): def __init__(self, ai_settings, screen, ship): super().__init__() self.screen = screen self.rect = pygame.Rect(0,0,ai_settings.bullet_width, ai_settings.bullet_height) self.rect.centery = ship.rect.centery self.rect.right = ship.rect.right self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor self.x = float(self.rect.x) def update(self): self.x += self.speed_factor self.rect.x = self.x def draw_bullet(self): pygame.draw.rect(self.screen, self.color, self.rect)