|
|
贪吃蛇代码贪吃蛇代码
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()
|
|