簡體   English   中英

返回if語句

[英]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) == 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();

但是,您可能希望在random.Next() % 3選擇大於3random.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM