Python面向对象版本贪吃蛇实现

这篇具有很好参考价值的文章主要介绍了Python面向对象版本贪吃蛇实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先来一波效果图吧

Python面向对象版本贪吃蛇实现,python,python,pygame,开发语言,贪吃蛇,面向对象,游戏

Python面向对象版本贪吃蛇实现,python,python,pygame,开发语言,贪吃蛇,面向对象,游戏

Python面向对象版本贪吃蛇实现,python,python,pygame,开发语言,贪吃蛇,面向对象,游戏文章来源地址https://www.toymoban.com/news/detail-655405.html

看看如何设计代码实现

import random
import sys

import pygame


# 游戏状态 ready 未开始  gameing  游戏中 end 游戏结束


class Util:
    """
    工具类: 提供静态方法
    """

    @staticmethod
    def click_check(sprite):
        """
        精灵的点击检测
        """
        if pygame.mouse.get_pressed()[0]:
            if sprite.rect.collidepoint(pygame.mouse.get_pos()):
                return True
        return False


class BaseSprite(pygame.sprite.Sprite):
    """
    精灵父类
    """

    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()


class FoodSprite(BaseSprite):
    """
    食物类
    """

    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center


class AudioManage:
    @staticmethod
    def play_bg_music():
        """
        背景音乐
        """
        pygame.mixer.music.load("sound/bgm.wav")
        pygame.mixer.music.play(True)

    @staticmethod
    def play_sound(name):
        """
        音效
        """
        sound = pygame.mixer.Sound(name)
        sound.play()


class FoodManage:
    def __init__(self, gm):
        self.gm = gm
        self.food_group = pygame.sprite.Group()

    def generate(self):
        """
        生成食物
        """
        name = "img/food.png" if random.random() > 0.5 else "img/food2.png"
        center = (random.randrange(25, 575, 25), random.randrange(25, 575, 25))
        FoodSprite(name, center).add(self.food_group)

    def clear(self):
        # 玩家死亡清除食物
        self.food_group.empty()

    def update(self):
        self.food_group.update()
        self.food_group.draw(self.gm.screen)


class PlayerSprite(BaseSprite):
    """
    玩家精灵
    """

    def __init__(self, name, center, is_head=False):
        super().__init__(name)
        self.rect.center = center
        if is_head:
            # 如果是舌头 则 加载四张对应的surface
            self.image_left = self.image
            self.image_up = pygame.image.load("img/up.png")
            self.image_right = pygame.image.load("img/right.png")
            self.image_down = pygame.image.load("img/down.png")


class PlayerManage:
    def __init__(self, gm):
        self.gm = gm
        self.player_group = pygame.sprite.Group()
        self.score = 0
        AudioManage.play_bg_music()

    def eat(self):
        # 在末尾右侧追加一个
        self.last = PlayerSprite("img/body.png", self.last.rect.center)
        self.last.add(self.player_group)
        self.score += 1
        AudioManage.play_sound("sound/eat.mp3")

    def move(self, dir):
        if self.move_dir == "left" and dir == "right" or self.move_dir == "up" and dir == "down" or self.move_dir == "right" and dir == "left" or self.move_dir == "down" and dir == "up":
            return

        self.move_dir = dir
        # 更新每一个部件的位置  倒着更新
        for index in range(len(self.player_group) - 1, 0, -1):
            self.player_group.sprites()[index].rect.center = self.player_group.sprites()[index - 1].rect.center
        if self.move_dir == "left":
            self.head.rect.centerx -= 25
            self.head.image = self.head.image_left
        elif self.move_dir == "up":
            self.head.rect.centery -= 25
            self.head.image = self.head.image_up
        elif self.move_dir == "down":
            self.head.rect.centery += 25
            self.head.image = self.head.image_down
        elif self.move_dir == "right":
            self.head.rect.centerx += 25
            self.head.image = self.head.image_right

        if pygame.sprite.spritecollide(self.head, self.gm.food_manage.food_group, True):
            self.eat()
            self.gm.food_manage.generate()

        if self.head.rect.centerx <= 0 or self.head.rect.centerx >= 600 or self.head.rect.centery <= 0 or self.head.rect.centery >= 600:
            self.die()
            self.gm.food_manage.clear()

    def born(self):
        self.move_dir = "left"
        self.score = 0
        # 蛇头
        self.head = PlayerSprite("img/left.png", (300, 300), True)
        self.head.add(self.player_group)

        for i in range(1, 4):
            self.last = PlayerSprite("img/body.png", (300 + 25 * i, 300))
            self.last.add(self.player_group)

        pygame.time.set_timer(6888, 500)

    def die(self):
        """
        玩家死亡  清空 停止计时 停止自动移动
        """
        self.player_group.empty()
        self.gm.state = "end"
        pygame.time.set_timer(6888, 0)
        AudioManage.play_sound("sound/die.wav")

    def update(self):
        self.player_group.update()
        self.player_group.draw(self.gm.screen)


class UISprite(BaseSprite):
    """
    UI精灵类
    """

    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center


