游戏可以运行

This commit is contained in:
2026-05-24 12:34:49 +08:00
parent 0670598bf4
commit 34ce39930c
12 changed files with 94 additions and 31 deletions

View File

@@ -33,6 +33,7 @@ class Game:
self.player_faction = None
self.ai_faction = None
self.custom_deck = None
self.player_goes_first = True
self._load_custom_deck()
self.custom_deck = None
@@ -112,6 +113,16 @@ class Game:
self.player_faction = fid
self.custom_deck = None
self._load_custom_deck()
self.state = "turn_order"
# --- State: Turn Order ---
def _handle_click_turn_order(self, pos):
if "first" in self.ui.menu_buttons and self.ui.menu_buttons["first"].collidepoint(pos):
self.player_goes_first = True
self.state = "deck_select"
elif "second" in self.ui.menu_buttons and self.ui.menu_buttons["second"].collidepoint(pos):
self.player_goes_first = False
self.state = "deck_select"
# --- State: Deck Select ---
@@ -184,16 +195,30 @@ class Game:
self.ui.deck_builder_cards.remove(cid)
def _start_game(self):
from card_game.config import FIRST_HAND_SIZE, SECOND_HAND_SIZE
self.battlefield = Battlefield(self.player_faction, self.ai_faction)
if self.player_goes_first:
self.battlefield.player.start_game(FIRST_HAND_SIZE)
self.battlefield.ai.start_game(SECOND_HAND_SIZE)
else:
self.battlefield.player.start_game(SECOND_HAND_SIZE)
self.battlefield.ai.start_game(FIRST_HAND_SIZE)
if self.custom_deck:
self.battlefield.player.deck.build(self.custom_deck)
hand_size = FIRST_HAND_SIZE if self.player_goes_first else SECOND_HAND_SIZE
self.battlefield.player.hand = []
for _ in range(4):
for _ in range(hand_size):
self.battlefield.player.draw_card()
self.battlefield.start_game()
self.battlefield.turn_number = 1
self.battlefield.frontline_controller = None
self.battlefield.current_turn = "player"
self.battlefield.player.start_turn(1)
self.ai_player = AIPlayer(self.battlefield)
self.ui.clear_selection()
self.state = "playing"
if self.player_goes_first:
self.state = "playing"
else:
self._start_ai_turn()
# --- State: Playing ---
@@ -267,7 +292,7 @@ class Game:
opponent = self.battlefield.get_opponent(player)
if unit.zone == "support":
if unit.can_attack and not unit.has_attacked:
if unit.can_attack and not unit.has_attacked and player.can_afford_attack(unit):
self.ui.selected_unit = unit
self.ui.target_mode = "attack"
targets = list(opponent.get_frontline_units())
@@ -282,7 +307,7 @@ class Game:
self.ui.selected_unit = unit
self.ui.target_mode = "move"
elif unit.zone == "frontline":
if unit.can_attack and not unit.has_attacked:
if unit.can_attack and not unit.has_attacked and player.can_afford_attack(unit):
self.ui.selected_unit = unit
self.ui.target_mode = "attack"
targets = list(opponent.get_frontline_units())
@@ -417,8 +442,7 @@ class Game:
y = zone_y + ZONE_HEIGHT // 2
else:
x = _frontline_slot_x(unit.slot, n_fl) + FIELD_CARD_WIDTH // 2
zone_y = FRONTLINE_Y if is_ai else (FRONTLINE_Y + half)
y = zone_y + half // 2
y = FRONTLINE_Y + ZONE_HEIGHT // 2
return x, y
try:
@@ -518,6 +542,8 @@ class Game:
def _handle_click(self, pos):
if self.state == "menu":
self._handle_click_menu(pos)
elif self.state == "turn_order":
self._handle_click_turn_order(pos)
elif self.state == "deck_select":
self._handle_click_deck_select(pos)
elif self.state == "deck_build":
@@ -537,6 +563,8 @@ class Game:
def _draw(self):
if self.state == "menu":
self.ui.draw_menu()
elif self.state == "turn_order":
self.ui.draw_turn_order(self.player_faction)
elif self.state == "deck_select":
self.ui.draw_deck_select(self.player_faction)
elif self.state == "deck_build":