Initial commit: 网页联机狼人杀(FastAPI+WebSocket 后端 / React+TS+Sass 前端)
This commit is contained in:
commit
7f5ea6bee8
55 files changed
+6999
No files matched your search
@@ -0,0 +1,38 @@
|
||||
"""玩家实体:人类(持 WebSocket 连接)或 AI。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import secrets
|
||||
|
||||
from fastapi import WebSocket
|
||||
|
||||
from .roles import Role
|
||||
|
||||
|
||||
class Player:
|
||||
def __init__(self, seat: int, name: str, is_ai: bool = False) -> None:
|
||||
self.seat = seat
|
||||
self.name = name
|
||||
self.is_ai = is_ai
|
||||
self.token = secrets.token_hex(8)
|
||||
self.role: Role | None = None
|
||||
self.alive = True
|
||||
self.ws: WebSocket | None = None # AI 恒为 None
|
||||
self.speaking = False # 当前正在发言(仅用于 UI 高亮)
|
||||
self.persona: str = "" # AI 性格(LLM 提示词用)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
@property
|
||||
def connected(self) -> bool:
|
||||
return self.is_ai or self.ws is not None
|
||||
|
||||
def bind_ws(self, ws: WebSocket) -> None:
|
||||
self.ws = ws
|
||||
|
||||
def unbind_ws(self, ws: WebSocket) -> None:
|
||||
if self.ws is ws:
|
||||
self.ws = None
|
||||
|
||||
def reset_for_new_game(self, role: Role) -> None:
|
||||
self.role = role
|
||||
self.alive = True
|
||||
self.speaking = False
|
||||
Reference in new issue
Block a user