python《从入门到实践》笔记第12章 飞船游戏(上)

首先是介绍了pygame模块的安装,网上找了个教程

pygame安装(超级详细)_请叫我小纯洁-CSDN博客_pygame安装

pygame.init()初始化的解释

pygame的init究竟做了什么 - 同十月 - 博客园

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

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

 1 #创建一个背景为蓝色的pygame窗口12-1 12-2游戏角色
 2 #
 3 
 4 import sys   #sys模块功能:实现从程序外部向程序传递参数,可以参考当你点击红叉叉时产生了一个参数,把这个参数传递到程序中
 5 
 6 import pygame #导入pygame模块
 7 from weitusetting import Suo   #导入weirusetting中的Suo函数
 8 
 9 def blue_screen():   #定义蓝色窗口方法
10     #蓝色窗口
11     pygame.init()   # 初始化pygame,检查一些需要的硬件调用接口、基础功能是否有问题。如果有,他会在程序运行之前就反馈给你,方便你进行排查和规避。
12     screen = pygame.display.set_mode((800,600)) #将设置好的屏幕模块参数传入到变量screen 
13     pygame.display.set_caption("Adasd Csas")#调用pygame模块中的display模块中的set_caption设置标题模块
14 
15     #设置背景色
16     suo = Suo(screen) #创建一个名为suo的Suo实例创建在主循环前是因为以免每次循环都创建一张图
17    # bg_color = (0,0,255) #背景色红绿蓝每种都是0-255
18 
19     #主循环
20     while True:
21 
22         #监视键盘和鼠标对关闭按钮的事件
23         for event in pygame.event.get():   #循环侦听事件,事件指的是用户玩游戏时执行的操作,按键或点击等
24             if event.type == pygame.QUIT: #检测并响应特定的事件 当点击窗口关闭按钮时,将检测到pygame.QUIT事件
25                 pygame.quit()
26                 sys.exit()    #检测到事件后他的反映是调用sys.exit()进行退出
27 
28         #重绘屏幕
29         screen.fill(bg_color)  #fill()方法:填充
30         suo.blitme()   #调用class里的blitme()
31 
32         #使绘制的屏幕可见
33         pygame.display.flip()#pygame模块中的filp方法
34 
35 blue_screen()  #运行
36 
37 #weitusetting.py
38 import pygame
39 
40 class Suo():
41 
42     def __init__(self, screen):
43         """初始化图片并设置图片的初始位置"""
44         self.screen = screen
45 
46         #加载图片并获取其外接矩形
47         self.image = pygame.image.load('weitu.bmp') #pygame.image.load()
48         self.rect = self.image.get_rect()   #rect对象
49         self.screen_rect = screen.get_rect()
50    
51         #将图片凡在屏幕中央
52         self.rect.centerx = self.screen_rect.centerx
53      #游戏元素居中,可设置相应rect对象的属性center、centerx或centery
54 #让游戏元素与屏幕边缘对齐,可使用属性top、bottom、left或right
55 #要调整游戏元素的水平或垂直位置,可使用属性x和y,它们分别是相应矩形左上角的x和y坐标。
56     def blitme(self):
57         """在指定的位置"""
58         self.screen.blit(self.image, self.rect)

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

 1 ##具体代码和书上的例子差不多
 2 ##只是在移动标志和更新移动标志的方法有所添加
 3 
 4         # 在飞船的属性center, bottom中存储小数值
 5         self.center = float(self.rect.centerx)  #横轴
 6         self.center1 = float(self.rect.centery) #纵轴
 7     
 8         #移动标志
 9         self.moving_right = False   #初始值为False(0)
