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

抢占小游戏-王明杰

[复制链接]

5

主题

5

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2025-1-11 09:39:42 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame
import random
import sys

# 游戏设置
WIDTH = 800
HEIGHT = 600
PLAYER_RADIUS = 20
RESOURCE_SIZE = 15
NUM_PLAYERS = 3
NUM_RESOURCES = 15
MOVE_SPEED = 5
GAME_DURATION = 30  # 秒
COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255),
          (255, 255, 0), (255, 0, 255), (0, 255, 255)]
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


class Player:
    def __init__(self, x, y, color, name):
        self.x = x
        self.y = y
        self.color = color
        self.name = name
        self.resources = 0

    def move(self, dx, dy):
        self.x += dx
        self.y += dy
        # 限制玩家移动范围
        self.x = max(PLAYER_RADIUS, min(self.x, WIDTH - PLAYER_RADIUS))
        self.y = max(PLAYER_RADIUS, min(self.y, HEIGHT - PLAYER_RADIUS))

    def draw(self, screen):
        pygame.draw.circle(screen, self.color,
                           (int(self.x), int(self.y)), PLAYER_RADIUS)

    def collide_with_resource(self, resource):
      resource_rect = pygame.Rect(
          resource[0], resource[1], RESOURCE_SIZE, RESOURCE_SIZE)
      player_rect = pygame.Rect(
          self.x-PLAYER_RADIUS, self.y - PLAYER_RADIUS, PLAYER_RADIUS*2, PLAYER_RADIUS*2)
      return player_rect.colliderect(resource_rect)


class Resource:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, screen):
        pygame.draw.rect(screen, WHITE, (self.x, self.y,
                         RESOURCE_SIZE, RESOURCE_SIZE))


def generate_resources(num_resources):
    resources = []
    for _ in range(num_resources):
        x = random.randint(RESOURCE_SIZE, WIDTH - RESOURCE_SIZE)
        y = random.randint(RESOURCE_SIZE, HEIGHT - RESOURCE_SIZE)
        resources.append(Resource(x, y))
    return resources


def display_text(screen, text, x, y, color=WHITE, size=30):
    font_name = "SimHei"  # 尝试黑体
    font = pygame.font.SysFont(font_name, size)  # 尝试使用系统字体

    # 如果系统没有该字体,使用默认字体

    font_name = "Microsoft YaHei"  # 尝试微软雅黑
    font = pygame.font.SysFont(font_name, size)

    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect(center=(x, y))
    screen.blit(text_surface, text_rect)


def play_game():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("抢占小游戏")
    clock = pygame.time.Clock()

    players = []
    for i in range(NUM_PLAYERS):
       name = f"玩家 {i+1}"
       x = random.randint(PLAYER_RADIUS, WIDTH - PLAYER_RADIUS)
       y = random.randint(PLAYER_RADIUS, HEIGHT - PLAYER_RADIUS)
       players.append(Player(x, y, COLORS[i % len(COLORS)], name))

    resources = generate_resources(NUM_RESOURCES)

    start_time = pygame.time.get_ticks()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        keys = pygame.key.get_pressed()

        # 玩家移动
        if keys[pygame.K_a]:  # A 键: 玩家 1 向左
            players[0].move(-MOVE_SPEED, 0)
        if keys[pygame.K_d]:  # D 键: 玩家 1 向右
            players[0].move(MOVE_SPEED, 0)
        if keys[pygame.K_w]:  # W 键: 玩家 1 向上
           players[0].move(0, -MOVE_SPEED)
        if keys[pygame.K_s]:  # S 键: 玩家 1 向下
           players[0].move(0, MOVE_SPEED)

        if len(players) > 1:
            if keys[pygame.K_LEFT]:  # 左方向键:玩家2向左
                players[1].move(-MOVE_SPEED, 0)
            if keys[pygame.K_RIGHT]:  # 右方向键:玩家2向右
                players[1].move(MOVE_SPEED, 0)
            if keys[pygame.K_UP]:  # 上方向键:玩家2向上
               players[1].move(0, -MOVE_SPEED)
            if keys[pygame.K_DOWN]:  # 下方向键: 玩家 2向下
               players[1].move(0, MOVE_SPEED)

        if len(players) > 2:
            if keys[pygame.K_j]:  # J 键:玩家3向左
                players[2].move(-MOVE_SPEED, 0)
            if keys[pygame.K_l]:  # L 键:玩家3向右
                players[2].move(MOVE_SPEED, 0)
            if keys[pygame.K_i]:  # I 键:玩家3向上
                players[2].move(0, -MOVE_SPEED)
            if keys[pygame.K_k]:  # K 键: 玩家3向下
                players[2].move(0, MOVE_SPEED)

        # 抢占资源
        resources_copy = resources.copy()
        for resource in resources_copy:
            for player in players:
                if player.collide_with_resource((resource.x, resource.y)):
                    player.resources += 1
                    resources.remove(resource)
                    break

        # 渲染
        screen.fill(BLACK)
        for resource in resources:
          resource.draw(screen)
        for player in players:
            player.draw(screen)

        #显示玩家信息
        text_y = 20
        for player in players:
            display_text(
                screen, f"{player.name}: {player.resources}", 100, text_y, player.color, 20)
            text_y += 20

        #计时器和游戏结束逻辑
        elapsed_time = (pygame.time.get_ticks() - start_time) / 1000
        remaining_time = max(0, GAME_DURATION - elapsed_time)
        display_text(
            screen, f"时间: {int(remaining_time)}", WIDTH//2, 20, WHITE, 30)
        if remaining_time <= 0:
            running = False

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

    # 游戏结束
    winner = max(players, key=lambda player: player.resources)
    screen.fill(BLACK)
    display_text(screen, "游戏结束!", WIDTH//2, HEIGHT//2 - 50, WHITE, 50)
    display_text(screen, f"获胜者是: {winner.name} (拥有资源: {winner.resources})",
                 WIDTH // 2, HEIGHT // 2 + 20, WHITE, 30)
    pygame.display.flip()

    pygame.time.delay(3000)  # 显示结束界面 3 秒
    pygame.quit()


if __name__ == "__main__":
    play_game()

回复

使用道具 举报

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

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 23:48 , Processed in 0.042744 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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