python贪吃蛇(可选择难度)

代码如下:

import pygame

import sys

import random

import datetime



# 初始化pygame

pygame.init()



# 游戏窗口大小

WIDTH, HEIGHT = 1000, 600

GRID_SIZE = 20

GRID_WIDTH = WIDTH // GRID_SIZE

GRID_HEIGHT = HEIGHT // GRID_SIZE



# 颜色定义

WHITE = (255, 255, 255)

GREEN = (0, 255, 0)

RED = (255, 0, 0)





# 获取当前日期和时间

def get_date_time():

    now = datetime.datetime.now()

    return now.strftime("%Y-%m-%d %H:%M:%S")





# 贪吃蛇类

class Snake:

    def __init__(self):

        self.body = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]

        self.direction = (0, 1)

        self.head_image = pygame.image.load("snake_head.png")

        self.head_image = pygame.transform.scale(self.head_image, (GRID_SIZE, GRID_SIZE))

        self.body_image = pygame.image.load("snake_body.png")

        self.body_image = pygame.transform.scale(self.body_image, (GRID_SIZE, GRID_SIZE))



    def move(self):

        head = self.body[0]

        x, y = head

        dx, dy = self.direction

        new_head = ((x + dx) % GRID_WIDTH, (y + dy) % GRID_HEIGHT)

        self.body.insert(0, new_head)

        self.body.pop()



    def grow(self):

        head = self.body[0]

        x, y = head

        dx, dy = self.direction

        new_head = ((x + dx) % GRID_WIDTH, (y + dy) % GRID_HEIGHT)

        self.body.insert(0, new_head)



    def change_direction(self, direction):

        self.direction = direction





# 食物类

class Food:

    def __init__(self):

        self.position = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))

        self.image = pygame.image.load("food.png")

        self.image = pygame.transform.scale(self.image, (GRID_SIZE, GRID_SIZE))



    def respawn(self):

        self.position = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))





# 游戏类

class Game:

    def __init__(self, speed):

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))

        self.clock = pygame.time.Clock()

        self.snake = Snake()

        self.food = Food()

        self.score = 0

        self.game_over = False

        self.font = pygame.font.Font("simhei.ttf", 25)

self.game_over_font = pygame.font.Font("simhei.ttf", 74)  # 游戏结束字体

        self.speed = speed



    def handle_events(self):

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()

            elif event.type == pygame.KEYDOWN:

                if event.key == pygame.K_UP and self.snake.direction != (0, 1):

                    self.snake.change_direction((0, -1))

                elif event.key == pygame.K_DOWN and self.snake.direction != (0, -1):

                    self.snake.change_direction((0, 1))

                elif event.key == pygame.K_LEFT and self.snake.direction != (1, 0):

                    self.snake.change_direction((-1, 0))

                elif event.key == pygame.K_RIGHT and self.snake.direction != (-1, 0):

                    self.snake.change_direction((1, 0))



    def update(self):

        self.snake.move()

        if self.snake.body[0] == self.food.position:

            self.snake.grow()

            self.food.respawn()

            self.score += 1

        if self.snake.body[0] in self.snake.body[1:]:

            self.game_over = True



    def draw(self):

        # 加载并绘制背景图片

        background_image = pygame.image.load("background.jpg")

        background_image = pygame.transform.scale(background_image, (WIDTH, HEIGHT))

        self.screen.blit(background_image, (0, 0))



        # 绘制贪吃蛇

        for i, segment in enumerate(self.snake.body):

            position = (segment[0] * GRID_SIZE, segment[1] * GRID_SIZE)

            if i == 0:

                self.screen.blit(self.snake.head_image, position)

            else:

                self.screen.blit(self.snake.body_image, position)



        # 绘制食物

        food_position = (self.food.position[0] * GRID_SIZE, self.food.position[1] * GRID_SIZE)

        self.screen.blit(self.food.image, food_position)



        # 绘制得分

        score_text = self.font.render(f"得分: {self.score}", True, WHITE)

        self.screen.blit(score_text, (10, 10))



        # 绘制班级姓名和学号

        class_text = self.font.render("XX专业X班", True, WHITE)

        self.screen.blit(class_text, (WIDTH - 190, 5))



        name_text = self.font.render("姓名", True, WHITE)

        self.screen.blit(name_text, (WIDTH - 190, 35))



        id_text = self.font.render("学号", True, WHITE)

        self.screen.blit(id_text, (WIDTH - 190, 65))



        # 绘制日期和时间

        date_time_text = self.font.render(get_date_time(), True, WHITE)

        self.screen.blit(date_time_text, (WIDTH - 250, HEIGHT - 30))



        pygame.display.flip()



    def draw_game_over(self):

        self.screen.fill((0, 0, 0))

        game_over_text = self.game_over_font.render("游戏结束", True, RED)

        score_text = self.game_over_font.render(f"得分: {self.score}", True, WHITE)

        game_over_rect = game_over_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 - 50))

        score_rect = score_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 + 50))

        self.screen.blit(game_over_text, game_over_rect)

        self.screen.blit(score_text, score_rect)

        pygame.display.flip()



    def run(self):

        while not self.game_over:

            self.handle_events()

            self.update()

            self.draw()

            self.clock.tick(self.speed)

        while True:

            self.handle_events()

            self.draw_game_over()





# 难度选择菜单类

class Menu:

    def __init__(self):

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))

        self.font = pygame.font.Font("simhei.ttf", 74)  # 使用黑体,大小为74

        self.prompt_font = pygame.font.Font("simhei.ttf", 48)  # 提示字体

        self.options = ["简单", "中等", "困难"]

        self.selected_option = 0

        self.background_image = pygame.image.load("menu_background.jpg")

        self.background_image = pygame.transform.scale(self.background_image, (WIDTH, HEIGHT))



    def draw(self):

        self.screen.blit(self.background_image, (0, 0))

        prompt_text = self.prompt_font.render("请选择挑战的难度(通过方向键和回车)", True, WHITE)

        prompt_rect = prompt_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 - 150))

        self.screen.blit(prompt_text, prompt_rect)



        for i, option in enumerate(self.options):

            color = GREEN if i == self.selected_option else WHITE

            text = self.font.render(option, True, color)

            text_rect = text.get_rect(center=(WIDTH / 2, HEIGHT / 2 + i * 100))

            self.screen.blit(text, text_rect)

        pygame.display.flip()



    def handle_events(self):

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()

            elif event.type == pygame.KEYDOWN:

                if event.key == pygame.K_UP:

                    self.selected_option = (self.selected_option - 1) % len(self.options)

                elif event.key == pygame.K_DOWN:

                    self.selected_option = (self.selected_option + 1) % len(self.options)

                elif event.key == pygame.K_RETURN:

                    return self.selected_option

        return None



    def run(self):

        while True:

            selected_option = self.handle_events()

            if selected_option is not None:

                return selected_option

            self.draw()





if __name__ == "__main__":

    menu = Menu()

    selected_option = menu.run()



    # 根据选择的难度设置速度

    if selected_option == 0:

        speed = 5  # 简单

    elif selected_option == 1:

        speed = 10  # 中等

    else:

        speed = 15  # 困难



    game = Game(speed)

    game.run()

运行如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值