第十二章—武装飞船

Posted 刘海儿啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二章—武装飞船相关的知识,希望对你有一定的参考价值。

12-1 蓝色天空 :创建一个背景为蓝色的Pygame窗口。

 1 import sys
 2 import pygame
 3 def run_game():
 4     #初始化游戏并创建一个屏幕对象
 5     pygame.init()
 6     screen=pygame.display.set_mode((1200,800))
 7     pygame.display.set_caption("Alien Invasion")
 8     #设置背景颜色
 9     bg_color=(0,0,255)
10     #开始游戏的主循环
11     while True:
12         #监视键盘和鼠标事件
13         for event in pygame.event.get():
14             if event.type==pygame.QUIT:
15                 sys.exit()
16         #每次循环时都会重绘屏幕
17         screen.fill(bg_color)
18         #让最近绘制的屏幕可见
19         pygame.display.flip()
20 run_game()

输出:

12-2 游戏角色 :找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。创建一个类,将该角色绘制到屏幕中央,并将该图像的背景色设置为屏幕背景色,或将 屏幕背景色设置为该图像的背景色。

alien_invasion1.py

 1 import sys
 2 import pygame
 3 from rocket import Rocket
 4 
 5 def run_game():
 6     #初始化游戏并创建一个屏幕对象
 7     pygame.init()
 8     screen=pygame.display.set_mode((800,600))
 9     pygame.display.set_caption("Alien Invasion")
10 
11     #创建一艘火箭
12     rocket=Rocket(screen)
13 
14     #设置背景颜色
15     bg_color=(0,0,255)
16     #开始游戏的主循环
17     while True:
18         #监视键盘和鼠标事件
19         for event in pygame.event.get():
20             if event.type==pygame.QUIT:
21                 sys.exit()
22         #每次循环时都会重绘屏幕
23         screen.fill(bg_color)
24         rocket.blitme()
25         #让最近绘制的屏幕可见
26         pygame.display.flip()
27 run_game()

