C# 我的游戏有一个;“重新启动游戏”;结束屏幕上调用startName()方法的按钮。如何避免递归和最终的堆栈溢出?
MCVE在下面。如何避免递归调用startName()和DisplayEndScreen?一种方法是在StartGame()上循环,但这似乎不是一个可扩展的解决方案,更像是一种黑客行为。另一种解决方案可能是:当用户点击R重新启动时,返回主菜单,并以某种方式将Enter键作为输入传递到switch语句中 什么是好的解决方案C# 我的游戏有一个;“重新启动游戏”;结束屏幕上调用startName()方法的按钮。如何避免递归和最终的堆栈溢出?,c#,recursion,menu,stack-overflow,C#,Recursion,Menu,Stack Overflow,MCVE在下面。如何避免递归调用startName()和DisplayEndScreen?一种方法是在StartGame()上循环,但这似乎不是一个可扩展的解决方案,更像是一种黑客行为。另一种解决方案可能是:当用户点击R重新启动时,返回主菜单,并以某种方式将Enter键作为输入传递到switch语句中 什么是好的解决方案 using System; using System.Collections.Generic; using System.Linq; using System.Text; us
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main Menu: Press Enter to start the game >>");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.Enter:
StartGame();
break;
// Other Menu Items
}
}
private static void StartGame()
{
// Do Game
DisplayEndScreen(); // NB: This causes recursion! I don't want this.
}
private static void DisplayEndScreen()
{
Console.WriteLine("Game Over! Select an option >> \n\n" +
"R:\tPlay again\n" +
"M:\tReturn to Main Menu\n" +
"Q:\tQuit");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.R:
StartGame(); // NB: This causes recursion! I don't want this.
break;
// Other Menu Items
}
}
}
}
在StartGame()内调用StartGame()会导致递归。避免这种情况的方法就是不在其内部调用方法
我认为函数的名称对您的程序来说有点混乱,您确定“startName”正确描述了函数的功能吗?看起来更可能是实际的游戏(game()?)本身。如果取而代之的是一个名字,它告诉你游戏实际上正在运行(就像它看起来那样),那么再次调用它对你来说就没什么意义了
考虑到运行游戏,最基本的解决方案通常如下所示:
bool game = true;
while(game)
{
//game running
if(exit)
{
game = false;
}
}
如果你不想要它,为什么你有它?为什么不试试你的解决方案,看看它们是否有效,而不是征求意见?如果他们不工作,问为什么。在这里,自以为是的问题是离题的。关于你的方法,我觉得有些不对劲(尽管对此持保留态度——我不是游戏开发者)。名为
StartGame
的东西似乎不应该调用DisplayEndScreen
。也许StartGame
应该返回到Main
?然后,如果Main
处理从开始到结束屏幕的流程,则不会出现递归问题,StartGame
似乎不会做“太多”。@Frontear我不想实现我的第一个解决方案,因为我认为它不可扩展。我不知道如何实现我的第二个解决方案。但更重要的是,我几乎可以肯定这两种方法都不是解决问题的好方法。我不是在寻找任何黑客,我想要一个合适的解决方案。这当然不是离题?你想要一个基于意见的解决方案。开发者的实现方式会有所不同,我个人会创建一个循环
或勾选
方法,使用exitGame
布尔值来处理关闭它,而不是你的逻辑。这是自以为是的,不适合这个网站。@PianoTelope-如果你删除“什么是最好的解决方案?”部分,并更多地关注“我如何在没有递归的情况下实现这个”方面,那么我认为你的问题是完全正确的。这是我看到的唯一一个可以解释为基于观点的地方。