C# 我的游戏有一个;“重新启动游戏”;结束屏幕上调用startName()方法的按钮。如何避免递归和最终的堆栈溢出?

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

MCVE在下面。如何避免递归调用startName()和DisplayEndScreen?一种方法是在StartGame()上循环,但这似乎不是一个可扩展的解决方案,更像是一种黑客行为。另一种解决方案可能是:当用户点击R重新启动时,返回主菜单,并以某种方式将Enter键作为输入传递到switch语句中

什么是好的解决方案

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-如果你删除“什么是最好的解决方案?”部分,并更多地关注“我如何在没有递归的情况下实现这个”方面,那么我认为你的问题是完全正确的。这是我看到的唯一一个可以解释为基于观点的地方。