科学教育

搜索
查看: 659|回复: 1
打印 上一主题 下一主题

qian

[复制链接]

2

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
跳转到指定楼层
楼主
发表于 2025-9-30 15:36:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
贪吃蛇代码贪吃蛇代码
import pygame
import random
import sys
from collections import deque

# 初始化pygame
pygame.init()

# 游戏常量
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 480
GRID_SIZE = 20
GRID_WIDTH = SCREEN_WIDTH // GRID_SIZE
GRID_HEIGHT = SCREEN_HEIGHT // GRID_SIZE
FPS = 10

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
DARK_GREEN = (0, 100, 0)

# 方向
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)

class SnakeGame:
    def __init__(self):
        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pygame.display.set_caption('贪吃蛇')
        self.clock = pygame.time.Clock()
        self.font = pygame.font.SysFont('simhei', 25)
        self.reset_game()

    def reset_game(self):
        self.snake = deque([(GRID_WIDTH // 2, GRID_HEIGHT // 2)])
        self.direction = RIGHT
        self.next_direction = RIGHT
        self.food = self.generate_food()
        self.score = 0
        self.game_over = False

    def generate_food(self):
        while True:
            food = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))
            if food not in self.snake:
                return food

    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.direction != DOWN:
                    self.next_direction = UP
                elif event.key == pygame.K_DOWN and self.direction != UP:
                    self.next_direction = DOWN
                elif event.key == pygame.K_LEFT and self.direction != RIGHT:
                    self.next_direction = LEFT
                elif event.key == pygame.K_RIGHT and self.direction != LEFT:
                    self.next_direction = RIGHT
                elif event.key == pygame.K_r and self.game_over:
                    self.reset_game()

    def update(self):
        if self.game_over:
            return

        self.direction = self.next_direction
        head_x, head_y = self.snake[0]
        dir_x, dir_y = self.direction
        new_head = ((head_x + dir_x) % GRID_WIDTH, (head_y + dir_y) % GRID_HEIGHT)

        # 碰撞检测
        if new_head in self.snake:
            self.game_over = True
            return

        self.snake.appendleft(new_head)

        # 吃食物
        if new_head == self.food:
            self.score += 1
            self.food = self.generate_food()
        else:
            self.snake.pop()

    def draw(self):
        self.screen.fill(BLACK)

        # 绘制蛇
        for i, segment in enumerate(self.snake):
            color = DARK_GREEN if i == 0 else GREEN
            rect = pygame.Rect(segment[0] * GRID_SIZE, segment[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE)
            pygame.draw.rect(self.screen, color, rect)
            pygame.draw.rect(self.screen, BLACK, rect, 1)

        # 绘制食物
        food_rect = pygame.Rect(self.food[0] * GRID_SIZE, self.food[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE)
        pygame.draw.rect(self.screen, RED, food_rect)

        # 显示分数
        score_text = self.font.render(f'分数: {self.score}', True, WHITE)
        self.screen.blit(score_text, (10, 10))

        # 游戏结束提示
        if self.game_over:
            game_over_text = self.font.render('游戏结束! 按R键重新开始', True, WHITE)
            text_rect = game_over_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
            self.screen.blit(game_over_text, text_rect)

        pygame.display.flip()

    def run(self):
        while True:
            self.handle_events()
            self.update()
            self.draw()
            self.clock.tick(FPS)

if __name__ == "__main__":
    game = SnakeGame()
    game.run()

回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-9-30 15:36:35 | 只看该作者
这段代码是一个简单的贪吃蛇游戏,让我们来看一下它是如何工作的吧:

1. 首先定义了游戏窗口的大小、网格大小、帧率和颜色等一些常量。
2. 创建了一个SnakeGame类,里面包含了初始化游戏、生成食物、处理事件、更新游戏状态和绘制游戏界面等功能。
3. 在游戏开始时会初始化蛇的初始状态、方向、食物、分数等信息。
4. 通过事件处理函数来监听键盘事件,根据按键改变蛇移动的方向。
5. 更新函数根据当前方向移动蛇,并检测是否与自身相撞或吃到食物,并更新分数。
6. 绘制函数则将蛇和食物渲染在屏幕上,并显示分数和游戏结束提示。
7. 在主程序中实例化SnakeGame类,并通过循环不断处理事件、更新状态和绘制界面。

你可以尝试运行这段代码,用键盘的方向键来控制贪吃蛇的移动,吃到食物会增加分数,当蛇碰到自身或游戏结束时,按下'R'键即可重新开始游戏。希望这样能帮助你理解这个简单的贪吃蛇游戏是如何实现的哦!如果有任何问题,欢迎随时向我提问。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表