1.pygame简介
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。允许实时电子游戏研发 而无需被低级语言(如机器语言和汇编语言)束缚。
在linux系统下,只要在命令行中pip install即可安装,如下:
[kiosk@foundation80 ~]$ pip install pygame
Collecting pygame
Downloading https://files.pythonhosted.org/packages/18/b3/0bf5afdcf6ef95d2a343cd7865585a6efe5e3e727c1a4f3385c9935248cf/pygame-1.9.6-cp37-cp37m-manylinux1_x86_64.whl (11.4MB)
100% |████████████████████████████████| 11.4MB 32kB/s
Installing collected packages: pygame
Successfully installed pygame-1.9.6
pygame有很多模块,下面是一个总结:
模块名 | 功能 |
---|---|
pygame.cdrom | 访问光驱 |
pygame.cursors | 加载光标 |
pygame.display | 访问显示设备 |
pygame.draw | 绘制形状、线和点 |
pygame.event | 管理事件 |
pygame.font | 使用字体 |
pygame.image | 加载和存储图片 |
pygame.joystick | 使用游戏手柄或者 类似的东西 |
pygame.key | 读取键盘按键 |
pygame.mixer | 声音 |
pygame.mouse | 鼠标 |
pygame.movie | 播放视频 |
pygame.music | 播放音频 |
pygame.overlay | 访问高级视频叠加 |
pygame.rect | 管理矩形区域 |
pygame.sndarray | 操作声音数据 |
pygame.sprite | 操作移动图像 |
pygame.surface | 管理图像和屏幕 |
pygame.surfarray | 管理点阵图像数据 |
pygame.time | 管理时间和帧信息 |
pygame.transform | 缩放和移动图像 |
2. 乌龟吃鱼游戏规则
1). 假设游戏场景为范围(x,y)为0<=x<=10,0<=y<=10;
2). 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机;
3). 乌龟的最大移动能力为2(它可以随机选择1还是2移动),鱼儿的最大移动能力是1当移动到场景边缘,自动向反方向移动;
4). 乌龟初始化体力为100(上限), 乌龟每移动一次,体力消耗1当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20, 鱼暂不计算体力 ;
5). 当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束。
3.游戏的分块编写
一个游戏循环(也可以称为主循环)就做下面这三件事:
- 处理事件
- 更新游戏状态
- 绘制游戏状态到屏幕上
1)图片尺寸处理
编写游戏之前一定先要找好图片素材,为了让你的游戏效果更佳,图片素材尺寸大小必须得设置的合理才行,所以有必要先处理一下图片的大小,代码如下:
# 用来处理图片的模块
from PIL import Image
# 1). 打开要处理的图片文件;
filename = 'turtle.png'
img = Image.open(filename)
# 2). 图片尺寸的缩放,
out = img.resize((50, 50) , Image.ANTIALIAS) # ANTIALIAS效果是带滤镜缩放的处理, 防止图片失真
# 3). 保存处理好的图片对象
out.save('turtle_resize.png')
2)pygame初始化窗口
代码如下:
import random
import time
import pygame
import sys
from pygame.locals import * # 导入一些常用的函数
width = 640
height = 480
pygame.init()
screen = pygame.display.set_mode([width, height])
pygame.display.set_caption('乌龟吃鱼') # 定义窗口的标题为'乌龟吃鱼'
background = pygame.image.load("./img/bg.jpg").convert()
fishImg = pygame.image.load("./img/fish.png").convert_alpha()
wuguiImg = pygame.image.load("./img/turtle.png").convert_alpha()
# 乌龟吃掉小鱼的音乐 mp3格式的不行,wav格式的
# eatsound = pygame.mixer.Sound("achievement.wav")
# 背景音乐
pygame.mixer.music.load("./img/game_music.mp3")
pygame.mixer.music.play(loops=0, start=0.0)
# 成绩文字显示
count = 0
font = pygame.font.SysFont("arial", 40)
score = font.render("score %d" % count, True, (255, 255, 255))
# 显示游戏状态
status = font.render("Gaming" , True, (255, 255, 255))
w_width = wuguiImg.get_width() - 5 # 得到乌龟图片的宽度,后面留着吃鱼的时候用
w_height = wuguiImg.get_height() - 5 # 得到乌龟图片的高度
y_width = fishImg.get_width() - 5 # 得到鱼图片的宽度
y_height = fishImg.get_height() - 5 # 得到鱼图片的高度
fpsClock = pygame.time.Clock() # 创建一个新的Clock对象,可以用来跟踪总共的时间
3)乌龟类
乌龟吃鱼一共有两个对象,分别是乌龟和鱼,我们分别对他们创建类,乌龟类的代码如下:
# 乌龟类
class Turtle:
def __init__(self):
self.power = 100 # 体力
# 乌龟坐标
self.x = random.randint(0, width - w_width)
self.y = random.randint(0, height - w_height)
# 乌龟移动的方法:移动方向均随机 第四条
def move(self, new_x, new_y):
# 判断移动后是否超出边界
if new_x < 0:
self.x = 0 - new_x
elif new_x > width:
# self.x=width-(new_x-width)
self.x = 0
else:
# 不越界则移动乌龟的位置
self.x = new_x
if new_y < 0:
self.y = 0 - new_y
elif new_y > height:
# self.y=height-(new_y-height)
self.y = 0
else:
# 不越界则移动乌龟的位置
self.y = new_y
self.power -= 1 # 乌龟每移动一次,体力消耗1
def eat(self):
self.power += 20 # 乌龟吃掉鱼,乌龟体力增加20
if self.power > 100:
self.power = 100 # 乌龟体力100(上限)
4)鱼类
# 鱼类
class Fish:
def __init__(self):
# 鱼坐标
self.x = random.randint(0, width - y_width)
self.y = random.randint(0, height - y_height)
def move(self):
new_x = self.x + random.choice([-10])
if new_x < 0:
self.x = width
else:
self.x = new_x
5)对游戏对象进行实例化
tur = Turtle() # 生成1只乌龟
fish = [] # 生成10条鱼
for item in range(10):
newfish = Fish()
fish.append(newfish) # 把生成的鱼放到鱼缸里
6)键盘控制
# pygame有一个事件循环,不断检查用户在做什么。事件循环中,如何让循环中断下来(pygame形成的窗口中右边的插号在未定义前是不起作用的)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == KEYDOWN:
# 通过上下左右方向键控制乌龟的动向
if event.key == pygame.K_LEFT:
tur.move(tur.x - 10, tur.y)
if event.key == pygame.K_RIGHT:
tur.move(tur.x + 10, tur.y)
if event.key == pygame.K_UP:
tur.move(tur.x, tur.y - 10)
if event.key == pygame.K_DOWN:
tur.move(tur.x, tur.y + 10)
7)游戏逻辑实现
reen.blit(background, (0, 0)) # 绘制背景图片
screen.blit(score, (500, 20)) # 绘制分数
screen.blit(status, (0, 20)) # 绘制分数
# 绘制鱼
for item in fish:
screen.blit(fishImg, (item.x, item.y))
# pygame.time.delay(100)
item.move() # 鱼移动
screen.blit(wuguiImg, (tur.x, tur.y)) # 绘制乌龟
# 判断游戏是否结束:当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
if tur.power < 0:
print("Game Over: Turtle power is 0")
# 显示游戏状态
status = font.render("Game Over: Turtle power is 0", True, (255, 255, 255))
pygame.display.update() # 更新到游戏窗口
time.sleep(1)
sys.exit(0)
elif len(fish) == 0:
status = font.render("Game Over: Fish is empty", True, (255, 255, 255))
pygame.display.update() # 更新到游戏窗口
sys.exit(0)
for item in fish:
# print("鱼", item.x, item.y, y_width, y_height)
# print("乌龟", tur.x, tur.y, w_width, w_height)
# 判断鱼和乌龟是否碰撞?
if ((tur.x < item.x + y_width) and (tur.x + w_width > item.x)
and (tur.y < item.y + y_height) and (w_height + tur.y > item.y)) :
fish.remove(item) # 鱼死掉
# 吃鱼音乐
# eatsound.play()
count = count + 1 # 累加
score = font.render("score %d" % count, True, (255, 255, 255))
# print("死了一只鱼")
# print("乌龟最新体力值为 %d" % tur.power)
pygame.display.update() # 更新到游戏窗口
fpsClock.tick(10) # 通过每帧调用一次fpsClock.tick(10),这个程序就永远不会以超过每秒10帧的速度运行
4.游戏最终效果
在这里只能放一张游戏的截图了,如下: