import pygame
import random
import sys
import time
pygame.init()
BASE_SCREEN_WIDTH = 800
BASE_SCREEN_HEIGHT = 600
BASE_TILE_SIZE = 60
BASE_GRID_SPACE = 5
BASE_CARD_SPACE = 20
info = pygame.display.Info()
SCREEN_WIDTH = info.current_w
SCREEN_HEIGHT = info.current_h
SCALE_X = SCREEN_WIDTH / BASE_SCREEN_WIDTH
SCALE_Y = SCREEN_HEIGHT / BASE_SCREEN_HEIGHT
SCALE = min(SCALE_X, SCALE_Y)
TILE_SIZE = int(SCALE * BASE_TILE_SIZE)
GRID_SPACE = int(SCALE * BASE_GRID_SPACE)
CARD_SPACE = int(SCALE * BASE_CARD_SPACE)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 120, 255)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
GRAY = (128, 128, 128)
PURPLE = (128, 0, 128)
LIGHT_BLUE = (173, 216, 230)
blank = 0
blue = 1
white = 2
orange = 3
red = 4
terrain_start = [
[[blue, white, white], [blue, blank, white], [blue, white, white]]
]
terrain_end = [
[[white, white, blank], [blank, white, red], [white, white, blank]]
]
terrain_energy = [
[[white, orange, white], [white, white, white], [blank, white, blank]],
[[blank, white, blank], [white, white, white], [white, orange, white]],
[[blank, blank, white], [white, orange, white], [white, white, white]],
[[white, white, white], [white, orange, white], [white, blank, blank]],
[[white, blank, white], [white, orange, white], [white, blank, white]],
[[white, white, white], [white, orange, white], [white, white, blank]],
[[blank, white, white], [white, orange, white], [white, white, white]]
]
terrain_common = [
[[white, white, white], [blank, blank, white], [white, white, white]],
[[white, white, white], [white, blank, blank], [white, white, white]],
[[white, white, white], [blank, white, white], [blank, white, blank]],
[[blank, white, blank], [white, white, blank], [white, white, white]],
[[white, blank, white], [white, white, white], [white, white, white]],
[[white, white, white], [white, white, white], [white, blank, white]],
[[white, white, white], [blank, white, blank], [white, white, white]],
]
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.RESIZABLE)
pygame.display.set_caption("跑酷小子")
clock = pygame.time.Clock()
font_size = max(18, int(24 * SCALE))
title_font_size = max(36, int(48 * SCALE))
small_font_size = max(14, int(18 * SCALE))
font = pygame.font.SysFont('simhei', font_size)
title_font = pygame.font.SysFont('simhei', title_font_size)
small_font = pygame.font.SysFont('simhei', small_font_size)
class Player:
def __init__(self, name, character_class, is_ai=False):
self.name = name
self.character_class = character_class
self.energy = 0
self.jump_energy = 2
self.forward_energy = 1
self.blank_energy = 2
self.knockdown_energy = 1
self.energy_replenishment = 1
self.is_ai = is_ai
if character_class == "耐力小子":
self.energy_replenishment = 2
elif character_class == "弹跳小子":
self.jump_energy = 1
elif character_class == "肌肉小子":
self.knockdown_energy = 2
# def special_ability(self):
def add_energy(self, amount):
self.energy += amount
def consume_energy(self, amount):
if self.energy >= amount:
self.energy -= amount
return True
return False
class Game:
def __init__(self):
self.players = []
self.current_player_index = 0
self.current_mode = "主菜单"
self.game_states = ["主菜单", "模式选择", "玩家数量", "角色创建", "竞技模式", "游戏结束"]
self.game_over = False
self.difficulty = "简易模式"
self.player_count = 1
self.input_text = ""
self.input_active = False
self.input_prompt = ""
self.message_log = []
self.player_name = ""
self.terrain_list = []
self.screen_width = SCREEN_WIDTH
self.screen_height = SCREEN_HEIGHT
self.scale = SCALE
self.tile_size = TILE_SIZE
self.grid_space = GRID_SPACE
self.card_space = CARD_SPACE
self.rps_round = 0
self.player_lose_streak = {}
self.player_positions = {}
self.player_order = []
self.current_action = None
self.rps_results = {}
self.rps_active = False
self.rps_choices = {}
self.waiting_for_ai = False
self.ai_timer = 0
self.ai_action_delay = 1.0
self.terrain_positions = {}
def update_screen_size(self, width, height):
self.screen_width = width
self.screen_height = height
self.scale = min(width / BASE_SCREEN_WIDTH, height / BASE_SCREEN_HEIGHT)
self.tile_size = max(20, int(BASE_TILE_SIZE * self.scale))
self.grid_space = max(2, int(BASE_GRID_SPACE * self.scale))
self.card_space = max(5, int(BASE_CARD_SPACE * self.scale))
global font, title_font, small_font
font_size = max(18, int(24 * self.scale))
title_font_size = max(36, int(48 * self.scale))
small_font = max(14, int(18 * self.scale))
font = pygame.font.SysFont('simhei', font_size)
title_font = pygame.font.SysFont('simhei', title_font_size)
small_font = pygame.font.SysFont('simhei', small_font_size)
def add_message(self, message):
self.message_log.append(message)
if len(self.message_log) > 5:
self.message_log.pop(0)
def create_player(self, name, character_class, is_ai=False):
player = Player(name, character_class)
self.players.append(player)
if is_ai:
self.add_message(f"AI玩家{len(self.players)}: {name} the {character_class}已创建")
else:
self.add_message(f"玩家{len(self.players)}: {name} the {character_class}已创建")
def next_player(self):
self.current_player_index = (self.current_player_index + 1) % len(self.players)
return self.players[self.current_player_index]
def get_current_player(self):
if self.players:
return self.players[self.current_player_index]
return None
def create_terrain(self):
terrain_count = 7
if self.difficulty == "体验模式":
terrain_count = 4
elif self.difficulty == "普通模式":
terrain_count = 10
terrain_list = []
terrain_list.append(random.choice(terrain_start))
end_terrain = random.choice(terrain_end)
terrain_list.append(random.choice(terrain_energy))
terrain_list.append(random.choice(terrain_common))
remaining_terrain = terrain_count - 4
for _ in range(remaining_terrain):
choice_pool = terrain_energy + terrain_common
terrain_list.append(random.choice(choice_pool))
terrain_list.append(end_terrain)
return terrain_list
def init_game(self):
self.terrain_list = self.create_terrain()
start_positions = []
for i in range(3):
if self.terrain_list[0][i][0] != blank:
start_positions.append((0, i, 0))
random.shuffle(start_positions)
for i, player in enumerate(self.players):
self.player_positions[player] = start_positions[i]
self.player_order = list(self.players)
random.shuffle(self.player_order)
for player in self.players:
self.player_lose_streak[player] = 0
self.current_player_index = 0
self.play_rps()
def play_rps(self):
self.rps_active = True
self.rps_choices = {}
self.rps_results = {}
self.add_message("新一轮石头剪刀布开始!")
self.add_message("请玩家选择:1-石头,2-剪刀,3-布")
def process_rps_choice(self, player, choice):
choices = ["石头", "剪刀", "布"]
self.rps_choices[player] = choice
self.add_message(f"{player.name}选择了{choices[choice-1]}")
for ai_player in self.players:
if ai_player.is_ai and ai_player not in self.rps_choices:
ai_choice = random.randint(1, 3)
self.rps_choices[ai_player] = ai_choice
self.add_message(f"{ai_player.name}选择了{choices[ai_choice - 1]}")
if len(self.rps_choices) == len(self.players):
self.determine_rps_winner()
def determine_rps_winner(self):
choices_map = {1: "石头", 2: "剪刀", 3:"布"}
wins_against = {1: 2, 2: 3, 3: 1}
choice_count = {1: 0, 2: 0, 3: 0}
for choice in self.rps_choices.values():
choice_count[choice] += 1
winning_choice = None
if choice_count[1] > 0 and choice_count[2] > 0 and choice_count[3] > 0:
pass
elif choice_count[1] > 0 and choice_count[2] > 0:
winning_choice = 1
elif choice_count[2] > 0 and choice_count[3] > 0:
winning_choice = 2
elif choice_count[3] > 0 and choice_count[1] > 0:
winning_choice = 3
for player, choice in self.rps_choices.items():
if winning_choice is None:
player.add_energy(1)
self.add_message(f"平局!{player.name}获得1点能量")
elif choice == winning_choice:
energy_award = {1: 1, 2: 2, 3: 3}[choice]
player.add_energy(energy_award)
self.add_message(f"{player.name}获胜,获得{energy_award}点能量")
self.player_lose_streak[player] = 0
else:
self.add_message(f"{player.name}失败,未获得能量")
self.player_lose_streak[player] += 1
if self.player_lose_streak[player] >= 3:
player.add_energy(1)
self.add_message(f"{player.name}连输3次,获得1点能量奖励")
self.rps_active = False
self.rps_round += 1
def move_player(self, player, direction):
current_pos = self.player_positions[player]
card_idx, row, col = current_pos
new_card_idx = card_idx
new_row = row
new_col = col
if direction == "up" and row > 0:
new_row -= 1
energy_cost = player.jump_energy
elif direction == "down" and row < 2:
new_row += 1
energy_cost = 0
elif direction == "left" and (col > 0 or card_idx > 0):
if col > 0:
new_col -= 1
else:
new_card_idx -= 1
new_col = 2
energy_cost = player.forward_energy
elif direction == "right" and (col < 2 or card_idx < len(self.terrain_list) - 1):
if col < 2:
new_col += 1
else:
new_card_idx += 1
new_col = 0
energy_cost = player.forward_energy
else:
self.add_message("无法向该方向移动")
return False
if new_card_idx < 0 or new_card_idx >= len(self.terrain_list):
self.add_message("无法移动到地图外")
return False
target_terrain = self.terrain_list[new_card_idx][new_row][new_col]
if target_terrain == blank:
self.handle_fall(player, new_card_idx, new_row, new_col)
return True
if not player.consume_energy(energy_cost):
self.add_message(f"{player.name}能量不足,需要{energy_cost}点能量")
return False
collision_player = None
for other_player, pos in self.player_positions.items():
if other_player != player and pos == (new_card_idx, new_row, new_col):
collision_player = other_player
break
if collision_player:
self.handle_collision(player, collision_player, direction)
else:
self.player_positions[player] = (new_card_idx, new_row, new_col)
self.add_message(f"{player.name}移动到位置({new_card_idx}, {new_row}, {new_col})")
if target_terrain == red:
self.add_message(f"{player.name}到达终点,游戏结束")
self.current_mode = "游戏结束"
return True
if target_terrain == orange:
if player.character_class == "耐力小子":
player.add_energy(2)
self.add_message(f"{player.name}在能量块上,获得2点能量")
else:
player.add_energy(1)
self.add_message(f"{player.name}在能量块上,获得1点能量")
return True
def handle_fall(self, player, card_idx, row, col):
self.add_message(f"{player.name}踩空掉落了!")
while row < 2:
row += 1
if self.terrain_list[card_idx][row][col] != blank:
collision = False
for other_player, pos in self.player_positions.items():
if other_player != player and pos == (card_idx, row, col):
self.handle_collision(player, other_player, "down")
collision = True
break
if not collision:
self.player_positions[player] = (card_idx, row, col)
self.add_message(f"{player.name}掉落到位置({card_idx},{row},{col})")
return
self.add_message(f"{player.name}掉出地图,被淘汰!")
self.players.remove(player)
if len(self.players) == 1:
self.add_message(f"{self.players[0].name}是最后幸存者,获胜!")
self.current_mode = "游戏结束"
def handle_collision(self, moving_player, stationary_player, direction):
self.add_message(f"{moving_player.name}冲撞了{stationary_player.name}!")
card_idx, row, col = self.player_positions[stationary_player]
knockback_distance = 2 if moving_player.character_class == "肌肉小子" else 1
if direction:
new_col = col - knockback_distance
new_card_idx = card_idx
if new_col < 0:
new_card_idx -= 1
new_col += 3
else:
new_col = col
new_card_idx = card_idx
if new_card_idx < 0 or new_card_idx >= len(self.terrain_list) or new_col < 0 or new_col > 2:
self.add_message(f"{stationary_player.name}被撞出地图!")
self.players.remove(stationary_player)
if len(self.players) == 1:
self.add_message(f"{self.players[0].name}是最后幸存者,获胜!")
self.current_mode = "游戏结束"
return
collision_other = None
for other_player, pos in self.player_positions.items():
if other_player != stationary_player and pos == (new_card_idx, row, new_col):
collision_other = other_player
break
if collision_other:
self.handle_collision(stationary_player, collision_other, direction)
else:
self.player_positions[stationary_player] = (new_card_idx, row, new_col)
self.add_message(f"{stationary_player.name}被撞到位置({new_card_idx},{row},{new_col})")
def ai_make_decision(self, player):
if self.rps_active:
return
if player.energy <= 0:
self.play_rps()
return
directions = ["right", "up", "down", "left"]
for direction in directions:
if self.move_player(player, direction):
return
self.play_rps()
def draw_main_menu(self):
screen.fill(BLACK)
title = title_font.render("跑酷小子", True, YELLOW)
title_rect = title.get_rect(center=(self.screen_width // 2, 100 * self.scale))
screen.blit(title, title_rect)
options = ["开始游戏", "退出"]
for i, option in enumerate(options):
text = font.render(option, True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, 250 * self.scale + i * 50 * self.scale))
screen.blit(text, text_rect)
def draw_difficulty_selection(self):
screen.fill(BLACK)
title = title_font.render("选择模式", True, YELLOW)
title_rect = title.get_rect(center=(self.screen_width // 2, 50 * self.scale))
screen.blit(title, title_rect)
difficulties = ["体验模式", "简易模式", "普通模式"]
colors = [GREEN, YELLOW, RED]
for i, diff in enumerate(difficulties):
color = colors[i] if diff == self.difficulty else WHITE
text = font.render(f"{i+1}.{diff}", True, color)
text_rect = text.get_rect(center=(self.screen_width // 2, 150 * self.scale + i * 50 * self.scale))
screen.blit(text, text_rect)
text = font.render("按数字选择模式,按回车确认", True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, 300 * self.scale))
screen.blit(text, text_rect)
def draw_player_count_selection(self):
screen.fill(BLACK)
title = title_font.render("选择玩家数量", True, YELLOW)
title_rect = title.get_rect(center=(self.screen_width // 2, 50 * self.scale))
screen.blit(title, title_rect)
for i in range(1, 4):
color = GREEN if i == self.player_count else WHITE
text = font.render(f"{i}位玩家", True, color)
text_rect = text.get_rect(center=(self.screen_width//2, 150 * self.scale + i * 50 * self.scale))
screen.blit(text, text_rect)
text = font.render("按数字键选择玩家数量,按回车确认", True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, 350 * self.scale))
screen.blit(text, text_rect)
def draw_character_creation(self):
screen.fill(BLACK)
title = title_font.render(f"创建玩家{len(self.players)+1}", True, YELLOW)
title_rect = title.get_rect(center=(self.screen_width // 2, 50 * self.scale))
screen.blit(title, title_rect)
if self.input_active:
prompt = font.render(self.input_prompt, True, WHITE)
prompt_rect = prompt.get_rect(center=(self.screen_width // 2, 120 * self.scale))
screen.blit(prompt, prompt_rect)
input_display = font.render(self.input_text, True, GREEN)
input_rect = input_display.get_rect(center=(self.screen_width // 2, 150 * self.scale))
screen.blit(input_display, input_rect)
else:
classes = ["耐力小子", "弹跳小子", "肌肉小子"]
descriptions = [
"橙色方块为你提供两点能量",
"竖直上跳只消耗一点能量",
"造成的击退效果为两格",
]
for i, cls in enumerate(classes):
text = font.render(f"{i+1}.{cls}", True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, 150 * self.scale + i * 60 * self.scale))
screen.blit(text, text_rect)
desc = small_font.render(descriptions[i], True, YELLOW)
desc_rect = desc.get_rect(center=(self.screen_width // 2, 180 * self.scale + i * 60 * self.scale))
screen.blit(desc, desc_rect)
text = font.render("请输入角色名称并按数字选择跑酷小子", True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, 400 * self.scale))
screen.blit(text, text_rect)
def draw_terrain_card(self, card, x, y, tile_size, grid_space):
card_width = tile_size * 3 + grid_space * 2
card_height = tile_size * 3 + grid_space * 2
pygame.draw.rect(screen,GRAY, (x, y, card_width, card_height))
for row in range(3):
for col in range(3):
block_type = card[row][col]
if block_type != blank:
color = WHITE
if block_type == blue:
color = BLUE
elif block_type == orange:
color = ORANGE
elif block_type == red:
color = RED
block_x = x + col * (tile_size + grid_space) + grid_space
block_y = y + row * (tile_size + grid_space) + grid_space
pygame.draw.rect(screen, color, (block_x, block_y, tile_size, tile_size))
def draw_competition_mode(self):
screen.fill(BLACK)
title = title_font.render("竞技模式", True, YELLOW)
title_rect = title.get_rect(center=(self.screen_width // 2, 50 * self.scale))
screen.blit(title, title_rect)
current_player = self.get_current_player()
if current_player:
player_text = font.render(f"当前玩家: {current_player.name}({current_player.character_class})", True, WHITE)
screen.blit(player_text, (20 * self.scale, 80 * self.scale))
energy_text = font.render(f"能量: {current_player.energy}", True, GREEN)
screen.blit(energy_text, (20 * self.scale, 110 * self.scale))
if self.rps_active:
rps_text = title_font.render("石头剪刀布", True, YELLOW)
rps_rect = rps_text.get_rect(center=(self.screen_width // 2, 200 * self.scale))
screen.blit(rps_text, rps_rect)
choices = ["1-石头", "2-剪刀", "3-布"]
for i, choice in enumerate(choices):
choice_text = font.render(choice, True, WHITE)
choice_rect = choice_text.get_rect(
center=(self.screen_width // 2, 250 * self.scale + i * 40 * self.scale))
screen.blit(choice_text, choice_rect)
made_choice_text = font.render("已选择:", True, WHITE)
screen.blit(made_choice_text, (20 * self.scale, 350 * self.scale))
y_offset = 380 * self.scale
for player, choice in self.rps_choices.items():
choice_name = ["石头", "剪刀", "布"][choice - 1]
player_choice_text = small_font.render(f"{player.name}: {choice_name}", True, GREEN)
screen.blit(player_choice_text, (20 * self.scale, y_offset))
y_offset += 25 * self.scale
else:
start_x = 50 * self.scale
start_y = 150 * self.scale
if not hasattr(self, "terrain_list") or not self.terrain_list:
self.terrain_list = self.create_terrain()
card_width = self.tile_size * 3 + self.grid_space * 2
card_height = self.tile_size * 3 + self.grid_space * 2
available_width = self.screen_width - 2 * start_x
cards_per_row = max(1, min(len(self.terrain_list), available_width // (card_width + self.card_space)))
if cards_per_row < len(self.terrain_list):
scale_factor = available_width / (len(self.terrain_list) * (card_width + self.card_space))
if scale_factor < 1.0:
self.tile_size = max(20, int(self.tile_size * scale_factor))
self.grid_space = max(2, int(self.grid_space * scale_factor))
card_width = self.tile_size * 3 + self.grid_space * 2
card_height = self.tile_size * 3 + self.grid_space * 2
cards_per_row = len(self.terrain_list)
total_cards_width = min(len(self.terrain_list), cards_per_row) * (
card_width + self.card_space) - self.card_space
start_x = (self.screen_width - total_cards_width) // 2
self.terrain_positions = {}
for i, card in enumerate(self.terrain_list):
row = i // cards_per_row
col = i % cards_per_row
x = start_x + col * (card_width + self.card_space)
y = start_y + row * (card_height + self.card_space)
self.terrain_positions[i] = (x, y, card_width, card_height)
self.draw_terrain_card(card, x, y, self.tile_size, self.grid_space)
if i == 0:
pygame.draw.circle(screen, RED, (x + card_width // 2, y - 15), 10)
for player, pos in self.player_positions.items():
card_idx, row, col = pos
if card_idx not in self.terrain_positions:
continue
x, y, card_width, card_height = self.terrain_positions[card_idx]
block_x = x + col * (self.tile_size + self.grid_space) + self.grid_space + self.tile_size // 2
block_y = y + row * (self.tile_size + self.grid_space) + self.grid_space + self.tile_size // 2
color = GREEN if not player.is_ai else PURPLE
pygame.draw.circle(screen, color, (block_x, block_y), self.tile_size // 3)
name_text = small_font.render(player.name[0], True, BLACK)
name_rect = name_text.get_rect(center=(block_x, block_y))
screen.blit(name_text, name_rect)
help_text = font.render("按方向键移动,按空格键进行石头剪刀布", True, WHITE)
help_rect = help_text.get_rect(center=(self.screen_width // 2, self.screen_height - 50 * self.scale))
screen.blit(help_text, help_rect)
def draw_game_over(self):
screen.fill(BLACK)
title = title_font.render("游戏结束", True, YELLOW, RED)
title_rect = title.get_rect(center=(self.screen_width // 2, self.screen_height // 2 - 50))
screen.blit(title, title_rect)
if len(self.players) == 1:
winner = self.players[0]
winner_text = title_font.render(f"{winner.name} 获胜!", True, GREEN)
winner_rect = winner_text.get_rect(center=(self.screen_width // 2, self.screen_height // 2))
screen.blit(winner_text, winner_rect)
text = font.render("按R重新开始,按Q退出", True, WHITE)
text_rect = text.get_rect(center=(self.screen_width // 2, self.screen_height // 2 + 50))
screen.blit(text, text_rect)
def draw(self):
if self.current_mode == "主菜单":
self.draw_main_menu()
elif self.current_mode == "模式选择":
self.draw_difficulty_selection()
elif self.current_mode == "玩家数量":
self.draw_player_count_selection()
elif self.current_mode == "角色创建":
self.draw_character_creation()
elif self.current_mode == "竞技模式":
self.draw_competition_mode()
elif self.current_mode == "游戏结束":
self.draw_game_over()
for i, message in enumerate(self.message_log):
msg_text = small_font.render(message, True, WHITE)
screen.blit(msg_text, (20 * self.scale, self.screen_height - (len(self.message_log) - i) * 25 * self.scale))
pygame.display.flip()
def handle_input(self, event):
if event.type == pygame.KEYDOWN:
if self.current_mode == "主菜单":
if event.key == pygame.K_RETURN:
self.current_mode = "模式选择"
elif event.key == pygame.K_q:
pygame.quit()
sys.exit()
elif self.current_mode == "模式选择":
if event.key == pygame.K_1:
self.difficulty = "体验模式"
elif event.key == pygame.K_2:
self.difficulty = "简易模式"
elif event.key == pygame.K_3:
self.difficulty = "普通模式"
elif event.key == pygame.K_RETURN:
self.terrain_list = self.create_terrain()
self.current_mode = "玩家数量"
elif self.current_mode == "玩家数量":
if event.key in [pygame.K_1, pygame.K_2, pygame.K_3]:
self.player_count = event.key - pygame.K_0
elif event.key == pygame.K_RETURN:
self.current_mode = "角色创建"
self.input_active = True
self.input_prompt = f"请输入玩家{len(self.players) + 1}的名称:"
self.input_text = ""
elif self.current_mode == "角色创建":
if self.input_active:
if event.key == pygame.K_RETURN and self.input_text:
self.player_name = self.input_text
self.input_active = False
self.input_text = ""
elif event.key == pygame.K_BACKSPACE:
self.input_text = self.input_text[:-1]
elif event.unicode.isprintable() and len(self.input_text) < 15:
self.input_text += event.unicode
else:
if event.key in [pygame.K_1, pygame.K_2, pygame.K_3]:
classes = ["耐力小子", "弹跳小子", "肌肉小子"]
class_index = event.key - pygame.K_1
self.create_player(self.player_name, classes[class_index])
if len(self.players) < self.player_count:
self.input_active = True
self.input_prompt = f"请输入玩家{len(self.players) + 1}的名称:"
else:
ai_classes = ["耐力小子", "弹跳小子", "肌肉小子"]
ai_names = ["AI1", "AI2", "AI3"]
for i in range(self.player_count, 3):
ai_class = random.choice(ai_classes)
self.create_player(ai_names[i], ai_class, is_ai=True)
self.init_game()
self.current_mode = "竞技模式"
elif self.current_mode == "竞技模式":
current_player = self.get_current_player()
if current_player.is_ai:
return
if self.rps_active:
if event.key in [pygame.K_1, pygame.K_2, pygame.K_3] and current_player not in self.rps_choices:
choice = event.key - pygame.K_0
self.process_rps_choice(current_player, choice)
else:
if event.key == pygame.K_UP:
self.move_player(current_player, "up")
elif event.key == pygame.K_DOWN:
self.move_player(current_player, "down")
elif event.key == pygame.K_LEFT:
self.move_player(current_player, "left")
elif event.key == pygame.K_RIGHT:
self.move_player(current_player, "right")
elif event.key == pygame.K_SPACE and current_player.energy <= 0:
self.play_rps()
elif event.key == pygame.K_RETURN:
self.next_player()
elif self.current_mode == "游戏结束":
if event.key == pygame.K_r:
self.reset_game()
elif event.key == pygame.K_q:
pygame.quit()
sys.exit()
elif event.type == pygame.VIDEORESIZE:
self.update_screen_size(event.w, event.h)
def reset_game(self):
self.__init__()
self.current_mode = "主菜单"
self.add_message("游戏已重置")
def main():
game = Game()
running = True
ai_last_action_time = 0
while running:
current_time = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
game.handle_input(event)
if game.current_mode == "竞技模式" and not game.rps_active and current_time - ai_last_action_time > 1000: # 1秒延迟
current_player = game.get_current_player()
if current_player and current_player.is_ai:
game.ai_make_decision(current_player)
game.next_player()
ai_last_action_time = current_time
game.draw()
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
最新发布