Files
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

155 lines
4.5 KiB
Python

"""
TestGame 示例游戏
用于测试引擎的简单猜数字游戏
"""
import random
from typing import Dict, List, Optional, Any
from .game_base import GameBase, GamePhase
class TestGame(GameBase):
"""
猜数字游戏
用于测试引擎的简单游戏
- 系统随机生成 1-100 的数字
- 玩家轮流猜数字
- 系统提示大了/小了/对了
- 猜中者获胜
"""
def __init__(self, room_id: str, game_type: str):
super().__init__(room_id, game_type)
self.target_number: Optional[int] = None
self.min_guess = 1
self.max_guess = 100
self.guesses: Dict[str, List[int]] = {} # player_id -> guesses
@property
def min_players(self) -> int:
return 1
@property
def max_players(self) -> int:
return 4
def can_start(self) -> bool:
return self.player_count >= self.min_players
def start(self):
"""开始游戏"""
if not self.can_start():
raise ValueError("玩家不足")
# 生成目标数字
self.target_number = random.randint(self.min_guess, self.max_guess)
# 初始化玩家猜测记录
for player_id in self.players:
self.guesses[player_id] = []
# 设置第一个玩家
if self.player_order:
self.state.next_turn(self.player_order[0])
self.state.start()
self.is_started = True
# 更新游戏状态数据
self.state.data = {
'min': self.min_guess,
'max': self.max_guess,
'target': self.target_number, # 只有服务端知道
}
def handle_action(self, player_id: str, action: str, data: Dict) -> Dict[str, Any]:
"""处理玩家操作"""
# 检查是否是当前玩家回合
if self.state.current_turn_player_id != player_id:
return {
'success': False,
'message': '不是你的回合'
}
if action != 'guess':
return {
'success': False,
'message': f'无效的操作: {action}'
}
# 获取猜测的数字
guess = data.get('number')
if not isinstance(guess, int) or guess < self.min_guess or guess > self.max_guess:
return {
'success': False,
'message': f'请输入 {self.min_guess}-{self.max_guess} 之间的整数'
}
# 记录猜测
self.guesses[player_id].append(guess)
# 判断结果
if guess == self.target_number:
# 猜中了
self.state.data['last_result'] = {
'player_id': player_id,
'guess': guess,
'result': 'correct'
}
self.end_game(player_id)
return {
'success': True,
'message': f'恭喜!{guess} 是正确的数字!',
'result': 'correct',
'winner': player_id
}
elif guess < self.target_number:
result = 'too_small'
message = f'{guess} 太小了'
else:
result = 'too_large'
message = f'{guess} 太大了'
self.state.data['last_result'] = {
'player_id': player_id,
'guess': guess,
'result': result
}
# 记录历史
self.state.add_history('guess', player_id, {'guess': guess, 'result': result})
# 切换到下一个玩家
self.next_player()
return {
'success': True,
'message': message,
'result': result,
'next_turn': self.state.current_turn_player_id
}
def get_valid_actions(self, player_id: str) -> List[str]:
"""获取可用操作"""
if self.state.current_turn_player_id != player_id:
return []
return ['guess']
def check_winner(self) -> Optional[str]:
"""检查获胜者"""
return self.state.winner_id
def to_dict(self) -> Dict[str, Any]:
"""序列化游戏状态"""
data = super().to_dict()
# 添加游戏特定数据(隐藏目标数字)
client_data = dict(self.state.data)
client_data.pop('target', None) # 客户端看不到目标数字
data['state']['data'] = client_data
data['guesses'] = self.guesses
return data