python 小游戏 捕鱼达人

该代码段展示了如何在Python的Pygame库中创建一个用于游戏的小鱼类,包括其初始化、移动、重定位等方法,以及不同类型的鱼(如小金鱼、章鱼、魔鬼鱼、鲨鱼和BOSS鱼)的子类化。这些类定义了鱼的图片、生命值、得分和移动行为。

# 绘制所有小鱼
import os
import random
from setting import *

import pygame


# 所有鱼的父类
class Fish(pygame.sprite.Sprite):
    def __init__(self, init_dict: dict) -> None:
        super().__init__()
        # 小鱼每一帧的图片
        self.img_list = []
        for each in os.listdir(init_dict['img_path']):
            self.img_list.append(pygame.image.load(os.path.join(init_dict['img_path'], each)).convert_alpha())
            # 默认以第一帧作为初始状态
        self.image = self.img_list[0]
        self.rect = self.image.get_rect()
        # 生命数量
        self.max_life = self.life = init_dict['max_life']
        # 被击杀后的得分
        self.kill_score = init_dict['kill_score']
        # 是否存活
        self.active = False
        # 图片替换索引
        self.img_index = 0
        # 初次出现的方向
        self.appear_direction = 'left'
        # 移动速度
        self.speed = init_dict['speed']
        # 标志位,判断碰撞使用
        self.mask = pygame.mask.from_surface(self.image)

    def reset(self):
        """ 初次设定/重新设定初始值 """
        self.active = True
        self.appear_direction = random.choice(['left', 'right', 'top'])
        self.life = self.max_life
        self.img_index = 0
        self.head_locate()
        self.relocate()

    """ 以下move系列方法,代表鱼向不同的方向移动 """

    def move_down(self):
        self.rect.top += self.speed
        if self.rect.top > HEIGHT:
            self.active = False

    def move_left(self):
        self.rect.left -= self.speed
        if self.rect.right < 0:
            self.active = False

    def move_right(self):
        self.rect.left += self.speed
        if self.rect.left > WIDTH:
            self.active = False

    def head_locate(self):
        """ 对头部进行重定位,如右边出来的鱼,头往左边,同时初始化坐标 """
        if self.appear_direction == 'right':
            self.image = pygame.transform.rotate(self.img_list[self.img_index], 180)
        elif self.appear_direction == 'top':
            self.image = pygame.transform.rotate(self.img_list[self.img_index], -90)
        else:
            self.image = self.img_list[self.img_index]

    def relocate(self):
        """ 对于初始位置重新定位 """
        if self.appear_direction == 'right':
            self.rect.top = random.randint(0, HEIGHT)
            self.rect.left = random.randint(WIDTH + self.rect.width + 200, WIDTH + self.rect.width + 400)
        elif self.appear_direction == 'top':
            self.rect.top = random.randint(-self.rect.width - 400, -self.rect.width - 200)
            self.rect.left = random.randint(0, WIDTH)
        else:
            self.rect.left = random.randint(-self.rect.width - 400, -self.rect.width - 200)
            self.rect.top = random.randint(0, HEIGHT)

    def update(self, delay: int):
        if delay % 2 == 0:
            self.img_index = (self.img_index + 1) % len(self.img_list)
            self.head_locate()
        if self.appear_direction == 'left':
            self.move_right()
        elif self.appear_direction == 'right':
            self.move_left()
        elif self.appear_direction == 'top':
            self.move_down()


# 小金鱼
class GoldFish(Fish):
    def __init__(self) -> None:
        init_dict = {
            'img_path': r'img/gold_fish',
            'max_life': 50,
            'speed': 3,
            'kill_score': 1000
        }
        super().__init__(init_dict)


# 章鱼
class OctopusFish(Fish):
    def __init__(self):
        init_dict = {
            'img_path': 'img/octopus_fish',
            'max_life': 100,
            'speed': 2,
            'kill_score': 1500
        }
        super().__init__(init_dict)

    def relocate(self):
        """ 对于初始位置重新定位 """
        if self.appear_direction == 'right':
            self.rect.top = random.randint(0, HEIGHT)
            self.rect.left = random.randint(WIDTH + self.rect.width + 300, WIDTH + self.rect.width + 600)
        elif self.appear_direction == 'top':
            self.rect.top = random.randint(-self.rect.width - 600, -self.rect.width - 300)
            self.rect.left = random.randint(0, WIDTH)
        else:
            self.rect.left = random.randint(-self.rect.width - 600, -self.rect.width - 300)
            self.rect.top = random.randint(0, HEIGHT)


# 金色魔鬼鱼
class MantaFish(Fish):
    def __init__(self) -> None:
        init_dict = {
            'img_path': 'img/manta_ray',
            'max_life': 150,
            'speed': 2,
            'kill_score': 3000
        }
        super().__init__(init_dict)

    def relocate(self):
        if self.appear_direction == 'right':
            self.rect.top = random.randint(0, HEIGHT)
            self.rect.left = random.randint(WIDTH + self.rect.width + 600, WIDTH + self.rect.width + 900)
        elif self.appear_direction == 'top':
            self.rect.top = random.randint(-self.rect.width - 900, -self.rect.width - 600)
            self.rect.left = random.randint(0, WIDTH)
        else:
            self.rect.left = random.randint(-self.rect.width - 900, -self.rect.width - 600)
            self.rect.top = random.randint(0, HEIGHT)


# 蓝色鲨鱼
class SharkFish(Fish):
    def __init__(self) -> None:
        init_dict = {
            'img_path': 'img/shark',
            'max_life': 250,
            'speed': 3,
            'kill_score': 5000
        }
        super().__init__(init_dict)

    def relocate(self):
        if self.appear_direction == 'right':
            self.rect.top = random.randint(0, HEIGHT)
            self.rect.left = random.randint(WIDTH + self.rect.width + 800, WIDTH + self.rect.width + 1300)
        elif self.appear_direction == 'top':
            self.rect.top = random.randint(-self.rect.width - 1300, -self.rect.width - 800)
            self.rect.left = random.randint(0, WIDTH)
        else:
            self.rect.left = random.randint(-self.rect.width - 1300, -self.rect.width - 800)
            self.rect.top = random.randint(0, HEIGHT)


# boss鱼
class BossFish(Fish):
    def __init__(self) -> None:
        init_dict = {
            'img_path': 'img/boss',
            'max_life': 400,
            'speed': 3,
            'kill_score': 10000
        }
        super().__init__(init_dict)

    def relocate(self):
        if self.appear_direction == 'right':
            self.rect.top = random.randint(0, HEIGHT)
            self.rect.left = random.randint(WIDTH + self.rect.width + 1500, WIDTH + self.rect.width + 2000)
        elif self.appear_direction == 'top':
            self.rect.top = random.randint(-self.rect.width - 2000, -self.rect.width - 1500)
            self.rect.left = random.randint(0, WIDTH)
        else:
            self.rect.left = random.randint(-self.rect.width - 2000, -self.rect.width - 1500)
            self.rect.top = random.randint(0, HEIGHT)

 要全套代码关注加私信免费获取

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所见即所得11111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值