找回密码
 中文实名注册
搜索
查看: 26|回复: 0

我是喵喵喵

[复制链接]

2

主题

0

回帖

142

积分

注册会员

积分
142
发表于 4 天前 | 显示全部楼层 |阅读模式
[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()

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

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