SSH多会话TUI卡牌游戏:如何实现终端专属输出与指定会话输入?
实现SSH多终端TUI卡牌游戏的方案
一、给终端分配ID并实现针对性输出
每个SSH会话对应一个独立的TTY设备文件(路径通常为/dev/pts/X,X为数字),这就是天然的终端唯一标识,可替代你示例中的SSHid_1这类ID。
1. 获取终端ID
在代码里直接获取当前会话的TTY路径即可:
- Python:使用
os.ttyname(0) - C/C++:使用
ttyname(STDIN_FILENO)
你可以维护一个字典,将TTY路径与玩家手牌、状态绑定,比如:
players = { "/dev/pts/0": {"hand": ["红桃A", "方块2"], "name": "玩家1"}, "/dev/pts/1": {"hand": ["黑桃3", "梅花4"], "name": "玩家2"} }
2. 向特定终端输出内容
直接打开目标TTY设备文件写入,结合ANSI转义序列控制终端显示(清屏、光标定位),避免输出混乱:
import os def update_player_view(tty_path, hand, table_cards): with open(tty_path, "w") as tty: # 清屏并将光标移到左上角 tty.write("\033[2J\033[H") # 打印桌面状态 tty.write("=== 当前桌面 ===\n") for card in table_cards: tty.write(f" {card}\n") # 打印玩家专属手牌 tty.write("\n=== 你的手牌 ===\n") for idx, card in enumerate(hand): tty.write(f"{idx+1}. {card}\n") tty.flush() # 确保内容立刻输出到终端
当桌面更新时,遍历所有玩家的TTY路径调用这个函数,就能让每个玩家看到最新桌面+自己的手牌。
二、从特定SSH会话获取输入
可以用多路复用工具(比如Python的select模块,C/C++的select/poll)同时监听多个终端的输入,实现从特定会话获取指令:
import select def listen_player_inputs(players, table_cards): # 打开所有玩家的TTY文件用于读取 tty_streams = [open(path, "r") for path in players.keys()] while True: # 监听可读的终端流 readable, _, _ = select.select(tty_streams, [], []) for stream in readable: tty_path = stream.name # 读取玩家输入(这里假设玩家输入出牌序号) input_line = stream.readline().strip() if input_line.isdigit(): card_idx = int(input_line) - 1 if 0 <= card_idx < len(players[tty_path]["hand"]): # 取出选中的牌,更新桌面 played_card = players[tty_path]["hand"].pop(card_idx) table_cards.append(played_card) # 更新所有玩家的视图 for p_tty, p_data in players.items(): update_player_view(p_tty, p_data["hand"], table_cards)
额外注意事项
- 权限问题:确保运行游戏程序的用户有读写TTY设备的权限(一般SSH登录用户默认拥有对应TTY的权限)。
- 玩家上下线:可以做简单的注册逻辑(比如新玩家连接后输入命令加入游戏),或者定期扫描
/dev/pts目录下的活跃设备来维护玩家列表。 - 终端兼容性:ANSI转义序列在大多数SSH终端(如xterm、iTerm2)都支持,但如果遇到特殊终端可能需要调整显示逻辑。
内容的提问来源于stack exchange,提问作者Chems
相关产品推荐
相关产品推荐

