
原始碼+素材
鏈接: https://pan.baidu.com/s/1dPDUelWCFoFhX-_KEoUNGA
提取碼: mtui
目錄
1.搭建基本框架,實作關閉視窗的功能,
2.螢屏上放置一架飛機
3.可以每次回圈改變飛機的坐標,讓飛機動起來
4.讓飛機動起來(每次重新繪制)
5.設定幀率
6.創建飛機類
7.使用方向鍵控制飛機移動
=======以下實作方式效果不太理想,可以跳過,我這里僅僅記錄一下=====
8.設定初始位置,限制飛機的活動區域
9.設定子彈類,并能夠發射一顆子彈
10.設定按空格發射子彈
11.完善 “發送子彈” 功能
12.創建敵機類
13.檢測敵機(一個精靈)與子彈(精靈組)的碰撞
14.檢測敵機(一個精靈)與戰斗機(一個精靈)的碰撞,
15.記錄得分
16.將圖片替換對應的矩形
17.優化游戲效果,矩形碰撞會在矩形畫框接觸就碰撞,想要非透明顏色接觸才碰撞,
18.音效添加
1.搭建基本框架,實作關閉視窗的功能,
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
pygame.display.set_mode((480,600))
#3.游戲的主回圈(事件的監聽,資料的修改,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改
#3.3 界面的更新
2.螢屏上放置一架飛機
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個影像
plane_surface = pygame.Surface((50,50))
plane_surface.fill('green')
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.blit(plane_surface,(50,50)) # 螢屏上 放 飛機,位置是(50,50)
#3.3 界面的更新
pygame.display.flip()

3.可以每次回圈改變飛機的坐標,讓飛機動起來
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個影像
plane_surface = pygame.Surface((50,50))
plane_surface.fill('green')
plane_y = 0
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.blit(plane_surface,(50,plane_y)) # 螢屏上 放 飛機,位置是(50,50)
plane_y += 1
#3.3 界面的更新
pygame.display.flip()

問題:每次回圈,網螢屏上面繪制飛機,是在原圖的基礎之上,
解決:每次回圈,都要重新繪制(先繪制底層,后繪制上層)
4.讓飛機動起來(每次重新繪制)
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個影像
plane_surface = pygame.Surface((50,50))
plane_surface.fill('green')
plane_y = 0
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
screen_surface.blit(plane_surface,(50,plane_y)) # 螢屏上 放 飛機,位置是(50,50)
plane_y += 1
#3.3 界面的更新
pygame.display.flip()
5.設定幀率
每秒鐘設定切換多少張圖片,也就是一秒回圈多少次,
一般在一次回圈結束之后設定等待時間(這樣好理解)
所需代碼
clock = pygame.time.Clock()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
案例
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個影像
plane_surface = pygame.Surface((50,50))
plane_surface.fill('green')
plane_y = 0
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
screen_surface.blit(plane_surface,(50,plane_y)) # 螢屏上 放 飛機,位置是(50,50)
plane_y += 1
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
6.創建飛機類
需要繼承pygame.sprite,它是游戲物件的基類,可以偵測碰撞,根據原始碼注釋可得,
需要重寫 Sprite.update(),創建 Sprite.image and Sprite.rect屬性,
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
def update(self):
pass
plane_surface = Plane()
plane_y = 0
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
screen_surface.blit(plane_surface.image,(50,plane_y)) # 螢屏上 放 飛機,位置是(50,50)
plane_y += 1
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
7.使用方向鍵控制飛機移動
知識講解
1.圖片(surface)放到的位置可以是x,y坐標,也可以是矩形所在的位置,
screen_surface.blit(plane_surface.image,(x坐標,y坐標))
screen_surface.blit(plane_surface.image,矩形物件)
2.矩形來源:
surface_rect = surface.get_rect()
3.為什么圖片(surface)移動需要借助矩形?
因為矩形有更多的移動位置方式,
不僅可以設定x,y坐標屬性,絕對坐標
還可以使用move(x,y),相對坐標,
這可能也是繼承Sprite,需要設定Sprite.rect屬性的原因,
4.獲取方向事件
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT]:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT]:
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP]:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN]:
self.rect = self.rect.move(0,10)
代碼:
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT]:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT]:
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP]:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN]:
self.rect = self.rect.move(0,10)
plane_surface = Plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
plane_surface.update() #修改資料
screen_surface.blit(plane_surface.image,plane_surface.rect) # 螢屏上 放 飛機,位置是(50,50)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
=======以下實作方式效果不太理想,可以跳過,我這里僅僅記錄一下=====
注意時間的使用和回收(只要遍歷事件,就會從佇列中取出事件)

