[英]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.