[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()