2015-10-15 64 views
2

我已經創建了一個遊戲,給玩家5次玩的機會,之後我想問玩家他們是否想再玩或退出。我已經看到它在Python中完成,但我不知道python。我的代碼工作得很好,但我想添加這兩個附加功能 如何在C#中實現這些功能? 供參考,這是我的代碼主類代碼看起來像。如何讓用戶在C#中再次嘗試或退出控制檯程序?

namespace NumBaseBall 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("\t\t\t*************************************"); 
      Console.WriteLine("\t\t\t*  Let's Have Some Fun   *"); 
      Console.WriteLine("\t\t\t*   Welcome To The   *"); 
      Console.WriteLine("\t\t\t*  Number Baseball Game  *"); 
      Console.WriteLine("\t\t\t*************************************\n"); 

      GameResults gameresults = new GameResults(); 

      for (int trysCounter = 1; trysCounter <= 5; trysCounter++) 
      { 
       gameresults.Strikes = 0; 

       Random r = new Random(); 
       var myRange = Enumerable.Range(1, 9); 
       var computerNumbers = myRange.OrderBy(i => r.Next()).Take(3).ToList(); 
       Console.WriteLine("The Game's Three Random Integers Are: (Hidden from user)"); 
       foreach (int integer in computerNumbers) 
       { 
        Console.WriteLine("{0}", integer); 
       } 

       List<int> playerNumbers = new List<int>(); 
       Console.WriteLine("Please Enter Three Unique Single Digit Integers and Press ENTER after each:"); 
       for (int i = 0; i < 3; i++) 
       { 
         Console.Write(""); 
         int number = Convert.ToInt32(Console.ReadLine()); 
            playerNumbers.Add(number); 
       } 

       gameresults.StrikesOrBalls(computerNumbers,playerNumbers); 
       Console.WriteLine("---> Computer's Numbers = {0}{1}{2}", computerNumbers[0], computerNumbers[1], computerNumbers[2]); 
       Console.WriteLine("---> Player's Numbers = {0}{1}{2}", playerNumbers[0], playerNumbers[1], playerNumbers[2]); 
       Console.WriteLine("---> Game Results = {0} STRIKES & {1} BALLS\n", gameresults.Strikes, gameresults.Balls); 
       Console.WriteLine("You have played this games {0} times\n", trysCounter); 

        gameresults.TotalStrikes = gameresults.TotalStrikes + gameresults.Strikes; 

        Console.WriteLine("STRIKES = {0} ", gameresults.TotalStrikes); 

        if (gameresults.TotalStrikes >= 3) 
        { 
         gameresults.Wins++; 
         Console.WriteLine("YOU ARE A WINNER!!!"); 
         break; 
        } 
       } 
         if (gameresults.TotalStrikes <3) 
         Console.WriteLine("YOU LOSE :(PLEASE TRY AGAIN!"); 
      } 
     } 
    } 
+2

請解釋你的代碼不能正常工作,所以我們不必猜測。 –

+1

請花時間格式化您的代碼,因此它不會完全放在右邊 - 並且理想地將其減少到最小*示例。這並不清楚「陣列」和「列表」標籤與該問題有什麼關係。 –

+1

暗示解決這個問題:分開關注點。將大部分代碼從主要方法中移出到名爲「PlayGame」的方法中。此時,我們不需要關心那裏的內容 - 我們只需要確定詢問用戶是否想要再次玩,並且如果他們再次調用該方法。 –

回答

1

插入你的代碼的循環,其檢查,如果用戶想繼續裏面:

while(true) // Continue the game untill the user does want to anymore... 
{ 

    // Your original code or routine. 

    while(true) // Continue asking until a correct answer is given. 
    { 
     Console.Write("Do you want to play again [Y/N]?"); 
     string answer = Console.ReadLine().ToUpper(); 
     if (answer == "Y") 
      break; // Exit the inner while-loop and continue in the outer while loop. 
     if (answer == "N") 
      return; // Exit the Main-method. 
    } 
} 

但也許它會更好地達到分裂一個大的例行成單獨的程序。

讓我們將您的主要方法重命名爲PlayTheGame

分手了我的套路分爲:

