[Python] 纯文本查看 复制代码
import pygame
import random
import sys
pygame.init()
w, h = 600, 600
screen = pygame.display.set_mode((w, h))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 36)
# 创建皮肤图片(不需要外部文件)
def make_skin(color1, color2):
surf = pygame.Surface((20, 20))
surf.fill(color1)
pygame.draw.rect(surf, color2, (2, 2, 16, 16))
return surf
skins = [
make_skin((200, 50, 50), (255, 150, 150)),
make_skin((50, 200, 50), (150, 255, 150)),
make_skin((50, 50, 200), (150, 150, 255))
]
selected_skin = 0
game_mode = "endless" # endless / timed
game_time = 60
# 食物类型
FOOD_NORMAL = 0
FOOD_SPEED_UP = 1
FOOD_SPEED_DOWN = 2
FOOD_REVERSE = 3
def random_food():
t = random.randint(1, 10)
if t == 1:
return FOOD_SPEED_UP
elif t == 2:
return FOOD_SPEED_DOWN
elif t == 3:
return FOOD_REVERSE
return FOOD_NORMAL
def draw_text(txt, y):
s = font.render(txt, True, (255, 255, 255))
screen.blit(s, (w//2 - s.get_width()//2, y))
def main_menu():
global selected_skin, game_mode
index = 0
while True:
screen.fill(0)
draw_text("Snake Game", 80)
draw_text("按 1 选择模式(当前:" + ("无尽" if game_mode=="endless" else "限时") + ")", 200)
draw_text("按 2 选择皮肤", 260)
draw_text("按 ENTER 开始游戏", 320)
screen.blit(skins[selected_skin], (w//2 - 10, 380))
pygame.display.flip()
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
sys.exit()
if ev.type == pygame.KEYDOWN:
if ev.key == pygame.K_1:
game_mode = "timed" if game_mode == "endless" else "endless"
if ev.key == pygame.K_2:
selected_skin = (selected_skin + 1) % len(skins)
if ev.key == pygame.K_RETURN:
game_loop()
return
def game_loop():
snake = [(300, 300), (280, 300), (260, 300)]
dx, dy = 20, 0
speed = 10
food = (random.randrange(0, w, 20), random.randrange(0, h, 20))
food_type = random_food()
timer = game_time
last_tick = pygame.time.get_ticks()
while True:
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
sys.exit()
if ev.type == pygame.KEYDOWN:
if ev.key == pygame.K_UP and dy == 0:
dx, dy = 0, -20
if ev.key == pygame.K_DOWN and dy == 0:
dx, dy = 0, 20
if ev.key == pygame.K_LEFT and dx == 0:
dx, dy = -20, 0
if ev.key == pygame.K_RIGHT and dx == 0:
dx, dy = 20, 0
head = (snake[0][0] + dx, snake[0][1] + dy)
if head[0] < 0: head = (w - 20, head[1])
if head[0] >= w: head = (0, head[1])
if head[1] < 0: head = (head[0], h - 20)
if head[1] >= h: head = (head[0], 0)
if head in snake:
return
snake.insert(0, head)
if head == food:
if food_type == FOOD_SPEED_UP:
speed += 2
elif food_type == FOOD_SPEED_DOWN:
speed = max(5, speed - 2)
elif food_type == FOOD_REVERSE:
snake.reverse()
dx, dy = -dx, -dy
food = (random.randrange(0, w, 20), random.randrange(0, h, 20))
food_type = random_food()
else:
snake.pop()
if game_mode == "timed":
now = pygame.time.get_ticks()
if now - last_tick >= 1000:
timer -= 1
last_tick = now
if timer <= 0:
return
screen.fill((30, 30, 30))
for x, y in snake:
screen.blit(skins[selected_skin], (x, y))
if food_type == FOOD_NORMAL:
fc = (255, 255, 255)
elif food_type == FOOD_SPEED_UP:
fc = (255, 50, 50)
elif food_type == FOOD_SPEED_DOWN:
fc = (50, 50, 255)
else:
fc = (255, 255, 0)
pygame.draw.rect(screen, fc, (food[0], food[1], 20, 20))
if game_mode == "timed":
t_surf = font.render("倒计时: " + str(timer), True, (255, 255, 255))
screen.blit(t_surf, (10, 10))
pygame.display.flip()
clock.tick(speed)
main_menu()