除非0或10,否则StringBuilder不会在字符串的开头附加int

本文关键字:字符串 开头 int StringBuilder 否则 除非 | 更新日期: 2023-09-27 18:03:09

我有一个保龄球游戏,它获取碗的列表,然后通过这段代码运行它们,以生成一个字符串,该字符串遍历UI上的帧。如果用户打出排水沟(0)或全中(10),代码将正常工作。但是,如果它在1到9之间,则无法生成字符串。为什么会这样?我已经搜索并尝试了许多其他的方法来做到这一点,但这似乎是唯一的方法,它将工作。

public static StringBuilder FormatRolls (List<int> rolls) {
    StringBuilder output = new StringBuilder();
    for (int i=0; i < rolls.Count; i++) {
        if (rolls.Count >= 19 && rolls[i] == 10) {                                          //Bonus End-Frame Strike
            output.Append ("X");
        } else if (rolls[i] == 0) {                                                         //Gutter
            output.Append ("-");
        } else if (rolls[i-1] + rolls[i] == 10 && rolls.Count > 1) {                                            //Spare
            output.Append ("/");
        } else if (rolls[i] == 10 && rolls[i+1] == 0) {                                     //Strike
            output.Append ("X");
        } else {                                                                            //Normal bowls 1-9
            output.Append (rolls[i].ToString());
        }
    }
    output.ToString();
    return output;
}

这是随后写入所有帧的代码:

public void FillRolls (List<int> rolls) {
    StringBuilder scoresString = FormatRolls(rolls);
    for (int i=0; i<scoresString.Length; i++) {
        frameText[i].text = scoresString[i].ToString();
    }
}

任何帮助都是非常感激的,我已经卡住了几天试图让这个工作…

除非0或10,否则StringBuilder不会在字符串的开头附加int

output.ToString();是一个纯函数,您不使用它的返回值(因此,您正在转换为字符串,然后丢弃该字符串而不使用/存储/返回它)。我猜你真的想要返回完全构建和格式化的字符串,而不是StringBuilder实例。用途:

return output.ToString();

也就是说,其他代码路径也不应该产生值。

在浏览了其他人的所有评论和建议后,我删除了阻止我查看捕获错误的try-catch部分。然后,添加debug.log语句来帮助找到正确的位置,并使用Unity的内置错误来发现这根本不是字符串的错误。它试图找到一个不存在的索引rolls[i]-1。经过几次尝试后,我发现如果我将else if (rolls[i-1] + rolls[i] == 10 && rolls.Count > 1)更改为嵌套的if语句并使用output.Length而不是rolls.Count,它将不再返回错误。谢谢大家谁试图帮助我解决这个问题,你指出了我在正确的方向,真的让我思考!下面是完成后的代码:

public static string FormatRolls (List<int> rolls) { StringBuilder output = new StringBuilder();

    for (int i=0; i < rolls.Count; i++) {
        if (rolls.Count >= 19 && rolls[i] == 10) {                                          //Bonus End-Frame Strike
            output.Append ("X");
        } else if (rolls[i] == 0) {                                                         //Gutter
            output.Append ("-");
        } else if (rolls[i] == 10 && output.Length % 2 == 0) {                              //Strike
            output.Append (" X");
        } else if (output.Length >= 1 && output.Length % 2 != 0) {                                                  //Spare
            if (rolls[i-1] + rolls[i] == 10) {
                output.Append ("/");
            }
        } else {                                                                            //Normal bowls 1-9
            output.Append (rolls[i]);
        }
    }
    return output.ToString();
}