rocket.py

 1 import pygame
 2 class Rocket():
 3     def __init__(self,screen):
 4         \'\'\'初始化火箭并设置其初始位置\'\'\'
 5         self.screen=screen
 6         #加载火箭图像图像并获取其外接矩形
 7         self.image=pygame.image.load(\'image/rocket.bmp\')
 8         self.rect = self.image.get_rect()
 9         self.screen_rect = screen.get_rect()
10 
11         #将每艘新火箭放在屏幕中央
12         self.rect.centerx = self.screen_rect.centerx
13         self.rect.centery = self.screen_rect.centery
14         # 在飞船的属性center中存储小数值
15         self.center = float(self.rect.centerx)
16 
17     def blitme(self):
18         # 在指定位置绘制飞船
19         self.screen.blit(self.image, self.rect)

输出:

12-3 火箭 :编写一个游戏,开始时屏幕中央有一个火箭,而玩家可使用四个方向键上下左右移动火箭。请务必确保火箭不会移到屏幕外面。 

alien_invasion1.py

 1 import sys
 2 import pygame
 3 import game_functions1 as gf
 4 from settings1 import Settings
 5 from rocket import Rocket
 6 
 7 def run_game():
 8     #初始化游戏并创建一个屏幕对象
 9     pygame.init()
10     ai_settings=Settings()
11     screen=pygame.display.set_mode(
12         (ai_settings.screen_width,ai_settings.screen_height))#窗口尺寸
13     pygame.display.set_caption("Rocket")
14     #创建一个火箭
15     rocket=Rocket(ai_settings,screen)
16     #开始游戏主循环
17     while True:
18         #监视键盘和鼠标事件
19         gf.check_events(rocket)
20         rocket.update()
21         gf.update_screen(ai_settings,screen,rocket)
22 run_game()

输出:

12-4 按键 :创建一个程序,显示一个空屏幕。在事件循环中,每当检测到pygame.KEYDOWN 事件时都打印属性event.key。运行这个程序,并按各种键,看看Pygame如何响应。

 

 1 import sys
 2 import pygame
 3 def run_game():
 4     pygame.init()
 5     screen=pygame.display.set_mode((1000,600))
 6     pygame.display.set_caption(\'kong\')
 7     bg_color = (230, 230, 230)
 8     while True:
 9         for event in pygame.event.get():
10             if event.type==pygame.QUIT:
11                 sys.exit()
12             elif event.type == pygame.KEYDOWN:
13                 if event.key==pygame.K_DOWN:
14                     bg_color = (255, 0, 0)
15                 else :
16                     bg_color = (0, 255, 0)
17         screen.fill(bg_color)
18         pygame.display.flip()
19 
20 run_game()

输出:

点击运行后键盘无操作:

键盘向下键:

键盘其他键:

 12-5 侧面射击 :编写一个游戏,将一艘飞船放在屏幕左边,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右穿行的子弹,并在子弹离开 屏幕而消失后将其删除。

settings2.py

 1 class Settings():
 2     #存储《外星人入侵》的所有设置的类
 3     def __init__(self):
 4         #初始化游戏的设置
 5         #屏幕设置
 6         self.screen_width=1000
 7         self.screen_height=500
 8         self.bg_color=(230,230,230)
 9         #飞船的设置
10         self.ship_speed_factor=1.5
11 
12         #子弹的设置
13         self.bullet_speed_factor=1
14         self.bullet_width=15
15         self.bullet_height=3
16         self.bullet_color=(60,60,60)
17         self.bullets_allowed=6

ship2.py

 1 import pygame
 2 class Ship():
 3     def __init__(self,ai_settings,screen):
 4         #初始化飞船并设置其初始位置
 5         self.screen=screen
 6         self.ai_settings=ai_settings
 7         #加载飞船图像并获取其外接矩形
 8         self.image=pygame.image.load(\'image/ship.bmp\')
 9         self.rect=self.image.get_rect()
10         self.screen_rect=screen.get_rect()
11         #将每艘新飞船放在屏幕左侧中央
12         self.rect.left=self.screen_rect.left
13         self.rect.centery=self.screen_rect.centery
14         #在飞船的属性center中存储小数值
15         self.centery=float(self.rect.centery)
16 
17         #移动标志
18         self.moving_up=False
19         self.moving_down = False
20     def update(self):
21         """根据移动标志调整飞船位置"""
22         #更新飞船的center值,而不是rect
23         if self.moving_up and self.rect.top>0:
24             self.centery-=self.ai_settings.ship_speed_factor
25         if self.moving_down and self.rect.bottom<self.screen_rect.bottom:
26             self.centery+=self.ai_settings.ship_speed_factor
27 
28         #根据self.centery更新rect对象
29         self.rect.centery=self.centery
30 
31     def blitme(self):
32         #在指定位置绘制飞船
33         self.screen.blit(self.image,self.rect)

bullet2.py

 1 import pygame
 2 from pygame.sprite import Sprite
 3 
 4 class Bullet(Sprite):
 5     \'\'\'一个对飞船发射的子弹进行管理的类\'\'\'
 6     def __init__(self,ai_settings,screen,ship):
 7         """在飞船所处的位置创建一个子弹对象"""
 8         super(Bullet,self).__init__()
 9         self.screen=screen
10         #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
11         self.rect=pygame.Rect(0,0,ai_settings.bullet_width,
12                               ai_settings.bullet_height)
13         self.rect.centery=ship.rect.centery
14         self.rect.left=ship.rect.left
15         #存储用小数表示的子弹位置
16         self.x=float(self.rect.x)
17         self.color= ai_settings.bullet_color
18         self.speed_factor=ai_settings.bullet_speed_factor
19     def update(self):
20         """向右移动子弹"""
21         #更新表示子弹位置的小数值
22         self.x+=self.speed_factor
23         #更新表示子弹的rect的位置
24         self.rect.x=self.x
25 
26     def draw_bullet(self):
27         """在屏幕上绘制子弹"""
28         pygame.draw.rect(self.screen,self.color,self.rect)

game_functions2.py

 1 import sys
 2 import pygame
 3 from bullet2 import Bullet
 4 def check_keydown_events(event,ai_settings,screen,ship,bullets):
 5     """响应按键"""
 6     if event.key == pygame.K_UP:
 7         # 向上移动飞船
 8         ship.moving_up = True
 9     elif event.key == pygame.K_DOWN:
10         # 向下移动飞船
11         ship.moving_down = True
12     elif event.key==pygame.K_SPACE:
13         fire_bullet(ai_settings, screen, ship, bullets)
14 
15 def fire_bullet(ai_settings,screen,ship,bullets):
16     """如果还没有到达限制,就发射一颗子弹"""
17     # 创建一颗子弹,并将其加入到编组bullets中
18     if len(bullets) < ai_settings.bullets_allowed:
19         new_bullet = Bullet(ai_settings, screen, ship)
20         bullets.add(new_bullet)
21 
22 def check_keyup_events(event,ship):
23     """响应松开"""
24     if event.key == pygame.K_UP:
25         # 向上移动飞船
26         ship.moving_up = False
27     elif event.key == pygame.K_DOWN:
28         # 向上移动飞船
29         ship.moving_down = False
30 def check_events(ai_settings,screen,ship,bullets):
31     for event in pygame.event.get():
32         if event.type == pygame.QUIT:
33             sys.exit()
34         elif event.type==pygame.KEYDOWN:
35             check_keydown_events(event, ai_settings,screen,ship,bullets)
36 
37         elif event.type==pygame.KEYUP:
38             check_keyup_events(event, ship)
39 
40 def update_screen(ai_settings,screen,ship,bullets):
41     """更新屏幕上的图像,并切换到新屏幕上"""
42     #每次循环时都重绘屏幕
43     screen.fill(ai_settings.bg_color)
44     #在飞船和外星人后面重绘所有子弹
45     for bullet in bullets.sprites():
46         bullet.draw_bullet()
47     ship.blitme()
48     #让最近绘制屏幕可见
49     pygame.display.flip()
50 def update_bullets(bullets):
51     # 更新子弹位置,删除已消失的子弹
52     #更新子弹位置
53     bullets.update()
54     #删除已消失的子弹
55     for bullet in bullets.copy():
56         if bullet.rect.left >= 1000:
57             bullets.remove(bullet)
58             # print(len(bullets))
alien_invasion2.py
 1 import sys
 2 import pygame
 3 from pygame.sprite import Group
 4 import game_functions2 as gf
 5 from settings2 import Settings
 6 from ship2 import Ship
 7 
 8 def run_game():
 9     #初始化游戏并创建一个屏幕对象
10     pygame.init()
11     ai_settings=Settings()
12     screen=pygame.display.set_mode(
13         (ai_settings.screen_width,ai_settings.screen_height))#窗口尺寸
14     pygame.display.set_caption("Alien Invasion")
15     #创建一个飞船
16     ship=Ship(ai_settings,screen)
17     #创建一个用于存储子弹的编组
18     bullets=Group()
19 
20     #开始游戏主循环
21     while True:
22         gf.check_events(ai_settings,screen,ship,bullets)
23         ship.update()
24         gf.update_bullets(bullets)
25         gf.update_screen(ai_settings,screen,ship,bullets)
26 run_game()

输出:

 

以上是关于第十二章—武装飞船的主要内容,如果未能解决你的问题,请参考以下文章

第十二章:面向对象编程

python应用篇之外星人入侵项目——武装飞船(下)

第十二章,结束练习

第十二章: 部署Django

linux程序设计——多线程(第十二章)

第十二章 Caché 设计模式 状态模式