日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python游戏代码示例_练习项目20:使用python制作游戏(中)

發布時間:2024/9/15 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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制作游戏(中)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。