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

多人扫雷游戏玩家分数无法正常显示问题求助

解决多人扫雷游戏分数显示异常问题

问题回顾

你在开发多人扫雷游戏时碰到了一个有点坑的UI显示问题:

  • 已经定义了包含name和score属性的Player类
  • 每个客户端连接时会启动新线程执行HandleClient方法
  • 在方法末尾通过BeginInvoke遍历players集合更新label8的文本内容
  • 结果UI上只显示玩家的name,后面的: 和score完全看不到
  • 调试确认p.score是有有效值的,即使去掉ToString()也没有报错
  • 最终排查出根因:玩家的name字符串里藏了大量\0(空字符)

为什么会出现这种情况?

字符串里的\0是空字符,在Windows Forms、WPF这类UI框架的文本控件里,它会被当作字符串结束标记——控件只会渲染\0之前的内容,后面的: {score}部分直接被截断了,所以看起来就只显示了name。

解决方法

只需要在使用name之前,清理掉其中的空字符就行,这里给你几种实用方案:

1. 拼接显示文本时临时清理

在生成要显示的字符串前,先对name做处理:

// 去掉末尾的所有空字符(最常用)
var cleanedName = p.name.TrimEnd('\0');
// 如果name中间也有空字符,用这个去掉所有位置的空字符
// var cleanedName = new string(p.name.Where(c => c != '\0').ToArray());
// 再拼接成完整的显示文本
label8.Text = string.Join(Environment.NewLine, players.Select(p => $"{cleanedName}: {p.score}"));

2. 在Player类中提前处理(推荐)

从源头保证存储的name没有多余空字符,修改Player类的name属性:

public class Player
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            // 处理null值,同时去掉所有空字符
            if (string.IsNullOrEmpty(value))
            {
                _name = string.Empty;
                return;
            }
            _name = new string(value.Where(c => c != '\0').ToArray());
        }
    }
    public int Score { get; set; }
}

额外排查小技巧

以后再遇到类似的文本截断问题,可以通过输出字符串的原始字节来验证是否有不可见字符:

// 输出name的字节码,查看是否有大量00(对应\0)
Debug.WriteLine($"Raw name bytes: {BitConverter.ToString(Encoding.UTF8.GetBytes(p.name))}");

内容的提问来源于stack exchange,提问作者Miko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:27:32