代碼:
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
def update(self):
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print('左側')
self.rect = self.rect.move(-10,0)#移動之后的rect重新更新屬性
elif event.key == pygame.K_RIGHT:
print('右側')
self.rect = self.rect.move(10,0)
else:#取出來的事件不是需要的,再放回去,以防其他地方需要使用
pygame.event.post(event)
plane_surface = Plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
else:#取出來的事件不是需要的,再放回去,以防其他地方需要使用
pygame.event.post(event)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
plane_surface.update() #修改資料
screen_surface.blit(plane_surface.image,plane_surface.rect) # 螢屏上 放 飛機,位置是(50,50)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
8.設定初始位置,限制飛機的活動區域
8.1設定矩形的中心位置的 初始位置,x是1/2寬度,y是視窗的高度減去一段
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
8.2 限制飛機的活動區域,
飛機的最左側側大于視窗橫向的最小值,飛機的最右側小于視窗橫向的最大值,
y也是一樣,
只有符合條件,才可以移動坐標
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
8.3 代碼
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
plane_surface = Plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
plane_surface.update() #修改資料
screen_surface.blit(plane_surface.image,plane_surface.rect) # 螢屏上 放 飛機,位置是(50,50)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
9.設定子彈類,并能夠發射一顆子彈
子彈類的創建,模仿飛機類,
子彈類初始化位置,需要傳入飛機的位置,子彈移到飛機,
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
# 創建一架飛機
plane_surface = Plane()
# 創建一個子彈
bullet_surface = Bullet(plane_surface.rect.center)
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料
screen_surface.blit(plane_surface.image,plane_surface.rect) # 螢屏上 放 飛機,位置是(50,50)
# 3.2 子彈更新資料 更新畫面
bullet_surface.update()
screen_surface.blit(bullet_surface.image, bullet_surface.rect)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
10.設定按空格發射子彈
1.# 創建一個子彈 (位置不要在螢屏上,目的是有這個物件,不讓回圈里的“呼叫物件更改資料”操作報錯)
2.判斷是否按下空格,按下空格發射子彈
# 按下一個空格,創建一個子彈物件
# 回圈里“呼叫物件更改資料”操作,每次都是都是更新最新的物件
以下代碼實作效果:
螢屏里只會有一個子彈,
發射下一個的子彈的時候,上個子彈就消失了(因為不對上一個子彈進行更新了,子彈物件變成了最新的子彈物件)
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
# 創建一架飛機
plane_surface = Plane()
# 創建一個子彈 (位置不要在螢屏上,目的是有這個物件,不讓回圈里的“呼叫物件更改資料”操作報錯)
bullet_surface = Bullet((-10,0))
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
# (回圈里“呼叫物件更改資料”操作,每次都是都是更新最新的物件)
bullet_surface = Bullet(plane_surface.rect.center)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料
screen_surface.blit(plane_surface.image,plane_surface.rect) # 螢屏上 放 飛機,位置是(50,50)
# 3.2 子彈更新資料 更新畫面
bullet_surface.update()
screen_surface.blit(bullet_surface.image, bullet_surface.rect)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
11.完善 “發送子彈” 功能
1.每次按下空格,需要單獨創建一個子彈物件,每次對每個子彈進行更新,
解決辦法:借助精靈的 pygame.sprite.Group (用于保存和管理多個 Sprite 物件的容器類,),
每次按下空格===》將新建的物件存入,同名的物件不會被替換==》回圈里面呼叫sprite的更新===》相當于呼叫了這個組里所有的物件的update 方法,
2.代碼完善注意:類的update方法,既要有更新資料,又要有重繪螢屏,
3.注意:screen_surface.blit(self.image, self.rect)引數都是當前物件.image,當前物件.rect
import pygame,sys
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
12.創建敵機類
敵機從頂隨機下落,超過底邊緣再回到頂部,
創建敵機類,創建敵機物件,將敵機更新到螢屏上,
import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('red')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,10))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.3 敵機更新資料 更新畫面
enemy_plane_surface.update()
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
13.檢測敵機(一個精靈)與子彈(精靈組)的碰撞
#第一個引數是精靈,
#第二個引數是精靈組,
#第三個引數為True,則碰撞檢測后,組中所有碰撞的精靈被洗掉
#回傳 組中被碰撞的精靈
collide_list = pygame.sprite.spritecollide(sprite,group,False)
import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('red')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,10))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True)
if a:
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
14.檢測敵機(一個精靈)與戰斗機(一個精靈)的碰撞,
pygame.sprite.collide_rect(first, second) #回傳布林值
import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('red')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,10))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True)
if a:
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
b = pygame.sprite.collide_rect(enemy_plane_surface, plane_surface) # 回傳布林值
if b:
break
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
15.記錄得分
獲得字體物件,通過字體物件生成 surface物件,
獲得字體物件需要讀取字體檔案,
#實作記錄分數
font_name = pygame.font.match_font("黑體")#2.獲得字體檔案
font = pygame.font.Font(font_name, 20) #1.獲取font物件(需要字體檔案)
# 繪制內容:text為內容,True為是否抗鋸齒, WHITE是字體顏色
font_surface = font.render(str(score),True,'white')#3.將文字生成 surface物件
screen_surface.blit(font_surface,(screen_surface.get_width()/2,10))
import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('green')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
self.image = pygame.Surface((10,30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
self.image = pygame.Surface((50,50))
self.image.fill('red')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,10))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
score = 0#存盤得分
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True)
if a:
score += 10
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
b = pygame.sprite.collide_rect(enemy_plane_surface, plane_surface) # 回傳布林值
if b:
break
#實作記錄分數
font_name = pygame.font.match_font("黑體")#2.獲得字體檔案
font = pygame.font.Font(font_name, 20) #1.獲取font物件(需要字體檔案)
# 繪制內容:text為內容,True為是否抗鋸齒, WHITE是字體顏色
font_surface = font.render(str(score),True,'white')#3.將文字生成 surface物件
screen_surface.blit(font_surface,(screen_surface.get_width()/2,10))
#3.3 界面的更新
pygame.display.flip()
clock.tick(30)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
16.將圖片替換對應的矩形
同目錄檔案夾下放上圖片