10         self.moving_left = False
11         self.moving_up = False
12         self.moving_down = False
13         
14     def update(self):
15         """根据移动标志调整飞机位置"""
16         # 更新飞船的center and bottom值,而不是rect
17         if self.moving_right and self.rect.right < self.screen_rect.right:
18             self.center += self.ai_settings.ship_speed_factor
19         if self.moving_left and self.rect.left > 0:
20             self.center -= self.ai_settings.ship_speed_factor
21 
22         if self.moving_up and self.rect.top > 0:
23             self.center1 -= self.ai_settings.ship_speed_factor
24         if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
25             self.center1 += self.ai_settings.ship_speed_factor
26 
27         # 根据self.center和self.bottom更新rect对象
28         self.rect.centerx = self.center
29         self.rect.centery = self.center1

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

 1 import sys
 2 
 3 import pygame
 4 
 5 def run_game():
 6 
 7     pygame.init()
 8     screen = pygame.display.set_mode((800,600))
 9     pygame.display.set_caption("空屏幕")
10 
11     #主循环
12     while True:
13 
14         ##监视按键
15         for event in pygame.event.get():
16             if event.type == pygame.KEYDOWN:
17                 print(event.key)
18 
19 run_game()
20     
21 ##响应:  #键盘上每个健对应者一个数值,例如空格健是32

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

  1 #与书上的例子相同,只是方向不同,需要修改的ship, game_function, bullet这三个文件中的方向属性
  2 #ship.pyimport pygame
  3 
  4 class Ship():
  5 
  6     def __init__(self, ai_settings, screen):
  7         """初始化飞船并设置其初始位置"""
  8         self.screen = screen
  9         self.ai_settings = ai_settings
 10 
 11         # 加载飞船图像并获取其外接矩形
 12         self.image = pygame.image.load('images/ship.bmp')  #图片载入
 13         self.image = pygame.transform.rotate(self.image, -90)#旋转图片
 14         self.rect = self.image.get_rect()  #图片获取
 15         self.screen_rect = screen.get_rect()  #加载到背景
 16 
 17         # 将每艘新飞船放在屏幕左边中央
 18         self.rect.centery = self.screen_rect.centery #游戏元素居中设置为y轴居中
 19         self.rect.left = self.screen_rect.left    #修改图形对象的初始地在左边
 20 
 21         # 在飞船的属性center中存储小数值
 22         self.center = float(self.rect.centery) #这里使用centery进行y轴中心
 23         
 24         # 移动标志
 25         self.moving_up = False
 26         self.moving_down = False
 27 
 28     def update(self):
 29         """更具移动标志调整飞船的位置"""
 30         # 更新飞船的center值,而不是rect
 31         if self.moving_up and self.rect.top > 0:   #这里使用的是top元素
 32             self.rect.centery -= 1      #这里可以用1也可以用书上写得屏幕边值
 33         if self.moving_down and self.rect.bottom < self.screen_rect.bottom:  #bottom底部
 34             self.rect.centery += 1
 35     def blitme(self):
 36         """在指定位置绘制飞船"""
 37         self.screen.blit(self.image, self.rect)
 38         
 39 #game_functions.py
 40 import sys
 41 import pygame
 42 
 43 from bullet12 import Bullet
 44 from ship12 import Ship
 45 
 46 
 47 def check_keydown_events(event, ai_settings, screen, ship, bullets):
 48     """响应按键"""
 49     if event.key == pygame.K_UP:  #K_UP是pygame模块中的上健事件,如果获取到的事件是上按键,那么
 50     #向上移动飞船
 51         ship.moving_up = True     #moving_up的值变为True
 52     elif event.key == pygame.K_DOWN:
 53         ship.moving_down = True
 54     elif event.key == pygame.K_SPACE:
 55         #创建一颗子弹,并将其加入到编组bullets中
 56         new_bullet = Bullet(ai_settings, screen, ship)
 57         bullets.add(new_bullet)
 58 
 59 def check_keyup_events(event, ship):   #按键松开的响应
 60     """响应松开"""
 61     if event.key == pygame.K_UP:
 62         ship.moving_up = False
 63     elif event.key == pygame.K_DOWN:
 64         ship.moving_down = False
 65 
 66 def check_events(ai_settings, screen, ship, bullets):
 67     """响应按键和鼠标事件"""
 68     for event in pygame.event.get():
 69         if event.type == pygame.QUIT:
 70             pygame.quit()
 71             sys.exit()
 72         elif event.type == pygame.KEYDOWN:
 73             check_keydown_events(event, ai_settings, screen, ship, bullets) 
 74         elif event.type == pygame.KEYUP:
 75             check_keyup_events(event, ship)
 76 
 77 def update_screen(ai_settings, screen, ship, bullets):
 78     """更新屏幕上的图像,并切换到新 屏幕"""
 79     # 每次循环时都重绘屏幕
 80     screen.fill(ai_settings.bg_color)
 81     ship.blitme()
 82     for bullet in bullets.sprites():
 83         bullet.draw_bullet()
 84 
 85     # 让最近绘制的屏幕可见
 86     pygame.display.flip()
 87 #
 88 ##settings12.py  factor 要素,像素
 89 class Settings():
 90     """存储《外星人入侵》的所有设置的类"""
 91 
 92     def __init__(self):
 93         """初始化游戏的设置"""
 94         #屏幕设置
 95         self.screen_width = 1200
 96         self.screen_height = 800
 97         self.bg_color = (230, 230, 230)
 98 
 99         # 飞船的设置
