import random
import sys
import pygame
class Util:
@staticmethod
def check_click(sprite):
if pygame.mouse.get_pressed()[0]:
if sprite.rect.collidepoint(pygame.mouse.get_pos()):
return True
return False
class Sprite(pygame.sprite.Sprite):
"""
父类精灵
"""
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
class UiSprite(Sprite):
"""
ui精灵
"""
def __init__(self, name, center):
super().__init__(name)
self.rect.center = center
class PlayerSprite(Sprite):
"""
玩家精灵
"""
def __init__(self, name, center, is_head=False):
super().__init__(name)
self.rect.center = center
if is_head:
self.head_left = pygame.image.load("image/left.png")
self.head_right = pygame.image.load("image/right.png")
self.head_up = pygame.image.load("image/up.png")
self.head_down = pygame.image.load("image/down.png")
class FoodSprite(Sprite):
def __init__(self, name, center):
super().__init__(name)
self.rect.center = center
class AudioSprite(Sprite):
@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 PlayerManage:
"""
玩家管理
"""
def __init__(self, gm):
self.gm = gm
self.player_group = pygame.sprite.Group()
self.score = 0
def eat(self):
self.body = PlayerSprite("image/body.png", self.body.rect.center)
self.score += 1
self.body.add(self.player_group)
AudioSprite.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.head_left
elif self.move_dir == "right":
self.head.rect.centerx += 25
self.head.image = self.head.head_right
elif self.move_dir == "up":
self.head.rect.centery -= 25
self.head.image = self.head.head_up
elif self.move_dir == "down":
self.head.rect.centery += 25
self.head.image = self.head.head_down
if pygame.sprite.spritecollide(self.head, self.gm.food_manage.food_group, True):
self.eat()
self.gm.food_manage.generate()
# p碰墙死亡
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()
pygame.time.set_timer(6888, 500)
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.body = PlayerSprite("image/body.png", (300 + 25 * i, 300), True)
self.body.add(self.player_group)
def die(self):
"""
死亡
:return:
"""
self.player_group.empty()
self.gm.state = "end"
pygame.time.set_timer(6888, 0)
AudioSprite.play_sound("sound/die.wav")
def update(self):
self.player_group.update()
self.player_group.draw(self.gm.screen)
class FoodManage:
def __init__(self, gm):
self.gm = gm
self.food_group = pygame.sprite.Group()
def generate(self):
name = "image/food2.png" if random.random() > 0.5 else "image/food.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 UiManage:
"""
界面管理
"""
def __init__(self, gm):
self.gm = gm
# 字体
self.font = pygame.font.Font("font/font.ttf", 24)
# 开始按钮
self.begin_group = pygame.sprite.Group()
self.bg_btn = UiSprite("image/begin_btn.png", (300, 300))
self.bg_btn.add(self.begin_group)
# 游戏分数
self.score_surface = self.font.render(f"score:{0}", True, (255, 0, 0))
# 重来按钮
self.replay_group = pygame.sprite.Group()
self.rg_btn = UiSprite("image/replay_btn.png", (300, 300))
self.rg_btn.add(self.replay_group)
AudioSprite.play_bg_music()
def update(self):
if self.gm.state == "ready":
# 游戏开始
self.begin_group.draw(self.gm.screen)
if Util.check_click(self.bg_btn):
self.gm.state = "gaming"
self.gm.player_manage.born()
self.gm.food_manage.generate()
AudioSprite.play_sound("sound/click.mp3")
elif self.gm.state == "gaming":
# 游戏中
self.score_surface = self.font.render(f"score:{self.gm.player_manage.score}", True, (255, 0, 0))
self.gm.screen.blit(self.score_surface, (450, 20))
elif self.gm.state == "end":
# 游戏结束
self.replay_group.draw(self.gm.screen)
if Util.check_click(self.rg_btn):
self.gm.state = "gaming"
self.gm.food_manage.clear()
self.gm.player_manage.born()
self.gm.food_manage.generate()
AudioSprite.play_sound("sound/click.mp3")
class GameManage:
"""
游戏管理
"""
def __init__(self):
pygame.init()
self.state = "ready"
self.screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("贪吃蛇大作战")
self.ui_manage = UiManage(self)
self.player_manage = PlayerManage(self)
self.food_manage = FoodManage(self)
self.clock = pygame.time.Clock()
def check_event(self):
"""
检测事件
:return:
"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 控制方向
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
self.player_manage.move("left")
elif event.key == pygame.K_RIGHT:
self.player_manage.move("right")
elif event.key == pygame.K_UP:
self.player_manage.move("up")
elif event.key == pygame.K_DOWN:
self.player_manage.move("down")
if event.type == 6888:
self.player_manage.move(self.player_manage.move_dir)
# 一键杀死
if event.type == pygame.KEYUP:
if event.key == pygame.K_q:
self.state = "end"
self.player_manage.die()
def run(self):
while True:
self.check_event()
self.screen.fill((250, 250, 250))
self.ui_manage.update()
# 判断是否重来
if self.state == "gaming":
self.player_manage.update()
self.food_manage.update()
pygame.display.flip()
gm = GameManage()
gm.run()
python用pygame模块写一个贪吃蛇
最新推荐文章于 2024-07-23 16:23:28 发布