![](/img/trans.png)
[英]get counter value int from method that return a bool and return to browser
[英]how to return bool value from method
我有一個循環,循環直到bool done = true; 在方法TestMoves()中,根據用戶輸入,該方法將bool作為true或false返回。 但是,我不知道如何在Start()方法中將此值“發送”回while循環以停止循環。 這是我的代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public static void Main(string[] args)
{
Start("r");
}
public static string Start(string move)
{
Console.Write("Welcome to the Shotgun App\nEnter s for single player and m for multiplayer: ");
string gameType = Console.ReadLine();
if (gameType == "s")
{
Console.Write("Single Player Controls:\n r = reload\n s = shield\n f = fire\n ***you start with ammo\n Ready to play?");
Console.ReadLine();
int ammo = 1;
bool done = false;
while (!done)
{
Console.Write("\nEnter your move: ");
move = Console.ReadLine();
switch (move)
{
case "r":
Console.Write("\nYou have reloaded, press enter for Genius\n");
ammo++;
Console.Write("Your ammo is " + ammo);
Console.ReadLine();
string geniusMove = "";
Genius(geniusMove, move, done);
Console.ReadLine();
break;
case "s":
Console.Write("\nYou have shielded, press enter for Genius\n");
Console.Write("Your ammo is " + ammo);
Console.ReadLine();
geniusMove = "";
Genius(geniusMove, move, done);
Console.ReadLine();
break;
case "f":
if (ammo != 0)
{
Console.Write("\nYou have fired, press enter for Genius\n");
ammo--;
Console.Write("Your ammo is " + ammo);
Console.ReadLine();
geniusMove = "";
Genius(geniusMove, move, done);
Console.ReadLine();
}
else
{
Console.Write("You don't have enough ammo, try again");
done = false;
}
break;
default:
Console.Write("\nInvalid move, try again\n");
done = false;
break;
}
}
return move;
}
else
{
return move;
}
}
static string Genius(string geniusMove, string move, bool done)
{
int geniusAmmo = 1;
geniusMove = "r";
if (geniusMove == "f")
{
geniusAmmo--;
Console.Write("Genius had decided to fire.\nGenius ammo is " + geniusAmmo + "\n");
}
else if (geniusMove == "r")
{
geniusAmmo++;
Console.Write("Genius had decided to reload.\nGenius ammo is " + geniusAmmo + "\n");
}
else if (geniusMove == "s")
{
Console.Write("Genius had decided to shield.\nGenius ammo is " + geniusAmmo + "\n");
}
TestMoves(move, geniusMove, done);
return geniusMove;
}
static bool TestMoves(string move, string geniusMove, bool done)
{
if (move == "s" && geniusMove == "f")
{
Console.Write("No one has died yet");
done = false;
return done;
}
else if (move == "f" && geniusMove == "f")
{
Console.Write("You both died! Good game!");
done = true;
return done;
}
else if (move != "s" && geniusMove == "f")
{
Console.Write("You died! Good game!");
done = true;
return done;
}
else if (move == "f" && geniusMove == "s")
{
Console.Write("No one has died yet");
done = false;
return done;
}
else if (move == "f" && geniusMove != "s")
{
Console.Write("Genius died! Good game!");
done = true;
return done;
}
else if (move != "f" && geniusMove != "f")
{
Console.Write("No one has died yet");
done = false;
return done;
}
else
{
return done;
}
}
}
}
你需要從Genius
內部而不是從循環中調用TestMoves
嗎? 在我看來,您的代碼可以像這樣重寫:
//Every instance of:
string geniusMove = "";
Genius(geniusMove, move, done);
Console.ReadLine();
//seems like it could be rewritten as:
string geniusMove = "";
Genius(geniusMove, move, done);
done = TestMoves(geniusMove, move, done);
Console.ReadLine();
//and then you can remove the call to TestMoves from Genius
所有代碼的總體流程對我來說有點混亂。 每個函數都返回一個值,但似乎沒有對返回值執行任何操作。 我有一種感覺,通過一些重構,你可以使這個代碼更短,更合乎邏輯。
在看了你的代碼后,看起來你可以在循環的最后放置對TestMoves的調用:
default:
Console.Write("\nInvalid move, try again\n");
done = false;
break;
}
//add it here:
done = TestMoves(geniusMove, move, done);
}
return move;
您可以通過ref傳遞值:
static string Genius(string geniusMove, string move, ref bool done) ...
並從TestMoves
返回:
static bool TestMoves(string move, string geniusMove) ...
打電話給它:
Genius(geniusMove, move, ref done);
由於bool
是一個值類型,而不是引用類型,因此你無法像這樣通過bool。 使用out
關鍵字明確指定您要將其作為引用傳遞:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.