将C#切换语句替换为更可读/更直观的格式



我希望为我正在创建的战列舰程序清理一下我的代码。有一个2D阵列游戏板,其中包含与游戏板上发现的每艘舰艇相关的字符值,即游戏板上的战列舰将表示为"BBBB"。

该程序已经运行,但检查用户选择的坐标是否包含与船只相关的字符值的部分似乎很混乱,我不知道有什么方法可以让它看起来更干净。在此之前,它被实现为一堆if-else-if语句,这看起来也不太干净。任何帮助或指引我朝着正确的方向前进的建议都将是非常棒的。谢谢

switch (board.Grid[userSelectedRow, userSelectedCol])
{
case 'C':
carrier_C_HitCounter++;
hitCounter++;
if (carrier_C_HitCounter != shipList[0].Length)
{
Console.WriteLine("You struck a ship!n");
}
else
Console.WriteLine("You sunk their carrier!n");
break;
case 'B':
battleship_HitCounter++;
hitCounter++;
if (battleship_HitCounter != shipList[1].Length)
{
Console.WriteLine("You struck a ship!n");
}
else
Console.WriteLine("You sunk their battleship!n");
break;
case 'S':
submarine_S_HitCounter++;
hitCounter++;
if (submarine_S_HitCounter != shipList[2].Length)
{
Console.WriteLine("You struck a ship!");
}
else
Console.WriteLine("You sunk their submarine!");
break;
case 's':
submarine_s_HitCounter++;
hitCounter++;
if (submarine_s_HitCounter != shipList[3].Length)
{
Console.WriteLine("You struck a ship!");
}
else
Console.WriteLine("You sunk their submarine!");
break;
case 'D':
destroyer_D_HitCounter++;
hitCounter++;
if (destroyer_D_HitCounter != shipList[4].Length)
{
Console.WriteLine("You struck a ship!");
}
else
Console.WriteLine("You sunk their destroyer!");
break;
case 'd':
destroyer_d_HitCounter++;
hitCounter++;
if (destroyer_d_HitCounter != shipList[5].Length)
{
Console.WriteLine("You struck a ship!");
}
else
Console.WriteLine("You sunk their destroyer!");
break;
default:
Console.WriteLine("No ships were hit.");
break;
}
// Change the hit location to 'X'
board.SetChar(userSelectedRow, userSelectedCol, 'X');

重复次数最多的代码是检查它是什么船,并生成相关消息:

if (carrier_C_HitCounter != shipList[0].Length)
{
Console.WriteLine("You struck a ship!n");
}
else
Console.WriteLine("You sunk their carrier!n");

您可以定义一个枚举和一个函数来生成这样的消息,以稍微清理一下switch语句:

enum Ship
{
"carrier",
"battleship",
"submarine",
"destroyer"
}

public void getMessage(int number, int counter){
if (counter != shipList[number].Length)
{
Console.WriteLine("You struck a ship!");
}
else
Console.WriteLine("You sunk their " + (Ship)number + " !");
}

然后从交换机调用它,如:

switch (board.Grid[userSelectedRow, userSelectedCol])
{
case 'C':
carrier_C_HitCounter++;
hitCounter++;
getMessage(0,carrier_C_HitCounter);
break;
case 'B':
battleship_HitCounter++;
hitCounter++;
getMessage(1,battleship_HitCounter);
break;
case 'S':
submarine_S_HitCounter++;
hitCounter++;
getMessage(2,submarine_S_HitCounter);
break;
case 's':
submarine_s_HitCounter++;
hitCounter++;
getMessage(2,submarine_s_HitCounter);
break;
case 'D':
destroyer_D_HitCounter++;
hitCounter++;
getMessage(3,destroyer_D_HitCounter);
break;
case 'd':
destroyer_d_HitCounter++;
hitCounter++;
getMessage(3,destroyer_d_HitCounter);
break;
default:
Console.WriteLine("No ships were hit.");
break;
}
// Change the hit location to 'X'
board.SetChar(userSelectedRow, userSelectedCol, 'X');

我假设shipList是全局的,但在其他情况下也要修改函数头来传递它。让代码看起来更干净的最重要的事情是寻找大的重复块,并尝试找到一种方法来";重新路由";希望这对Derek有所帮助:(欢迎来到SO

最新更新