python游戏代码示例_练习项目20:使用python制作游戏(中)
該樓層疑似違規已被系統折疊 隱藏此樓查看此樓
上一篇教程,我們通過實現一個敵機由上至下的循環過程,初步了解了pygame這個模塊的使用。
接下來,我們進行第二階段,真正的實現一個通過鼠標控制的小游戲。
因為內容量相對前面的教程來說比較大,我們把第二階段再分成兩個部分來實現。
第一部分:實現配置文件和游戲對象模塊;
第二部分:實現游戲主程序部分。
一、配置文件(config.ini)
在配置文件中,我們需要作如下配置:
游戲圖片:圖片的名稱
游戲窗口:寬、高、背景色(紅\藍\綠)、邊緣填充、是否全屏、字體尺寸
游戲速度:落下速度(敵方)、移動速度(己方)、速度增量(敵方)
游戲關卡:敵機數量
飛機實體:頂部、側邊
說明:飛機實體設置,是用于對己方飛機rect特性尺寸的調整,詳見Plane類的代碼。
配置文件內容:
[Image]
plane = images/plane.png
enemy = images/enemy.png
welcome = images/welcome.png
[Screen]
width = 360
height = 640
red = 255
blue = 255
green = 255
margin = 5
full_screen = 0
font_size = 24
[Speed]
drop_speed = 1
move_speed = 2
speed_increase = 1
[Level]
pre_level = 5
[Plane_padding]
top = 15
side = 15
二、游戲對象模塊(objects.py)
1、導入模塊并解析配置文件
在這個模塊的開始,我們需要先導入需要使用的其它模塊,并且對配置文件進行解析,方便在游戲對象類中使用配置數據。
示例代碼:
import configparser # 導入配置文件解析模塊
import pygame
from random import randrange
file = 'config.ini' # 配置文件路徑
config = configparser.ConfigParser() # 創建解析器對象
config.read(file, encoding='UTF-8') # 讀取并解析配置文件
2、創建抽象類
在游戲對象模塊中,我們只需要創建Enemy(敵方飛機)和Plane(己方飛機)兩個游戲對象類。
不過,在這兩個類中,會有很多相同的代碼。
我們可以把這些代碼抽取出來,單獨寫成一個類。
示例代碼:
class GameSprite(pygame.sprite.Sprite): # 定義游戲對象的抽象類
def __init__(self, image): # 定義構造方法(需要添加圖片參數)
pygame.sprite.Sprite.__init__(self) # 重載超類的構造方法
self.image = pygame.image.load(image).convert_alpha() # 創建image特性存儲Surface對象
self.rect = self.image.get_rect() # 通過image創建rect特性
screen = pygame.display.get_surface() # 獲取屏幕外觀
shrink = -config.getint('Screen', 'margin') # 獲取配置文件數值
self.area = screen.get_rect().inflate(shrink, shrink) # 獲取屏幕外觀填充后的區域(飛機的活動區域)
3、創建敵方飛機對象類
敵方飛機我們要考慮以下內容,包括:
加載后的初始位置;
每次移出屏幕下方后重置的位置;
每一幀刷新后位置(受速度影響);
每一幀刷新時,判斷敵方飛機是否從完全移出屏幕下邊緣。
示例代碼:
class Enemy(GameSprite): # 定義敵方飛機對象類
def __init__(self, speed): # 定義構造方法(需要添加速度參數)
GameSprite.__init__(self, config.get('Image', 'enemy')) # 重載超類構造方法(參數中傳入圖片)
self.speed = speed # 為敵方飛機設置速度特性
self.reset() # 重置敵方飛機位置
def reset(self): # 定義重置位置的方法
x = randrange(self.area.left, self.area.right) # 從活動范圍中獲取x軸的隨機位置
self.rect.midbottom = x, 0 # 設置游戲對象底部中心位置
def update(self): # 定義刷新位置的方法
self.rect.top += self.speed # 設置每幀向下移動的距離
self.landed = self.rect.top >= self.area.bottom # 獲取敵機是否已從屏幕下方完全移出
4、創建己方飛機對象類
己方飛機我們要考慮以下內容,包括:
垂直方向的初始位置;
水平方向可移動范圍;
每一幀刷新后的位置(受鼠標指針位置和屏幕可活動區域影響);
觸碰到敵方飛機的處理。
示例代碼:
class Plane(GameSprite): # 定義己方飛機對象類
def __init__(self): # 定義構造方法
GameSprite.__init__(self, config.get('Image', 'plane')) # 重載超類構造方法(參數中傳入圖片)
self.rect.bottom = self.area.bottom # 設置游戲對象垂直方向底部初始位置在屏幕底部
self.pad_top = config.getint('Plane_padding', 'top') # 獲取配置文件中游戲對象頂部填充數值
self.pad_side = config.getint('Plane_padding', 'side') # 獲取配置文件中游戲對象兩側填充數值
def update(self): # 定義刷新位置的方法
self.rect.centerx = pygame.mouse.get_pos()[0] # 設置游戲對象水平中心位置為鼠標指針的x軸位置
self.rect = self.rect.clamp(self.area) # 設置游戲對象水平方向可活動區域為屏幕外觀填充后的區域
def touches(self, other): # 設置觸碰到其它游戲對象的方法
bounds = self.rect.inflate(-self.pad_side, -self.pad_top) # 獲取游戲對象填充后的邊界范圍(頂部與兩側)
bounds.bottom = self.rect.bottom # 設置邊界范圍的底部為游戲對象的底部
return bounds.colliderect(other.rect) # 返回游戲對象邊界是否觸碰到其它游戲對象
在完成以上內容之后,我們就可以著手主程序模塊的編寫了。
在編寫之前,我們先預先了解一下整個程序的結構。
我們已經完成了整個程序左側的部分,在下一篇教程中,我們一起完成右側的部分。
在這里,我們先對右側部分內容做一些整體上的理解,這樣在編寫代碼的時候才能有一個清晰的邏輯。
1、State類。
在游戲中有兩個狀態,我們來看一下狀態的類型和產生,分別是:
暫停狀態:進入游戲、進入關卡以及游戲結束時。
運行狀態:游戲進行時。
2、Level類。
這個類是運行狀態,主要是對關卡的處理,包括控制游戲的速度、創建游戲對象、判斷游戲結束或者進入下一關以及關卡屏幕的顯示方案等。
3、Paused類。
在游戲中會有多個暫停狀態,包括:
打開游戲時;
顯示信息時;
游戲過關時;
游戲結束時。
每一個暫停的狀態,都可以點擊繼續,都要顯示背景顏色、圖片以及文字。
所以,我們在Paused類中將多個暫停狀態共有的內容進行抽象處理。
4、Paused類的子類。
Paused類的子類包含以下幾個:
Infol類:游戲信息
StartUp類:打開游戲
LevelCleared類:游戲過關
GameOver類:游戲結束
這些子類只需要定義顯示的圖片以及文字內容,或者其它獨有的功能。
5、Game類。
進行游戲初始化以及定義游戲運行的方法。
綜上所述,在游戲主程序模塊中,代碼的結構如下所示。
示例代碼:(planegame.py)
import pygame, sys
from pygame.locals import *
import objects # 導入游戲對象模塊
import configparser
file = 'config.ini'
config = configparser.ConfigParser()
config.read(file, encoding='UTF-8')
class State:
"""泛型游戲狀態類,可以處理事件和屏幕顯示。"""
def handle(self, event):
"""處理退出事件。"""
pass
def paused_display(self, screen):
"""暫停時顯示。"""
pass
def display(self, screen):
"""關卡中顯示。"""
pass
class Level(State):
"""游戲等級,用于計算共有多少敵機落下,移動游戲對象以及其他與游戲相關的邏輯任務。"""
def __init__(self, number=1):
"""初始化關卡的等級和游戲對象。"""
pass
def update(self, game):
"""關卡運行,并進行游戲結束或通過關卡的處理。"""
pass
def display(self, screen):
"""關卡運行時的屏幕顯示。"""
pass
class Paused(State):
"""暫停游戲的狀態,按任意鍵或點擊鼠標退出暫停狀態。"""
def handle(self, event):
"""處理按任意鍵繼續游戲。"""
pass
def update(self, game):
"""按任意鍵時進入下一個游戲狀態。"""
pass
def paused_display(self, screen):
"""暫停時顯示。"""
pass
class Info(Paused):
"""游戲信息。"""
pass
class StartUp(Paused):
"""進入游戲。"""
pass
class LevelCleared(Paused):
"""游戲過關。"""
def __init__(self, number):
"""過關信息。"""
pass
def next_state(self):
"""創建下一關卡。"""
pass
class GameOver(Paused):
"""游戲結束。"""
pass
class Game:
"""負責主事件循環的游戲對象,完成在不同狀態間切換的任務。"""
def __init__(self):
"""初始化。"""
pass
def run(self):
"""運行游戲。"""
pass
if __name__ == '__main__':
game = Game()
game.run()
本節練習源代碼:【點此下載】
總結
以上是生活随笔為你收集整理的python游戏代码示例_练习项目20:使用python制作游戏(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 混合运算lcd显示_各界巨头寄予厚望 M
- 下一篇: websocket python爬虫_p