python+pygame 贪吃蛇小游戏

贪吃蛇(Snake)是一款经典的电子游戏,最早出现在 1976 年,由日本的一家公司开发。游戏的玩法很简单:玩家需要控制一条不断长大的蛇,在迷宫中寻找食物,并避免撞到墙壁或自己的身体。每吃到一个食物,蛇的长度就会增加一段,随着游戏的进行,蛇会变得越来越长,也越来越难控制。游戏的目标是获得最高分数,这需要玩家在游戏中找到尽可能多的食物,并尽可能地避免撞到墙壁或自己的身体。贪吃蛇游戏简单易玩,但却需要玩家具备一定的策略和技巧,因此深受玩家们的喜爱。

导入所需模块:首先,导入pygame模块,该模块用于创建游戏窗口、处理游戏事件和绘制游戏元素。

初始化游戏:创建游戏窗口、初始化游戏设置和创建蛇的初始位置和速度等。

处理游戏事件:监听键盘事件,根据按键改变蛇的移动方向。

更新蛇的位置:根据蛇的当前移动方向,更新蛇的位置。

处理碰撞检测:检测蛇是否与食物发生碰撞,如果碰撞,则增加蛇的长度并生成新的食物。

绘制游戏元素:在游戏窗口中绘制蛇和食物。

更新游戏显示:更新游戏窗口的显示。

控制游戏循环:使用一个主循环来控制游戏的进行,直到游戏结束。

处理游戏结束:当蛇撞到边界或自身时,游戏结束,显示游戏结束信息。

退出游戏:在游戏结束后,退出游戏并释放资源。

代码如下:

import random
import sys

import pygame


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 PlayerSprite(BaseSprite):
    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_up = pygame.image.load("image/up.png")
            self.image_right = pygame.image.load("image/right.png")
            self.image_down = pygame.image.load("image/down.png")


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

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

        pygame.time.set_timer(7727, 200)

    def eat(self):
        self.last = PlayerSprite("image/body.png", self.last.rect.center)
        self.last.add(self.player_group)
        self.score += 1
        self.player_group.update()
        AudioManage.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":
            return
        if self.move_dir == "up" and dir == "down" or self.move_dir == "down" and dir == "up":
            return
        self.move_dir = dir
        for i in range(len(self.player_group) - 1, 0, -1):
            self.player_group.sprites()[i].rect.center = self.player_group.sprites()[i - 1].rect.center
        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
        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
        if self.head.rect.centerx < 20 or self.head.rect.centerx > 580 or self.head.rect.centery < 20 or self.head.rect.centery > 580:
            self.die()

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

    def check_collide(self):
        group = pygame.sprite.Group()
        for index in range(1, len(self.player_group.sprites())-1):
            if self.player_group.sprites()[index].rect.center == self.player_group.sprites()[0].rect.center:
                self.die()


    def die(self):
        self.player_group.empty()
        self.gm.food_manage.food_group.empty()
        self.gm.ui_manage.state = "end"
        pygame.time.set_timer(7727, 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 FoodSprite(BaseSprite):
    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 generate(self):
        image = "image/food.png" if random.random() > 0.5 else "image/food2.png"
        center = (random.randrange(25, 575, 25), random.randrange(25, 575, 25))
        FoodSprite(image, center).add(self.food_group)

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


class UIManage:
    def __init__(self, gm):
        self.gm = gm
        self.state = "ready"

        self.ready_group = pygame.sprite.Group()
        self.begin_btn = UISprite("image/2.jpg", (300, 300))
        self.begin_btn.add(self.ready_group)

        self.font = pygame.font.Font("font/simkai.ttf", 25)
        self.score_surface = self.font.render(f"score {self.gm.player_manage.score}", True, "red")

        self.end_group = pygame.sprite.Group()
        self.replay_btn = UISprite("image/3.jpg", (300, 300))
        self.replay_btn.add(self.end_group)

    def update(self):
        if self.state == "ready":

            self.ready_group.draw(self.gm.screen)
            if Util.click_check(self.begin_btn):
                self.state = "gaming"
                self.gm.player_manage.born()
                AudioManage.play_sound("sound/click.mp3")
                self.gm.food_manage.generate()
        elif self.state == "gaming":
            self.gm.screen.blit(self.score_surface, (500, 20))
            self.score_surface = self.font.render(f"score {self.gm.player_manage.score}", True, "red")
        elif self.state == "end":
            self.end_group.draw(self.gm.screen)
            if Util.click_check(self.replay_btn):
                AudioManage.play_sound("sound/click.mp3")
                self.state = "gaming"
                self.gm.player_manage.born()
                self.gm.food_manage.generate()


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 GameManage:
    def __init__(self, name):
        pygame.init()
        # 初始化游戏状态
        self.screen = pygame.display.set_mode((600, 600))
        pygame.display.set_caption(name)

        # 定义一个时钟控制帧率
        self.clock = pygame.time.Clock()

        self.player_manage = PlayerManage(self)

        self.ui_manage = UIManage(self)

        self.food_manage = FoodManage(self)

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

            if event.type == 7727:
                self.player_manage.move(self.player_manage.move_dir)
                self.player_manage.check_collide()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    self.player_manage.move("up")
                elif event.key == pygame.K_LEFT:
                    self.player_manage.move("left")
                elif event.key == pygame.K_DOWN:
                    self.player_manage.move("down")
                elif event.key == pygame.K_RIGHT:
                    self.player_manage.move("right")
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    self.ui_manage.state = "end"
                    self.player_manage.die()
                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()
            self.food_manage.update()
            if self.ui_manage.state == "gaming":
                self.player_manage.update()

            pygame.display.flip()


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值