[英]Return in if statement
我一直在用C#编写文本冒险游戏。 我想做一个遇到宠物小精灵的场景。 我想遇到3个随机的宠物小精灵,并且我做了一个方法,可以返回找到的宠物小精灵的名字。 代码是:
public string choosePokemon()
{
Random random = new Random();
int pokemonChosen = random.Next();
if (pokemonChosen == 1)
{
string pokemon = "Pidgey";
return pokemon;
}
if (pokemonChosen == 2)
{
string pokemon = "Charmander";
return pokemon;
}
if (pokemonChosen == 3)
{
string pokemon = "Geodude";
return pokemon;
}
return "missingno";
}
每当我执行代码时,它都会说“您遇到了失落的人!”。 我希望它返回名称并中断方法,返回场景的方法。 我把return "missingno";
作为return "missingno";
最后,因为Studio会给我一个错误,即并非所有代码路径都返回一个值。
Random.Next()
(不带参数)将返回一个随机的非负整数。 您可能打算将其限制在一定范围内,如下所示:
int pokemonChosen = random.Next(1, 4);
还要注意,您可以通过仅在if
-block内部返回一个常量来使代码更加简洁:
if (pokemonChosen == 1)
{
return "Pidgey";
}
甚至更好的是,将随机选项封装在数组中。 这样,您可以完全摆脱所有if
-blocks:
var options = new [] { "Pidgey", "Charmander", "Geodude" };
int pokemonChosen = random.Next(options.Length); // array indexes start at 0
return options[pokemonChosen];
问题是您的random.Next()
调用将在random范围内的任何地方返回数字-您需要random.Next()的替代版本,该版本仅返回1、2或3,或者您需要自己执行。 改为尝试执行以下操作: int pokemonChosen = random.Next(1, 4)
(下限为包含性,上限为排除性)
正如我在基于自己的Pokemon游戏的试验中发现的那样,执行此操作的一种好方法是将New Random()
放在函数之外。 另外,如果您在游戏的不同部分使用不同的Pokemon选项,也可以在函数外部实例化字符串。 这样,您无需返回任何内容,只需调用函数然后使用字符串即可。 假设您正在基于带有故事输出标签的窗口进行操作:
Random random = new Random();
string pokemon;
public void choosePokemon()
{
int pokemonChosen = random.Next(2);
if (pokemonChosen == 0) {
pokemon = "Pidgey";
}
if (pokemonChosen == 1) {
pokemon = "Charmander";
}
if (pokemonChosen == 2) {
pokemon = "Geodude";
}
}
lblStory.Text += "You encountered a wild " + pokemon + "!";
我为朋友制作的游戏做了类似的事情。
编辑:另外,我在游戏中做的其他事情是将变量名称中的神奇宝贝缩短为pkmn。 从主要游戏中可以看出,字体较短,通常被接受。 并不是说玩家会读你的代码。
让我们从Random
数生成器开始。 为了有效,您只应实例化Random
一次。 为此,您可以为该类创建一个静态实例。 如果不这样做,则每次调用random.Next()
时都可以取回相同的数字。
public class PokemonChooser
{
private static Random random = new Random();
public static string ChoosePokemon() { ... }
}
然后,我们需要认识到random.Next()
返回任何非负integer
数值,而不仅仅是您想要的值。 因此,我们需要将结果四舍五入为对您的案例有用的东西。 由于您有3个要随机选择的项目,因此我们可以使用模运算符( %
)对其进行四舍五入,基本上可以得到除法运算的其余部分( /
)。 例如: (int)(5 / 2) == 2
和5 % 2 == 1
。
var pokemonChosen = random.Next() % 3;
接下来,由于此结果是从零开始的,因此我们需要在if
语句中加以说明。
if (pokemonChosen == 0)
{
string pokemon = "Pidgey";
return pokemon;
}
if (pokemonChosen == 1)
{
string pokemon = "Charmander";
return pokemon;
}
if (pokemonChosen == 2)
{
string pokemon = "Geodude";
return pokemon;
}
由于口袋妖怪的名字很明显,我们可以摆脱pokemon
变量而不会失去任何可读性。
if (pokemonChosen == 0)
{
return "Pidgey";
}
if (pokemonChosen == 1)
{
return "Charmander";
}
if (pokemonChosen == 2)
{
return "Geodude";
}
通过使用case
语句而不是多个if
语句,我们可以使这一点更清楚,更短。
switch (pokemonChosen) {
case (0): return "Pidgey";
case (1): return "Charmander";
case (2): return "Geodude";
}
而且由于我们无法通过数字找到口袋妖怪,因此我们只返回"missingno"
,因此我们可以使用默认情况:
switch (pokemonChosen) {
case (0): return "Pidgey";
case (1): return "Charmander";
case (2): return "Geodude";
default: return "missingno";
}
总而言之,我们最终得到:
public class PokemonChooser
{
private static Random random = new Random();
public static string ChoosePokemon()
{
var pokemonChosen = random.Next() % 3;
switch (pokemonChosen) {
case (0): return "Pidgey";
case (1): return "Charmander";
case (2): return "Geodude";
default: return "missingno";
}
}
}
我们这样使用它:
var pokemon = PokemonChooser.ChoosePokemon();
但是,您可能希望在random.Next() % 3
选择大于3
的random.Next() % 3
,否则,将永远不会返回"missingno"
。
您需要指定random.Next()
的上限:
int pokemonChosen = random.Next(4);
将返回范围为0-3的整数。
要使其返回1-4,可以使用:
int pokemonChosen = random.Next(1, 5);
您需要指定随机值的范围:
int pokemonChosen = random.Next(3) + 1;
否则,值的范围最大为Int32.MaxValue,这为您提供介于1-4之间的十亿分之一的机会。
Random.next()
将返回0到2,147,483,647(= Integer.MaxValue)之间的值,因此您的数字为1,2或3的可能性很小,这通常会返回最后一个值。 您需要限制该值:
random.Next(1, 4);
您不应该在每次调用时都重新创建 Random类。 然后像这样调用它: _random.Next(3) + 1
Random _random = new Random();
public string choosePokemon()
{
int pokemonChosen = _random.Next(3) + 1;
if (pokemonChosen == 1)
{
string pokemon = "Pidgey";
return pokemon;
}
if (pokemonChosen == 2)
{
string pokemon = "Charmander";
return pokemon;
}
if (pokemonChosen == 3)
{
string pokemon = "Geodude";
return pokemon;
}
return "missingno";
}
您获取的值不是1, 2, or 3
,请对其进行调试并检查pokemonChosen的值是什么。 您可能希望将随机值的最大值限制为3
int pokemonChosen = random.Next(4);
经过测试,您的代码可以正常工作-不确定您实际使用的代码是什么,您始终可以正确使用的确切方法。 但是,您应该将其更改为
int pokemonChosen = random.Next(1, 4);
Upd:嘿,要更改原始问题的方法,当我打开它时,您有int pokemonChosen = random.Next(1,3); 在那里...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.