import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('green')
self.image = pygame.image.load('./image/plane.png')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
# self.image = pygame.Surface((10,30))
# self.image.fill('yellow')
self.image = pygame.image.load('./image/bt.png')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('red')
self.image = pygame.image.load('./image/e_plane.png')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,5))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
score = 0#存盤得分
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True)
if a:
score += 10
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
b = pygame.sprite.collide_rect(enemy_plane_surface, plane_surface) # 回傳布林值
if b:
break
#實作記錄分數
font_name = pygame.font.match_font("黑體")#2.獲得字體檔案
font = pygame.font.Font(font_name, 20) #1.獲取font物件(需要字體檔案)
# 繪制內容:text為內容,True為是否抗鋸齒, WHITE是字體顏色
font_surface = font.render(str(score),True,'white')#3.將文字生成 surface物件
screen_surface.blit(font_surface,(screen_surface.get_width()/2,10))
#3.3 界面的更新
pygame.display.flip()
clock.tick(60)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
17.優化游戲效果,矩形碰撞會在矩形畫框接觸就碰撞,想要非透明顏色接觸才碰撞,
pygame.sprite.collide_rect()
改成:
pygame.sprite.collide_mask()#兩個精靈之間的碰撞檢測,使用掩碼,
collided引數設定碰撞形式,默認是矩形碰撞,改成pygame.sprite.collide_mask,
pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True)
改成:
pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True,collided = pygame.sprite.collide_mask)
import pygame,sys
import random
#1.pygame庫的初始化
pygame.init()
#2.設定視窗
screen_surface = pygame.display.set_mode((480,600))
#4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('green')
self.image = pygame.image.load('./image/plane.png')
self.rect = self.image.get_rect()
#設定初始位置
self.rect.center = (screen_surface.get_width()/2,screen_surface.get_height()-20)
def update(self):
#獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed()#類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left>0:
self.rect = self.rect.move(-10,0)
if keys[pygame.K_RIGHT] and self.rect.right<screen_surface.get_width():
self.rect = self.rect.move(10,0)
if keys[pygame.K_UP] and self.rect.top>0:
self.rect = self.rect.move(0,-10)
if keys[pygame.K_DOWN] and self.rect.bottom<screen_surface.get_height():
self.rect = self.rect.move(0,10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
#5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self,center):#center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
# self.image = pygame.Surface((10,30))
# self.image.fill('yellow')
self.image = pygame.image.load('./image/bt.png')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
#獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0,-10)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
#6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)#呼叫父類的初始化方法
#super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('red')
self.image = pygame.image.load('./image/e_plane.png')
self.rect = self.image.get_rect()
#設定初始位置
x = random.randint(0,screen_surface.get_width())
y = 0
self.rect.center = (x,y)
def update(self):
self.rect = self.rect.move((0,5))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
score = 0#存盤得分
clock = pygame.time.Clock()
#3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
#3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
#3.2 資料的修改及繪圖
screen_surface.fill((0,0,0)) # 重新繪制背景
#3.2 飛機修改資料 更新畫面
plane_surface.update() #修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update()#修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite,True,collided = pygame.sprite.collide_mask)
if a:
score += 10
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
b = pygame.sprite.collide_mask(enemy_plane_surface, plane_surface) # 回傳布林值
if b:
break
#實作記錄分數
font_name = pygame.font.match_font("黑體")#2.獲得字體檔案
font = pygame.font.Font(font_name, 20) #1.獲取font物件(需要字體檔案)
# 繪制內容:text為內容,True為是否抗鋸齒, WHITE是字體顏色
font_surface = font.render(str(score),True,'white')#3.將文字生成 surface物件
screen_surface.blit(font_surface,(screen_surface.get_width()/2,10))
#3.3 界面的更新
pygame.display.flip()
clock.tick(60)#一秒切換30圖片,具體等多長事件,這個方法自己會計算
18.音效添加
music_bg = pygame.mixer.Sound('./mp3/背景音樂.mp3') # 加載音樂
music_bg.play(loops=-1) # 播放音樂 (loops=-1回圈播放)
import pygame, sys
import random
# 1.pygame庫的初始化
pygame.init()
# 2.設定視窗
screen_surface = pygame.display.set_mode((480, 600))
# 4.創建一個飛機
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # 呼叫父類的初始化方法
# super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('green')
self.image = pygame.image.load('./image/plane.png')
self.rect = self.image.get_rect()
# 設定初始位置
self.rect.center = (screen_surface.get_width() / 2, screen_surface.get_height() - 20)
def update(self):
# 獲取鍵盤事件,如果按下,回傳True
keys = pygame.key.get_pressed() # 類似字典,通過key獲取value
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect = self.rect.move(-10, 0)
if keys[pygame.K_RIGHT] and self.rect.right < screen_surface.get_width():
self.rect = self.rect.move(10, 0)
if keys[pygame.K_UP] and self.rect.top > 0:
self.rect = self.rect.move(0, -10)
if keys[pygame.K_DOWN] and self.rect.bottom < screen_surface.get_height():
self.rect = self.rect.move(0, 10)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 5.創建一個子彈類Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self, center): # center是初始位置,傳入坦克的中心
pygame.sprite.Sprite.__init__(self) # 呼叫父類的初始化方法
# self.image = pygame.Surface((10,30))
# self.image.fill('yellow')
self.image = pygame.image.load('./image/bt.png')
self.rect = self.image.get_rect()
# 設定初始位置 初始位置要在飛機處——>外部傳進
self.rect.center = center
def update(self):
# 獲取鍵盤事件,如果按下,回傳True
self.rect = self.rect.move(0, -10)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判斷是否出螢屏
self.kill() # 終止,相當于洗掉子彈
# 6.創建敵機
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # 呼叫父類的初始化方法
# super().__init__(self)#此方式呼叫不管事,原因未知
# self.image = pygame.Surface((50,50))
# self.image.fill('red')
self.image = pygame.image.load('./image/e_plane.png')
self.rect = self.image.get_rect()
# 設定初始位置
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
def update(self):
self.rect = self.rect.move((0, 5))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 螢屏上 放 飛機,位置是rect的位置
# 創建一架飛機
plane_surface = Plane()
# 創建一個 子彈 精靈組(用于存放所有的精靈物件)
bullet_sprite = pygame.sprite.Group()
# 創建敵機
enemy_plane_surface = Enemy_plane()
score = 0 # 存盤得分
#背景音樂
music_bg = pygame.mixer.Sound('./mp3/背景音樂.mp3') # 加載音樂
music_bg.play(loops=-1) # 播放音樂 (loops=-1回圈播放)
#發射音效
music_shoot = pygame.mixer.Sound('./mp3/shoot.mp3') # 加載音效
#得分音效
music_score = pygame.mixer.Sound('./mp3/得分.mp3') # 加載音效
clock = pygame.time.Clock()
# 3.游戲的主回圈(事件的監聽,資料的修改及繪圖,界面的更新)
while True:
# 3.1 事件的監聽,關閉按鈕無法使用,
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一個空格,創建一個子彈物件
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
music_shoot.play() # 播放發射音效
# 3.2 資料的修改及繪圖
screen_surface.fill((0, 0, 0)) # 重新繪制背景
# 3.2 飛機修改資料 更新畫面
plane_surface.update() # 修改資料+更新畫面
# 3.2 子彈更新資料 更新畫面
bullet_sprite.update() # 修改資料+更新畫面
# 3.2 敵機更新資料 更新畫面
enemy_plane_surface.update()
# 判斷子彈是否和敵機碰撞
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite, True, collided=pygame.sprite.collide_mask)
if a:
music_score.play() # 播放得分音效
score += 10
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
# 判斷敵機和戰斗機是否碰撞
b = pygame.sprite.collide_mask(enemy_plane_surface, plane_surface) # 回傳布林值
if b:
break
# 實作記錄分數
font_name = pygame.font.match_font("黑體") # 2.獲得字體檔案
font = pygame.font.Font(font_name, 20) # 1.獲取font物件(需要字體檔案)
# 繪制內容:text為內容,True為是否抗鋸齒, WHITE是字體顏色
font_surface = font.render(str(score), True, 'white') # 3.將文字生成 surface物件
screen_surface.blit(font_surface, (screen_surface.get_width() / 2, 10))
# 3.3 界面的更新
pygame.display.flip()
clock.tick(25) # 一秒切換30圖片,具體等多長事件,這個方法自己會計算
原始碼+素材
鏈接: https://pan.baidu.com/s/1dPDUelWCFoFhX-_KEoUNGA
提取碼: mtui
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289948.html
標籤:其他
上一篇:動態規劃懸線法
