End while while循环
我写了一个小型Shotgun应用程序,然而,当AI(称为Genius),用户或两者都被拍摄时,需要停止游戏的代码段,我无法工作。我究竟做错了什么?我觉得我通过增加大量不同的布尔值返回来使得我的代码过度复杂,其中一些是通过的,而另一些则不是。End while while循环
在测试中,无论用户移动(称为“字符串移动”)等于“f”,循环都会结束。在任何其他情况下,我无法让循环结束。
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\nYou start with 1 ammo\nReady to play?");
Console.ReadLine();
int ammo = 1;
int geniusAmmo = 1;
string geniusMove = "";
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();
Genius(geniusMove, move, geniusAmmo, done);
break;
case "s":
Console.Write("\nYou have shielded, press enter for Genius\n");
Console.Write("Your ammo is " + ammo);
Console.ReadLine();
Genius(geniusMove, move, geniusAmmo, done);
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();
Genius(geniusMove, move, geniusAmmo, done);
}
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;
}
done = EndLoop(move, geniusMove, done);
Console.ReadLine();
}
return move;
}
else
{
return move;
}
}
public static string Genius(string geniusMove, string move, int geniusAmmo, bool done)
{
Random RandomNumber = new Random();
int x = RandomNumber.Next(0,3);
if (x == 0)
{
geniusMove = "f";
geniusAmmo--;
Console.Write("Genius had decided to fire.\nGenius ammo is " + geniusAmmo + "\n");
TestMoves(move, geniusMove);
}
else if (x == 1)
{
geniusMove = "r";
geniusAmmo++;
Console.Write("Genius had decided to reload.\nGenius ammo is " + geniusAmmo + "\n");
TestMoves(move, geniusMove);
}
else if (x == 2)
{
geniusMove = "s";
Console.Write("Genius had decided to shield.\nGenius ammo is " + geniusAmmo + "\n");
TestMoves(move, geniusMove);
}
return geniusMove;
}
public static void TestMoves(string move, string geniusMove)
{
bool done = false;
if (move == "s" && geniusMove == "f")
{
Console.Write("Nice shield, no one has died yet");
}
else if (move == "f" && geniusMove == "f")
{
Console.Write("You both died! Good game!");
}
else if (move == "r" && geniusMove == "f")
{
Console.Write("No shield!? You died! Good game!");
}
else if (move == "f" && geniusMove == "s")
{
Console.Write("Genius is too good, no one has died yet");
}
else if (move == "f" && geniusMove != "s")
{
Console.Write("Genius let his guard down! Good game!");
}
else if (move != "f" && geniusMove != "f")
{
Console.Write("Keep playing it safe.");
}
else
{
}
}
static bool EndLoop(string move, string geniusMove, bool done)
{
done = false;
if (move == "s" && geniusMove == "f")
{
return false;
}
else if (move == "f" && geniusMove == "f")
{
return true;
}
else if (move != "s" && geniusMove == "f")
{
return true;
}
else if (move == "f" && geniusMove == "s")
{
return false;
}
else if (move == "f" && geniusMove != "s")
{
return true;
}
else if (move != "f" && geniusMove != "f")
{
return false;
}
else
{
return done;
}
}
}
}
要设置在几个不同的地方done
,无论是在开关情况下,一些执行分支,并呼吁ENDLOOP时。来自EndLoop的作业将覆盖以前的任务,因此请设置“您设置的一个地方”done
。
在TestMoves中使用EndLoop设置done
不会产生任何影响,因为您在调用EndLoop后立即返回一个硬编码值。
我建议你在调试器中通过EndLoop。如果它使您更容易查看发生的情况,则可以考虑在控制台上输入EndLoop的输入参数,以及在最终选择的情况下输出参数。
所以我编辑了我的代码,同样的东西仍在工作。我拿出了很多回报。 –
您是否添加了Console.WriteLine()来帮助您可视化程序流,或者在调试器中逐步了解您为什么没有看到您期望的行为? –
geniusMove将始终为空字符串,因为您没有将调用结果存储到Genius方法。
无论结果存储在geniusMove变量或引用传递它
public static string Genius(ref string geniusMove, string move, int geniusAmmo, bool done)
或
geniusMove = Genius(geniusMove, move, geniusAmmo, done);
这应该终止,如果你打的那个返回true ENDLOOP中列出的条件之一。当你在调试器中执行该例程时会发生什么? –
只有当用户输入为“f”时,while循环才会结束 –