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

抽奖小游戏 曹家睿

[复制链接]

4

主题

33

回帖

1816

积分

金牌会员

积分
1816
发表于 2025-6-28 11:38:34 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import sys
import random

# 初始化Pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 800, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("滚动抽奖小游戏")

# 颜色定义
BACKGROUND = (30, 30, 30)
HIGHLIGHT = (255, 255, 0)
PRIZE_COLORS = [
    (220, 20, 60), (30, 144, 255), (50, 205, 50),
    (255, 140, 0), (148, 0, 211), (0, 191, 255),
    (255, 215, 0), (244, 164, 96), (255, 99, 71),
]
TEXT_COLOR = (255, 255, 255)

# 奖品设置
PRIZES = [
    "iPhone", "iPad", "MacBook", "PS5", "智能手表",
    "耳机", "无人机", "咖啡机", "谢谢参与"
]

# 字体设置
FONT = pygame.font.SysFont("SimHei", 28)

# 按钮设置
BUTTON_COLOR = (70, 130, 180)
BUTTON_HOVER_COLOR = (100, 149, 237)
BUTTON_RECT = pygame.Rect(WIDTH // 2 - 75, HEIGHT - 80, 150, 50)

# 奖品滚动区域设置
PRIZE_WIDTH = 120
PRIZE_HEIGHT = 80
PRIZE_SPACING = 20
SCROLL_SPEED = 10  # 奖品滚动速度

# 奖品初始位置
prizes = []
for i, prize in enumerate(PRIZES):
    x = i * (PRIZE_WIDTH + PRIZE_SPACING)
    prizes.append({"name": prize, "color": PRIZE_COLORS[i % len(PRIZE_COLORS)], "x": x})

# 游戏状态
scrolling = False
result = None

# 固定框选区域
FRAME_WIDTH = PRIZE_WIDTH + PRIZE_SPACING
FRAME_HEIGHT = PRIZE_HEIGHT + 20
FRAME_X = (WIDTH - FRAME_WIDTH) // 2
FRAME_Y = (HEIGHT - PRIZE_HEIGHT) // 2 - 10

# 游戏主循环
clock = pygame.time.Clock()


def draw_prizes():
    """绘制滚动奖品"""
    for prize in prizes:
        # 绘制奖品矩形
        rect = pygame.Rect(prize["x"], FRAME_Y + 10, PRIZE_WIDTH, PRIZE_HEIGHT)
        pygame.draw.rect(screen, prize["color"], rect, border_radius=10)
        
        # 绘制奖品名称
        text = FONT.render(prize["name"], True, TEXT_COLOR)
        text_rect = text.get_rect(center=rect.center)
        screen.blit(text, text_rect)


def draw_frame():
    """绘制框选区域"""
    pygame.draw.rect(screen, HIGHLIGHT, (FRAME_X, FRAME_Y, FRAME_WIDTH, FRAME_HEIGHT), 5, border_radius=15)


def draw_button():
    """绘制控制按钮"""
    color = BUTTON_HOVER_COLOR if BUTTON_RECT.collidepoint(pygame.mouse.get_pos()) else BUTTON_COLOR
    pygame.draw.rect(screen, color, BUTTON_RECT, border_radius=10)
    text = FONT.render("开始" if not scrolling else "停止", True, TEXT_COLOR)
    text_rect = text.get_rect(center=BUTTON_RECT.center)
    screen.blit(text, text_rect)


def draw_result():
    """绘制抽奖结果"""
    if result:
        result_text = FONT.render(f"恭喜您获得: {result}", True, TEXT_COLOR)
        result_rect = result_text.get_rect(center=(WIDTH // 2, HEIGHT - 150))
        screen.blit(result_text, result_rect)


def update_prizes():
    """更新奖品位置"""
    for prize in prizes:
        prize["x"] -= SCROLL_SPEED
    # 将移出屏幕左侧的奖品移动到右侧
    if prizes[0]["x"] + PRIZE_WIDTH < 0:
        removed = prizes.pop(0)
        removed["x"] = prizes[-1]["x"] + PRIZE_WIDTH + PRIZE_SPACING
        prizes.append(removed)


def get_selected_prize():
    """获取框选区域内的奖品"""
    for prize in prizes:
        if FRAME_X < prize["x"] + PRIZE_WIDTH // 2 < FRAME_X + FRAME_WIDTH:
            return prize["name"]


while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            if BUTTON_RECT.collidepoint(pygame.mouse.get_pos()):
                if not scrolling:
                    scrolling = True
                    result = None
                else:
                    scrolling = False
                    result = get_selected_prize()

    # 更新奖品滚动
    if scrolling:
        update_prizes()

    # 绘制屏幕内容
    screen.fill(BACKGROUND)
    draw_prizes()
    draw_frame()
    draw_button()
    draw_result()

    pygame.display.flip()
    clock.tick(60)
回复

使用道具 举报

4

主题

33

回帖

1816

积分

金牌会员

积分
1816
 楼主| 发表于 2025-7-24 11:48:44 | 显示全部楼层
回复

使用道具 举报

8

主题

17

回帖

660

积分

高级会员

积分
660
发表于 2025-7-24 17:58:03 | 显示全部楼层
:D:D:D:D:D:D:D:D
回复

使用道具 举报

4

主题

33

回帖

1816

积分

金牌会员

积分
1816
 楼主| 发表于 2025-7-29 10:18:20 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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