2016-04-15 84 views
-1

我被困在編碼tic tac toe遊戲中。我需要你的幫助。基本上我的問題是爲什麼我的do-while循環在我的C++代碼中不起作用。我正在使用VS C++ 2015.do-while循環內部不是wokirng

背後的基本邏輯是:

  1. 創建3 3陣列並將1-9作爲字符。
  2. 設置一個for循環,如果語句讓玩家輸入X或O.如果我是0,或者甚至是玩家1輪到X.如果奇數,玩家2將O作爲字符。
  3. 在do-while循環中,我想檢查玩家是否選擇了已經選擇的單元格。但是do-while循環似乎根本不起作用。
  4. 通過if語句檢查一行中是否有3個X或Os。

請讓我知道什麼是解決這個問題的關鍵......非常感謝!

#include <iostream> 
#include "tic_tac_toe.h" 

using namespace std; 


int tic_tac_toe() { 
    cout << "You chose tic tac toe game!:) \n"; 

    char t[] = { '1', '2' ,'3' , '4', '5', '6', '7', '8', '9' }; 

    cout << "_" << t[0] << "_|_" << t[1] << "_|_" << t[2] << "_\n"; 
    cout << "_" << t[3] << "_|_" << t[4] << "_|_" << t[5] << "_\n"; 
    cout << " " << t[6] << " | " << t[7] << " | " << t[8] << " \n"; 


    for (int i = 0; i < 9; i++) { 

     if (i == 0 || i % 2 == 0) { 
      cout << "Player 1, your trun. Please choose a number to put X. \n"; 
      int n1; 
      cin >> n1; 

      do { 
       cout << "You cannot overwrite on X or O. Please in put again. \n"; 
       cin >> n1; 
      } while (t[n1 - 1] == 'X' || t[n1 - 1] == 'O'); 

      t[n1 - 1] = 'X'; 

     } 
     else { 
      cout << "Player 2, your trun. Please choose a number to put O. \n"; 
      int n2; 
      cin >> n2; 

      do { 
       cout << "You cannot overwrite on X or O. Please in put again. \n"; 
       cin >> n2; 
      } while (t[n2 - 1] == 'X' || t[n2 - 1] == 'O'); 

      t[n2 - 1] = 'O'; 

     } 





     cout << "_" << t[0] << "_|_" << t[1] << "_|_" << t[2] << "_\n"; 
     cout << "_" << t[3] << "_|_" << t[4] << "_|_" << t[5] << "_\n"; 
     cout << " " << t[6] << " | " << t[7] << " | " << t[8] << " \n"; 

     if (t[0] == 'X' && t[1] == 'X' && t[2] == 'X' || 
      t[3] == 'X' && t[4] == 'X' && t[5] == 'X' || 
      t[6] == 'X' && t[7] == 'X' && t[8] == 'X' || 

      t[0] == 'X' && t[3] == 'X' && t[6] == 'X' || 
      t[1] == 'X' && t[4] == 'X' && t[7] == 'X' || 
      t[2] == 'X' && t[5] == 'X' && t[8] == 'X' || 

      t[0] == 'X' && t[4] == 'X' && t[7] == 'X' || 
      t[2] == 'X' && t[4] == 'X' && t[6] == 'X') { 

      cout << "Player 1, you won! \n"; 
      break; 

     } 
     else if(t[0] == 'O' && t[1] == 'O' && t[2] == 'O' || 
       t[3] == 'O' && t[4] == 'O' && t[5] == 'O' || 
       t[6] == 'O' && t[7] == 'O' && t[8] == 'O' || 

       t[0] == 'O' && t[3] == 'O' && t[6] == 'O' || 
       t[1] == 'O' && t[4] == 'O' && t[7] == 'O' || 
       t[2] == 'O' && t[5] == 'O' && t[8] == 'O' || 

       t[0] == 'O' && t[4] == 'O' && t[7] == 'O' || 
       t[2] == 'O' && t[4] == 'O' && t[6] == 'O') 
     { 
      cout << "Player 2, you won! \n"; 
      break; 

     } 



    } 

    return 0; 

} 
+4

這聽起來就像你可能需要學習如何使用調試器來遍歷代碼一樣。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+2

「它不工作」不是真的有關你期望什麼和實際發生的信息。給這些信息會大大增加你獲得幫助的機會。例如,我希望用'while'循環代替'do-while',因爲您在第一次選擇之後寫出「您不能覆蓋X或O.請重新輸入」,無論它是什麼選擇。但是,我不能將它作爲答案發布,因爲我不知道這是否是您的實際問題 –

+1

您是否知道「while」和「do-while」循環之間的區別? 「do-while」循環的整個主體至少執行一次,因爲條件在最後被檢查。這意味着你顯示了要求輸入的信息,然後你用'cin'讀入輸入,然後你進入'do'循環,你立即告訴玩家選擇錯誤(根本沒有檢查過!),你問他輸入一個新的值,最後你檢查它。這顯然是錯誤的。提示:如果你使用'while'循環,會發生什麼? –

回答

3

您應該使用,而不是做......而

您的代碼應該是這樣的第一個球員

while (t[n1 - 1] == 'X' || t[n1 - 1] == 'O'){ 
    cout << "You cannot overwrite on X or O. Please in put again. \n"; 
    cin >> n1; 
} 

爲第二的球員,

while (t[n2 - 1] == 'X' || t[n2 - 1] == 'O'){ 
    cout << "You cannot overwrite on X or O. Please in put again. \n"; 
    cin >> n2; 
} 
+0

謝謝,但它仍然沒有按照我的預期工作。它不會打印您不能覆蓋X或O.請重新輸入。當我們在O上覆蓋X時,反之亦然。 – HK1988

+0

哦對不起,它工作!我的一些錯誤。非常感謝! – HK1988