自己動(dòng)手用Python實(shí)現(xiàn)一個(gè)保衛(wèi)果實(shí)小游戲【完整版】
Pygame介紹
pygame 是一個(gè)用 Python 語言寫的跨平臺(tái)的視頻游戲開發(fā)庫。它基于 SDL (Simple DirectMedia Layer) 庫,可以讓開發(fā)者輕松地創(chuàng)建游戲和多媒體應(yīng)用程序。下面是關(guān)于 pygame 的一些基本介紹:
功能特點(diǎn):
- 聲音和音樂處理
- 圖形和動(dòng)畫
- 鍵盤、鼠標(biāo)和操縱桿輸入
- 碰撞檢測(cè)
- 字體和文本渲染
- 更多...
跨平臺(tái)性:pygame 支持多種操作系統(tǒng),包括 Windows、Linux 和 macOS。
易用性:與許多其他的游戲開發(fā)庫相比,pygame 更為簡(jiǎn)單易學(xué),特別適合初學(xué)者或者那些希望快速原型設(shè)計(jì)的開發(fā)者。
社區(qū)與資源:pygame 有一個(gè)活躍的社區(qū),提供了大量的教程、例子和工具。這對(duì)新手來說是非常有價(jià)值的資源。
安裝:你可以使用 pip 來安裝 pygame:
pip install pygame
第一個(gè)Pygame小程序
一個(gè)簡(jiǎn)單的例子:
import pygame
pygame.init()
# 設(shè)置窗口大小
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("我的第一個(gè) pygame 程序")
running = True
clock = pygame.time.Clock()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((255, 255, 255)) # 使用白色填充屏幕
pygame.display.flip()
clock.tick(60) # 控制幀率為60幀/秒
pygame.quit()
這只是一個(gè)簡(jiǎn)單的 pygame 概述,要充分利用其功能,還需要深入學(xué)習(xí)。如果你有興趣開發(fā)游戲或多媒體應(yīng)用,pygame 是一個(gè)很好的起點(diǎn)。
保衛(wèi)果實(shí)小游戲
最終我們給大家的是一個(gè)完整的系統(tǒng)文件,如下圖所示。
- modules文件夾:相關(guān)動(dòng)作的實(shí)現(xiàn)代碼
- resources文件夾:系統(tǒng)相關(guān)音樂、圖片資源文件
- cfg.py:配置文件(指定了圖片、聲音文件等路徑)
- Game1.py:?jiǎn)?dòng)文件
運(yùn)行命令:
python Game1.py
即可看到界面效果。
核心代碼
import math
import pygame
'''定義兔子類'''
class BunnySprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.speed = 5
self.rotated_position = position
'''移動(dòng)兔子'''
def move(self, screensize, direction):
if direction == 'left':
self.rect.left = max(self.rect.left-self.speed, 0)
elif direction == 'right':
self.rect.left = min(self.rect.left+self.speed, screensize[0])
elif direction == 'up':
self.rect.top = max(self.rect.top-self.speed, 0)
elif direction == 'down':
self.rect.top = min(self.rect.top+self.speed, screensize[1])
'''畫到屏幕上'''
def draw(self, screen, mouse_pos):
angle = math.atan2(mouse_pos[1]-(self.rect.top+32), mouse_pos[0]-(self.rect.left+26))
image_rotate = pygame.transform.rotate(self.image, 360-angle*57.29)
bunny_pos = (self.rect.left-image_rotate.get_rect().width/2, self.rect.top-image_rotate.get_rect().height/2)
self.rotated_position = bunny_pos
screen.blit(image_rotate, bunny_pos)
'''定義弓箭類'''
class ArrowSprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.angle = position[0]
self.image = pygame.transform.rotate(image, 360-position[0]*57.29)
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
self.rect.left, self.rect.top = position[1:]
self.speed = 10
'''更新弓箭'''
def update(self, screensize):
velx = math.cos(self.angle) * self.speed
vely = math.sin(self.angle) * self.speed
self.rect.left += velx
self.rect.top += vely
if self.rect.right < 0 or self.rect.left > screensize[0] or self.rect.top > screensize[1] or self.rect.bottom < 0:
return True
return False
'''定義獾類'''
class BadguySprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
self.rect.left, self.rect.top = position
self.speed = 7
'''更新獾'''
def update(self):
self.rect.left -= self.speed
if self.rect.left < 64:
return True
return False
這段代碼主要是利用 pygame 庫定義了三個(gè)類,分別表示一個(gè)游戲中的兔子、箭和獾。
這段代碼主要是利用 pygame 庫定義了三個(gè)類,分別表示一個(gè)游戲中的兔子、箭和獾。下面我會(huì)逐個(gè)解釋這些代碼的含義:
(1) BunnySprite類 (兔子類):
- 初始化:創(chuàng)建一個(gè)兔子精靈,設(shè)置其圖像、位置以及速度。
- move方法:基于給定的方向(上、下、左、右),移動(dòng)兔子一個(gè)固定的速度。
- draw方法:在屏幕上繪制兔子,并使其面朝鼠標(biāo)的位置旋轉(zhuǎn)。
(2) ArrowSprite類 (弓箭類):
- 初始化:創(chuàng)建一個(gè)箭的精靈,根據(jù)一個(gè)給定的角度來旋轉(zhuǎn)它,并設(shè)置它的位置和速度。
- update方法:更新箭的位置。箭會(huì)根據(jù)它的旋轉(zhuǎn)角度飛行。如果箭飛出屏幕,該方法會(huì)返回True,否則返回False。
(3) BadguySprite類 (獾類):
- 初始化:創(chuàng)建一個(gè)獾的精靈,設(shè)置其圖像和位置。
- update方法:更新獾的位置,使其向左移動(dòng)。如果獾到達(dá)了屏幕的最左邊,該方法會(huì)返回True,否則返回False。