class UIManage:
    def __init__(self, gm):
        self.gm = gm
        # UI字体
        self.font = pygame.font.Font("font/font.ttf", 32)

        # 开始前UI元素
        self.ready_group = pygame.sprite.Group()
        self.begin_btn = UISprite("img/begin_btn.png", (300, 300))
        self.begin_btn.add(self.ready_group)

        # 游戏中UI元素
        self.score_surface = self.font.render(f"Score:{self.gm.player_manage.score}", True, "#FF4500")

        # 游戏结束UI元素
        self.end_group = pygame.sprite.Group()
        self.replay_btn = UISprite("img/replay_btn.png", (300, 300))
        self.replay_btn.add(self.end_group)

    def update(self):
        if self.gm.state == "ready":
            # print("更新未开始游戏UI")
            self.ready_group.draw(self.gm.screen)
            if Util.click_check(self.begin_btn):
                AudioManage.play_sound("sound/click.mp3")
                self.gm.state = "gaming"
                self.gm.player_manage.born()
                self.gm.food_manage.generate()
        elif self.gm.state == "gaming":
            # print("更新游戏中UI")
            self.score_surface = self.font.render(f"Score:{self.gm.player_manage.score}", True, "#FF4500")
            self.gm.screen.blit(self.score_surface, (400, 20))
        elif self.gm.state == "end":
            # print("更新游戏结束UI")
            self.end_group.draw(self.gm.screen)
            if Util.click_check(self.replay_btn):
                AudioManage.play_sound("sound/click.mp3")
                self.gm.state = "gaming"
                self.gm.player_manage.born()
                self.gm.food_manage.generate()


class GameManage:
    def __init__(self, name):
        pygame.init()
        # 初始化游戏状态
        self.state = "ready"

        self.clock = pygame.time.Clock()

        self.screen = pygame.display.set_mode((600, 600))
        pygame.display.set_caption(name)

        # 游戏中的玩家
        self.player_manage = PlayerManage(self)

        # 食物管理类
        self.food_manage = FoodManage(self)

        # 构建了一个 UI管理类的实例
        self.ui_manage = UIManage(self)

    def check_event(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            # 自动移动
            if event.type == 6888:
                self.player_manage.move(self.player_manage.move_dir)

            # 手动换方向
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    self.player_manage.move("left")
                elif event.key == pygame.K_UP:
                    self.player_manage.move("up")
                elif event.key == pygame.K_RIGHT:
                    self.player_manage.move("right")
                elif event.key == pygame.K_DOWN:
                    self.player_manage.move("down")

            # 测试功能 一键杀死  一键吃
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    self.state = "end"
                    self.player_manage.die()
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_ESCAPE:
                    self.player_manage.eat()

    def run(self):
        while True:
            self.clock.tick(24)
            self.check_event()
            self.screen.fill("#FFFACD")
            self.ui_manage.update()

            if self.state == "gaming":
                self.player_manage.update()
                self.food_manage.update()

            pygame.display.flip()


gm = GameManage("贪吃蛇大作战")
gm.run()

到了这里,关于Python面向对象版本贪吃蛇实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 🔥🔥Java开发者的Python快速进修指南:面向对象进阶

    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可

    2024年02月05日
    浏览(61)
  • 🔥🔥Java开发者的Python快速进修指南:面向对象基础

    当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确

    2024年02月05日
    浏览(68)
  • 手把手教你使用Python写贪吃蛇游戏(pygame,附源码)

    贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战。这是每个新手程序员都应该接受的最好的初学者友好项目之一。学习构建视频游戏

    2024年02月16日
    浏览(48)
  • 强化学习Agent系列(一)——PyGame游戏编程,Python 贪吃蛇制作实战教学

    大家好,未来的开发者们请上座 随着人工智能的发展,强化学习基本会再次来到人们眼前,遂想制作一下相关的教程。强化学习第一步基本离不开虚拟环境的搭建,下面用大家耳熟能详的贪吃蛇游戏为基础,制作一个Agent,完成对这个游戏的绝杀。 万里长城第一步:用pytho

    2024年01月21日
    浏览(65)
  • 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是

    2024年02月05日
    浏览(66)
  • Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是

    2024年02月05日
    浏览(68)
  • 【 Python 全栈开发 ⑰ 】面向对象、继承、多态、类方法与类属性

    Python 面向对象编程 是一种编程范式,它将数据和操作数据的方法组合在一起,形成一个“对象”,并且该对象可以被复用。在 Python 中,每一个对象都拥有一些属性和方法,它们是该对象的特征和行为。 面向对象编程可以帮助我们更好地组织和管理代码,使得代码更加模块

    2024年02月08日
    浏览(45)
  • 面向专业开发者的Python IDE——PyCharm,各个版本如何抉择?

    PyCharm是一个专业的Python集成开发环境(IDE),为Python开发人员提供了广泛的基本工具,紧密集成为高效的Python、Web和数据科学开发创建了一个方便的环境。 PyCharm v2022.2正式版下载 (技术交流Q:786598704) 选择最适合自己的PyCharm版本 PyCharm有三个版本: 社区版 (免费且开源):用

    2024年02月08日
    浏览(57)
  • python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

    参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示: ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/input 其中 风景视频素材分享.flv 为

    2024年02月20日
    浏览(32)
  • Python实现交互窗口功能(Tkinter;面向对象的图形化用户界面(GUI)模块)(一)

    本文主要介绍Python中实现GUI的Tkinter模块以及模块中的控件及其使用 Python自带了tkinter 模块,面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。 其图像化编程的基本步骤通常包括: 导入 tkinter 模块 创建 GUI 根窗体 添加人机交互控件并编写相

    2024年02月08日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包