2014-02-15 139 views
-1
public static int Menu() // 1 - Start Game , 2 - Quit Game 
    { 
     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.WriteLine("Rock - Paper - Scissors"); 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.WriteLine("_______________________"); 
     Console.WriteLine(); 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.WriteLine("- Start Game"); 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.WriteLine("- Quit Game"); 
     ConsoleKeyInfo keyInfo; 
     keyInfo = Console.ReadKey(true); 
     if (keyInfo.Key == ConsoleKey.Enter) 
     { 
      Console.Clear(); 
      return 1; // Start Game 
     } 
     else 
     { 
      if (keyInfo.Key == ConsoleKey.DownArrow) 
      { 
       Console.Clear(); 
       Console.ForegroundColor = ConsoleColor.Cyan; 
       Console.WriteLine("Rock - Paper - Scissors"); 
       Console.ForegroundColor = ConsoleColor.White; 
       Console.WriteLine("_______________________"); 
       Console.WriteLine(); 
       Console.WriteLine("- Start Game"); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("- Quit Game"); 
       if (Console.ReadKey(true).Key == ConsoleKey.Enter) 
       { 
        Console.Clear(); 
        return 2; // Quit Game 
       } 
       else 
       { 
        if (Console.ReadKey(true).Key == ConsoleKey.UpArrow) 
        { 
         Console.Clear(); 
         return Menu(); // Recursion :) 
        } 
       } 
      } 
     } 
     return 2; 
    } 

我的问题是,当它到达“退出游戏”,我按向上箭头其实我需要按2次向上箭头为它工作,而不是1控制台启动菜单

有什么建议?

+0

除了答案公布,两件事情在这里 - 1.这是递归的每一个“游戏”将再添调用堆栈不好的地方,不必要地吃起来越来越多的内存更多游戏玩过。改为尝试一个循环。 2. else {if {}}'可以简化为else if {}。 –

+0

+1从递归移动:)。在这种情况下,最好有一个变量存储一个专用于“退出”的密钥。 1.显示欢迎画面。 2.从用户那里读取一个密钥(并存储在一个变量中!)。 3.如果是退出键,提示/退出。否则,输入一个循环取决于** last **键是否是退出键。我可以充实更多,如果这将有助于 –

回答

3

这是因为每次评估if条件时都会调用ReadKey。相反,将结果存储在一个变量中。

var key = Console.ReadKey(true).Key; 
if (key == ConsoleKey.Enter) 
{ 
    Console.Clear(); 
    return 2; // Quit Game 
} 
else 
{ 
    if (key == ConsoleKey.UpArrow) 
    { 
     Console.Clear(); 
     return Menu(); // Recursion :) 
    } 
} 

这样,你会打电话给ReadKey只有一次,你的第一个将予以考虑。

在你的代码的当前状态,你可以按了,是不是输入首次仍读第二如果检查任意键。

// ReadKey is called for the first time... 
if (Console.ReadKey(true).Key == ConsoleKey.Enter) 
{ 
    Console.Clear(); 
    return 2; // Quit Game 
} 
else // ...if it wasn't Enter... 
{ 
    // ...ReadKey is called a second time. 
    if (Console.ReadKey(true).Key == ConsoleKey.UpArrow) 
    { 
     Console.Clear(); 
     return Menu(); // Recursion :) 
    } 
} 
+0

哇,谢谢很多家伙! – God