家庭作业:我正在设计一个刽子手游戏。
我有一个数组(名为wordToGuess[]
),表示需要猜测的单词。我将它与该单词的蒙版副本进行比较,(名为displayString[]
- 我知道为了清晰起见我仍然要重命名)。例如,如果wordToGuess[]
为[S][T][A][C][K]
,则displayString[]
会初始化为[*][*][*][*][*]
。当用户猜到一个字母时,我想迭代遍历数组的每个字符,如果匹配则将*
替换为字母猜测。如果我猜A
(这是变量letterGuess
),例如,A
将与数组的每个元素进行比较。如果匹配,则该元素将更改为[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
的错误消息。
我最初认为这是一个范围问题,但评论者解释说不是......
所以...如果我的回归范围,导致错误的原因是什么?我错过了什么?
答案 0 :(得分: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'
}
答案 1 :(得分:2)
你真正想做的是返回一个布尔值,以便知道是否添加到你的刽子手。
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*"
如果您不理解某些语法,请不要担心:它只是设置一个快速测试,您可以将其放入控制台项目的主要功能中,以表明这是有效的。
作为免责声明,为了最终对函数参数语义有正确的理解,我需要再次提醒您,传递引用类型会在函数内部生成 new 变量。这意味着您在更改变量的属性(包括索引)时正在更改原始属性,但如果分配给变量本身,则表示变量指向不同的对象,并且原始变量不再受影响。这是一个简单的例子:
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声明为结构而不是类,这将使它成为一个值类型。如果你这样做,示例代码的输出将是原始的空字符串。另外,原因是学术性的,但你永远不应该设计一个具有你可以在构造后改变的属性的结构。如果类型包含可以变异的数据,则总是更喜欢类。