**简简单单写个贪吃蛇**

          图片,音效以及字体可以自行去网上下载,也可私信我

import pygame
import sys
import random


# 创建一个工具检测鼠标是否点击了精灵的矩形区域
class Util:
    @staticmethod
    def check(sprit):
        if pygame.mouse.get_pressed()[0]:
            if sprit.rect.collidepoint(pygame.mouse.get_pos()):
                AudioSprit.play_sound("sound/click.mp3 ")
                return True
        return False


# 创建一个最基本的精灵类
class BaseSprit(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()


# 创建一个ui精灵类,继承最基本的精灵类
class UiSprit(BaseSprit):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center


# 创建一个ui精灵管理类,主要包含游戏开始前,游戏中,游戏结束后所展示的精灵
class UiManage:
    def __init__(self, gm):
        self.gm = gm

        self.begin_group = pygame.sprite.Group()
        self.begin_menu = UiSprit("img/begin_btn.png", (400, 300))
        self.begin_menu.add(self.begin_group)

        self.font = pygame.font.Font("font/font.ttf", 30)

        self.replay_begin_group = pygame.sprite.Group()
        self.replay_begin_menu = UiSprit("img/replay_btn.png", (400, 300))
        self.replay_begin_menu.add(self.replay_begin_group)

        self.font1 = pygame.font.Font("font/font.ttf", 60)

    def update(self):
        if self.gm.state == "ready":
            self.begin_group.draw(self.gm.screen)
            if Util.check(self.begin_menu):
                self.gm.state = "gaming"
                self.gm.player_manage.born()
                self.gm.food_manage.add_food()
        elif self.gm.state == "gaming":
            self.score_surface = self.font.render(f'score:{self.gm.player_manage.score}', True, "red")
            self.gm.screen.blit(self.score_surface, (680, 20))
        elif self.gm.state == "end":
            self.score_surface1 = self.font1.render(f'current score:{self.gm.player_manage.score}', True, "red")
            self.gm.screen.blit(self.score_surface1, (200, 100))
            self.replay_begin_group.draw(self.gm.screen)
            if Util.check(self.replay_begin_menu):
                self.gm.state = "gaming"
                self.gm.player_manage.born()
                self.gm.food_manage.add_food()


# 创建一个玩家精灵类,继承最基本的精灵类,包含玩家四个不同方向的头
class PlayerSprit(BaseSprit):
    def __init__(self, name, center, is_head=False):
        super().__init__(name)
        self.rect.center = center
        if is_head:
            self.image_left = self.image
            self.image_right = pygame.image.load("img/right.png")
            self.image_up = pygame.image.load("img/up.png")
            self.image_down = pygame.image.load("img/down.png")


# 创建一个玩家类,包含玩家出生,移动,吃食物,以及死亡后清空玩家组和食物组和更新玩家组
class PlayerManage:
    def __init__(self, gm):
        self.gm = gm
        self.score = 0
        self.player_group = pygame.sprite.Group()
        self.body_group = pygame.sprite.Group()
        AudioSprit.play_bg_music()

    def eat(self):
        self.last = PlayerSprit("img/body.png", self.last.rect.center, False)
        self.last.add(self.player_group)
        self.score += 1
        self.gm.food_manage.add_food()
        AudioSprit.play_sound("sound/eat.mp3")

    def move(self, dir):
        if self.move_dir == "left" and dir == "right" or self.move_dir == "right" and dir == "left" or self.move_dir == "up" and dir == "down" or self.move_dir == "down" and dir == "up":
            return
        for index in range(len(self.player_group.sprites()) - 1, 0, -1):
            self.player_group.sprites()[index].rect.center = self.player_group.sprites()[index - 1].rect.center
            self.player_group.sprites()[index].add(self.body_group)
        self.move_dir = dir
        if self.move_dir == "left":
            self.head.rect.centerx -= 25
            self.head.image = self.head.image_left
        elif self.move_dir == "right":
            self.head.rect.centerx += 25
            self.head.image = self.head.image_right
        if self.move_dir == "up":
            self.head.rect.centery -= 25
            self.head.image = self.head.image_up
        if self.move_dir == "down":
            self.head.rect.centery += 25
            self.head.image = self.head.image_down

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

        if self.head.rect.centerx <= 0 or self.head.rect.centerx >= 800 or self.head.rect.centery <= 0 or self.head.rect.centery >= 600 or pygame.sprite.spritecollide(
                self.head, self.body_group, True):
            self.die()

    def born(self):
        self.score = 0
        self.move_dir = "left"
        self.head = PlayerSprit("img/left.png", (400, 300), True)
        self.head.add(self.player_group)
        for i in range(1, 4):
            self.last = PlayerSprit("img/body.png", (400 + i * 25, 300), False)
            self.last.add(self.player_group)

        pygame.time.set_timer(5888, 500)

    def die(self):
        self.player_group.empty()
        self.gm.food_manage.clear()
        self.gm.state = "end"
        pygame.time.set_timer(5888, 0)
        AudioSprit.play_sound("sound/die.wav")


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


# 创建一个食物精灵类,继承最基本的精灵类
class FoodSprit(BaseSprit):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center


# 创建一个食物管理类,用来生成食物,以及死亡后清空食物组,更新食物组
class FoodManage:
    def __init__(self, gm):
        self.gm = gm
        self.food_group = pygame.sprite.Group()

    def add_food(self):
        name = "img/food.png" if random.random() > 0.5 else "img/food2.png"
        center = (random.randrange(25, 775), random.randrange(25, 575))
        FoodSprit(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 AudioSprit:
    @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 GameManage:
    def __init__(self, name):
        pygame.init()
        self.screen = pygame.display.set_mode((800, 600))
        pygame.display.set_caption(name)
        self.clock = pygame.time.Clock()
        self.state = "ready"
        self.ui_manage = UiManage(self)
        self.player_manage = PlayerManage(self)
        self.food_manage = FoodManage(self)

    def event_check(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == 5888:
                self.player_manage.move(self.player_manage.move_dir)

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    self.state = "end"
                    self.player_manage.die()
                if event.key == pygame.K_LEFT:
                    self.player_manage.move("left")
                if event.key == pygame.K_RIGHT:
                    self.player_manage.move("right")
                if event.key == pygame.K_UP:
                    self.player_manage.move("up")
                if event.key == pygame.K_DOWN:
                    self.player_manage.move("down")

    def run(self):
        while True:
            self.clock.tick(24)
            self.event_check()
            self.screen.fill("#7CFC00")
            self.ui_manage.update()
            self.player_manage.update()
            self.food_manage.update()
            pygame.display.flip()


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C&&Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值