我一直用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";
}
每当我执行代码时,它都说“你遇到了一个missno!”。我希望它返回名称并打破方法,返回到场景的方法。我在最后放了一个return "missingno";
,因为Studio会给我一个错误,并非所有代码路径都返回一个值。
答案 0 :(得分:10)
Random.Next()
(没有参数)将返回一个随机的非负整数。你可能想把它限制在一定范围内,如下所示:
int pokemonChosen = random.Next(1, 4);
另请注意,只需在if
- 块中返回一个常量,就可以使代码更清晰:
if (pokemonChosen == 1)
{
return "Pidgey";
}
甚至更好,将随机选项封装在一个数组中。这样你就可以完全摆脱所有if
- 块:
var options = new [] { "Pidgey", "Charmander", "Geodude" };
int pokemonChosen = random.Next(options.Length); // array indexes start at 0
return options[pokemonChosen];
答案 1 :(得分:10)
问题是你的random.Next()
调用在随机范围内的任何地方返回一个数字 - 你需要一个只返回1,2或3的random.Next()的替代版本,或者你需要自己动手。请尝试这样做:int pokemonChosen = random.Next(1, 4)
(下限是包含的,而上限是独占的)
答案 2 :(得分:9)
通过我自己的基于口袋妖怪的游戏试验找到的一个很好的方法就是将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。键入较短,并且通过主要游戏看,通常被接受。并不是说玩家会阅读你的代码。答案 3 :(得分:7)
让我们从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();
但是,您可能希望在3
中选择比random.Next() % 3
更高的数字,否则永远不会返回"missingno"
。
答案 4 :(得分:4)
您需要指定random.Next()
的上限:
int pokemonChosen = random.Next(4);
将返回0 - 3范围内的整数。
要让它返回1-4,你可以使用:
int pokemonChosen = random.Next(1, 5);
答案 5 :(得分:3)
您需要指定随机值的范围:
int pokemonChosen = random.Next(3) + 1;
否则,值的范围最多为Int32.MaxValue,这为您提供了大约十亿分之一的概率。
答案 6 :(得分:3)
Random.next()
将返回介于0和2,147,483,647(= Integer.MaxValue)之间的值,因此您的数字为1,2或3的可能性很小,这通常会返回最后一个值。您需要限制值:
random.Next(1, 4);
答案 7 :(得分:3)
每次调用时都不应重新创建 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";
}
答案 8 :(得分:2)
您获得的值不是1, 2, or 3
,请调试它,并检查 pokemon选择的值是多少。您可能希望将随机val的最大值限制为3
int pokemonChosen = random.Next(4);
答案 9 :(得分:2)
int pokemonChosen = random.Next(1, 4);
更新:嘿,在你原来的问题中改变那条线的方法,当我打开它时你有int pokemonChosen = random.Next(1,3);在那里...