static public bool PlayAgain() 
{ 
    while(true) // Continue asking until a correct answer is given. 
    { 
     Console.Write("Do you want to play again [Y/N]?"); 
     string answer = Console.ReadLine().ToUpper(); 
     if (answer == "Y") 
      return true; 
     if (answer == "N") 
      return false; 
    } 
} 

而現在的主方法可以是:

static void Main(string[] args) 
{ 
    do 
    { 
     PlayTheGame(); 
    } 
    while(PlayAgain()); 
} 

You'de有一些局部變量移到類的靜態字段。或者你可以創建一個遊戲類的實例,但我認爲這是目前的一步。

0

有兩種方法,你可以做到這一點:

https://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill%28v=vs.110%29.aspx

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

或者

https://msdn.microsoft.com/en-us/library/system.environment.exit(v=vs.110).aspx

int exitCode =1; 
System.Environment.Exit(exitCode); 

Environment.Exit是退出程序,因爲首選方式殺死命令「會導致進程異常終止,應僅在必要時使用。「 [msdn]

+0

函數Main的正常退出會更好,因爲'Exit'不會執行所有外部finally塊。 –

0

首先,建議將實際遊戲代碼移動到單獨的函數中。它會清理很多東西。

喜歡的東西

private static bool PlayGame() 
{ 
    // Win branch returns true. 
    // Loss branch returns false. 
} 

這就可以讓你大大簡化Main功能允許它只能處理菜單的功能。

對於實際的菜單功能,我傾向於選擇do/while循環。你有一點額外的規定,你只問5次後,但這很容易處理。

static void Main(string[] args) 
{ 
    int playCount = 0; 
    string answer = "Y"; 
    bool winner; 

    do 
    { 
     if(playCount < 5) 
     { 
      playCount++; 
     } 
     else 
     { 
      do 
      { 
       Console.Write("Play again? (Y/N): "); 
       answer = Console.ReadLine().ToUpper(); 
      } while(answer != "Y" && answer != "N"); 
     } 

     winner = PlayGame(); 
    } while(!winner && answer == "Y"); 

    Console.WriteLine("Thanks for playing!"); 
} 

你可以通過移動的5場測試進入if條件與使用增量運算符的位簡化它。唯一的問題是,如果有人玩你的遊戲十億次,事情可能會變得怪異。

static void Main(string[] args) 
{ 
    int playCount = 0; 
    string answer = "Y"; 
    bool winner; 

    do 
    { 


     if(playCount++ > 3) 
     { 
      do 
      { 
       Console.Write("Play again? (Y/N): "); 
       answer = Console.ReadLine().ToUpper(); 
      } while(answer != "Y" && answer != "N"); 
     } 

     winner = PlayGame(); 
    } while(!winner && answer == "Y"); 

    Console.WriteLine("Thanks for playing!"); 
} 

編輯:改變了一些事情有點,因爲它看起來就像在你的原始代碼比賽結束的人贏得比賽後。


根據您的問題在下面的評論,你可以讓你的Program類的GameResults類的靜態實例。你的代碼最終會看起來像下面

class Program 
{ 
    private static GameResults results = new GameResults(); 

    public static void Main(string[] args) 
    { 
     // Code 
    } 

    private static bool PlayGame() 
    { 
     // Code 
    } 
} 

PlayGame你只使用靜態results對象,而不是創建一個新的每次PlayGame叫的。

+0

@BradfordDillion當你說「將實際玩遊戲的代碼移動到一個單獨的函數中時,它會清理很多東西。」你指的是什麼代碼?因爲我有一個名爲GameResults的外部類,它也處理遊戲的某些功能 –

+0

@AaronLWG上面'for'loop中存在的大部分代碼可能會被移入一個單獨的函數中。 –

+0

@BradfordDillion我可以爲你提供一些額外的幫助嗎?我正在嘗試增加並保存玩家如果繼續玩下去的勝利數量。然而,每次他再次嘗試時,他以前的勝利數都會變得乾淨,並且他又回到了零。我知道它是因爲我在每場新遊戲中都創造了一個「GameResults」的新實例,但我不確定如何挽救他的獲勝數。你能協助嗎? –

相關問題