3

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";すべてのコード パスが値を返すとは限らないというエラーが Studio から返されるため、末尾に a を付けました。

4

10 に答える 10

10

Random.Next()(パラメーターなし) は、ランダムな負でない整数を返します。おそらく、次のように、特定の範囲に制限するつもりでした。

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

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()呼び出しが random の範囲内のどこかの数値を返すことです - 1、2、または 3 のみを返す random.Next() の代替バージョンが必要です。または、それを自分で実行する必要があります。代わりにこれを試してください: int pokemonChosen = random.Next(1, 4)(下限は包括的ですが、上限は排他的です)

于 2013-10-04T21:20:40.677 に答える
8

Randomナンバージェネレーターから始めましょう。有効にするには、インスタンス化Randomを 1 回だけ行う必要があります。これを行うには、クラスの静的インスタンスを作成します。そうしないと、電話をかけるたびに同じ番号が返される可能性があります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"

于 2013-10-04T21:37:12.387 に答える
3

ランダム値の範囲を指定する必要があります。

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

それ以外の場合、値の範囲は最大 Int32.MaxValue であり、1 ~ 4 の間である確率は 10 億分の 1 です。

于 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 に答える
2

テストすると、コードは正しく動作します - 実際に使用したコードがわからない場合、常に正しく動作する正確な方法です。ただし、次のように変更する必要があります

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

Upd:ねえ、あなたの元の質問でその行を変更する方法、私がそれを開いたとき、あなたは int pokemonChosen = random.Next(1, 3); を持っていました そこで...

于 2013-10-04T21:27:52.970 に答える