欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第十二章—武装飞船

程序员文章站 2022-07-10 11:35:03
12-1 蓝色天空 :创建一个背景为蓝色的Pygame窗口。 输出: 12-2 游戏角色 :找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。创建一个类,将该角色绘制到屏幕*,并将该图像的背景色设置为屏幕背景色,或将 屏幕背景色设置为该图像的背景色。 alien_invasion1.py ro ......

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()

输出:

第十二章—武装飞船