3

我一直在用 C# 编写文本冒险游戏。我想做一个你遇到口袋妖怪的场景。我想遇到 3 个随机的 pokemon,我做了一个方法来返回你找到的 pokemon 的名称。代码是:

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";  
} 

每当我执行代码时,它都会显示“你遇到了一个missingno!”。我希望它返回名称并打破方法,返回场景的方法。我把 areturn "missingno";放在最后是因为 Studio 会给我一个错误,即并非所有代码路径都返回一个值。

4

10 回答 10

10

Random.Next()(没有参数)将返回一个随机的非负整数。您可能打算将其限制在一定范围内,如下所示:

int pokemonChosen = random.Next(1, 4);

另请注意,您可以通过在 -block 中返回一个常量来使代码更if简洁,如下所示:

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];
于 2013-10-04T21:20:19.720 回答
10

问题是您的random.Next()调用返回随机范围内的任何数字 - 您需要一个仅返回 1、2 或 3 的 random.Next() 替代版本,或者您需要自己执行。尝试这样做:(int pokemonChosen = random.Next(1, 4)下限是包容性的,而上限是排斥性的)

于 2013-10-04T21:20:40.677 回答
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 + "!";

我为朋友制作的游戏做了非常相似的事情。

编辑:另外,我在游戏中所做的其他事情是将变量名称中的 pokemon 缩短为 pkmn。打字更短,从主要游戏中可以看出,普遍接受。并不是说玩家会阅读您的代码。

于 2013-10-04T21:40:05.497 回答
8

让我们从Random数字生成器开始。为了有效,您应该只实例化Random一次。为此,您可以为该类创建一个静态实例。如果您不这样做,则每次拨打电话时都可能会收到相同的号码random.Next()

public class PokemonChooser
{
    private static Random random = new Random();

    public static string ChoosePokemon() { ... }
}

然后,我们需要意识到random.Next()返回任何非负值integer,而不仅仅是您想要的值。因此,我们需要将结果四舍五入到对您的情况有用的值。由于您有 3 个项目要从中随机选择,我们可以使用模运算符 ( %) 对其进行舍入,这基本上为您提供了除法运算的余数 ( /)。例如:(int)(5 / 2) == 25 % 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();

但是,您可能希望选择比3in更高的数字random.Next() % 3,否则"missingno"将永远不会返回。

于 2013-10-04T21:37:12.387 回答
4

您需要为 指定上限random.Next()

int pokemonChosen = random.Next(4);

将返回 0 - 3 范围内的整数。

要让它返回 1-4,您可以使用:

int pokemonChosen = random.Next(1, 5);
于 2013-10-04T21:21:01.520 回答
3

您需要指定随机值的范围:

int pokemonChosen = random.Next(3) + 1;

否则,值的范围最大为 Int32.MaxValue,这使您有十亿分之一的机会介于 1-4 之间。

于 2013-10-04T21:20:05.190 回答
3

Random.next()将返回一个介于 0 和 2,147,483,647(= Integer.MaxValue)之间的值,因此您的数字为 1,2 或 3 的可能性很小,这通常是返回最后一个值的方式。您需要限制值:

random.Next(1, 4);
于 2013-10-04T21:20:58.303 回答
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";  
} 
于 2013-10-04T21:22:19.530 回答
2

您正在获取除 之外的值1, 2, or 3,对其进行调试并检查pokemonChosen的值是什么。您可能希望将随机 val 的最大值限制为 3

int pokemonChosen = random.Next(4);
于 2013-10-04T21:22:38.920 回答
2

经过测试,您的代码可以正常工作 - 不确定您实际使用了什么代码,您始终可以正常工作的确切方法。但是,您应该将其更改为

int pokemonChosen = random.Next(1, 4);  

更新:嘿,要改变你原来问题中的那一行,当我打开它时,你有 int pokemonChosen = random.Next(1, 3); 在那里...

于 2013-10-04T21:27:52.970 回答