0

家庭作业:我正在设计一个刽子手游戏。

我有一个数组(名为wordToGuess[]),表示需要猜测的单词。我将它与那个词的蒙面副本进行比较,(命名displayString[]- 我知道为了清楚起见我仍然要重命名)。wordToGuess[]例如,如果是[S][T][A][C][K]displayString[]则初始化为[*][*][*][*][*]。当用户猜测一个字母时,我想遍历数组的每个字符,*如果匹配,则用字母猜测替换。例如,如果我猜A(这是变量letterGuessA与数组的每个元素进行比较。如果匹配,则该元素更改为[A]。如果不匹配,则元素保留[*]. 在这种特殊情况下,最终结果应该是一个填充有[*][*][A][*][*].

  public char[] drawProgress(char letterGuess, char[] wordToGuess, char[] displayString)
    {
        for (int a = 0; a < wordToGuess.Length; a++)
        {
            if (wordToGuess[a] == letterGuess)
            {
                displayString[a] = letterGuess;
            }
            return displayString;
        }
    }

编辑: 这是我的问题:循环的开头for被标记为unreachable code,我收到一条错误消息,即Error 4 'assn5.PromptForLetter.drawProgress(char, char[], char[])': not all code paths return a value.

我最初认为这是一个范围问题,但评论者另有解释......

所以......如果我的回报在范围内,是什么导致了错误?我错过了什么?

4

2 回答 2

2
    public char[] drawProgress(char letterGuess, char[] wordToGuess, char[] displayString)
    {
        for (int a = 0; a < wordToGuess.Length; a++)
        {
            if (wordToGuess[a] == letterGuess)
            {
                displayString[a] = letterGuess;
            }
        }
        return displayString;
    }

通过以下方式调用它:

 var output = drawProgress('O', new char[4] { 'S', 'O', 'B', 'O' }, new char[4] { '*', '*', '*', '*'});

output将是 { '*', 'O', '*', 'O'}

于 2013-04-11T02:43:54.573 回答
2

.Net 中的数组是引用类型。当您将引用类型传递给函数时,您会在函数中获得一个新变量,但它引用的是内存中的同一个对象。这意味着你不必返回任何东西......你传递给函数的原始值将在最后保持正确的值。

你真正想要做的是返回一个布尔值,这样你就知道是否添加到你的刽子手。

public bool checkProgress(char letterGuess, char[] wordToGuess, char[] displayString)
{
    bool result = false;
    for (int a = 0; a < wordToGuess.Length; a++)
    {
        if (wordToGuess[a] == letterGuess)
        {
            displayString[a] = letterGuess;
            result = true;
        }
    }
    return result;
}

.

var word = "hello world".ToCharArray();
var mask = word.Select(c => c==' '?' ':'*').ToArray();

Console.WriteLine(checkProgress('l', word, mask)); // will output "true"
Console.WriteLine(checkProgress('z', word, mask)); // will output "false"
Console.WriteLine(new string(mask)); // will output "**ll* ***l*"

如果您不了解其中的某些语法,请不要担心:这只是为了设置一个快速测试,您可以将其粘贴到控制台项目的主要功能中以证明它有效。

作为免责声明,为了让您最终对函数参数语义有一个正确的理解,我需要再次提醒您,传递引用类型会在函数内部产生一个变量。这意味着您在更改变量的属性(包括索引)时正在更改原始属性,但是如果您分配给变量本身,则您是在告诉变量指向不同的对象,并且原始对象不再受到影响。这是一个简单的例子:

public class Foo
{
    public string text;
}

public void Test(Foo bar)
{
    bar.text = "hello";
    bar = new Foo(); //assigned to variable: it now referrs to a different object. original remains unchanged
    bar.text = "world";
}

var bar = new Foo();
bar.text= "";
Test(bar);
Console.WriteLine(bar.text); // will output "hello"

如果您将 Foo 声明为结构而不是类,这将完全打开它的头,这将使其成为值类型。如果您这样做,示例代码的输出将是原始的空字符串。顺便说一句,原因是学术性的,但你永远不应该设计一个具有可以在构造后更改的属性的结构。如果该类型具有可以变异的数据,则始终更喜欢一个类。

于 2013-04-11T02:45:59.820 回答