You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:55:29