100         self.ship_speed_factor = 1.5
101 
102         # 子弹设置
103         self.bullet_speed_factor = 1
104         self.bullet_width = 5
105         self.bullet_height = 5
106         self.bullet_color = 60, 60, 60
107         #self.bullets_allowed = 3
108         
109 #alien_invasion12.py
110 import sys
111 
112 import pygame
113 
114 from settings12 import Settings
115 from ship12 import Ship
116 import game_functions12 as gf
117 from pygame.sprite import Group
118 from bullet12 import Bullet
119 
120 
121 def run_game():
122     #初始化pygame、设置和屏幕对象
123     pygame.init()
124 
125     ai_settings = Settings()
126     screen = pygame.display.set_mode(
127         (ai_settings.screen_width, ai_settings.screen_height))
128     pygame.display.set_caption("左边上下串")
129 
130     # 创建一艘飞船
131     ship = Ship(ai_settings, screen)
132     #创建一个用于存储子弹的编组
133     bullets = Group()
134     
135     # 开始游戏的主循环
136     while True:
137         gf.check_events(ai_settings, screen, ship, bullets)
138         ship.update()
139         bullets.update()
140         gf.update_screen(ai_settings, screen, ship, bullets)
141 
142         # 删除已消失的子弹
143         for bullet in bullets.copy():
144             if bullet.rect.right <= 0:
145                 bullets.remove(bullet)
146         print(len(bullets))
147 
148         
149 run_game()
150 
151 #bullet.py
152 import pygame
153 from pygame.sprite import Sprite
154 
155 class Bullet(Sprite):
156     """一个对飞船发射的子弹进行管理的类"""
157 
158     def __init__(self, ai_settings, screen, ship):
159         """在飞船所处的位置创建一个子弹对象"""
160         super().__init__()
161         self.screen = screen
162 
163         # 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
164         self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,
165                                 ai_settings.bullet_height)
166         self.rect.centery = ship.rect.centery
167         self.rect.right = ship.rect.right
168 
169         # 存储用小数表示的子弹位置
170         self.x = float(self.rect.x)
171 
172         self.color = ai_settings.bullet_color
173         self.speed_factor = ai_settings.bullet_speed_factor
174 
175     def update(self):
176         """向上移动子弹"""
177         #更新表示子弹位置的小数值
178         self.x += self.speed_factor
179         #更新表示子弹的rect的位置
180         self.rect.x = self.x
181 
182     def draw_bullet(self):
183         """在屏幕上绘制子弹"""
184         pygame.draw.rect(self.screen, self.color, self.rect)

还不熟练,还得多搞写项目,和还有就是pygame中的模块例如rect,  draw等,都得百度和看F11,不明确啊

posted @ 2022-01-23 16:38  zy勇士  阅读(181)  评论(0编辑  收藏  举报