pygame模块实现乌龟吃鱼游戏案例

本文介绍了Pygame模块,它是跨平台Python模块,专为电子游戏设计。接着阐述了乌龟吃鱼游戏规则,包括场景范围、角色移动能力、体力设定等。然后说明了游戏的分块编写过程,如图片尺寸处理、窗口初始化等。最后展示了游戏最终效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 处理事件
  2. 更新游戏状态
  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.游戏最终效果

在这里只能放一张游戏的截图了,如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值