2016-04-15 46 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