2014-10-03 66 views
1

我目前正在开发一个井字棋游戏。每次播放器或计算机移动时,我需要制作一个更新的井字棋板(显示“X”和“O”)。到目前为止,我已经设法制作电路板,但我不知道如何有效地将用户的输入变成“X”。我做的第一件事是垃圾邮件是这样的:C++:如何将用户输入并将其放入井字棋板

if(playerChoice == 1) 
block[0][0] = "X"; 
if(playerChoice == 2) 
block[0][1] = "X"; 
if(playerChoice == 3) 
block[0][2] = "X"; 
if(playerChoice == 4) 
block[1][0] = "X"; 
if(playerChoice == 5) 
block[1][1] = "X"; 
if(playerChoice == 6) 
block[1][2] = "X"; 
if(playerChoice == 7) 
block[2][0] = "X"; 
if(playerChoice == 8) 
block[2][1] = "X"; 
if(playerChoice == 9) 
block[2][2] = "X"; 

虽然它的工作原理,它可能是最糟糕的格式。 (现在,它有效地把玩家的选择到正确的正方形。)

下面是完整的代码(这不是结束,甚至可能没有工作。):

#include <iostream> 
#include <ctime> 
#include <cstdio> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
//random starting turn chooser 
int turnFirst; //variable to decide whoever goes first 
int computerRandomPick; //variable to decide which grid the computer will place "O" 
srand(time(0)); 
turnFirst = rand()% (2 - 1 + 1)+1;//generates starting person. 
computerRandomPick = rand()% (9 - 1 + 1)+1;//computer first random pick 

//board arrays 
string block[3][3]; 
block [0][0] = {" "}; 
block [0][1] = {" "}; 
block [0][2] = {" "}; 
block [1][0] = {" "}; 
block [1][1] = {" "}; 
block [1][2] = {" "}; 
block [2][0] = {" "}; 
block [2][1] = {" "}; 
block [2][2] = {" "}; 

//player interaction 
int playerChoice; 

//BEGIN OF PROGRAM 
cout << "Welcome to Tic Tac Toe!" <<endl<< endl; 


    if(turnFirst == 1)//player first 
    { 
      cout << "Please choose a grid to place (X): "<<endl<<endl; 
         cout << "  1 | 2 | 3"<< endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  4 | 5 | 6" << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  7 | 8 | 9" << endl; 
         cout << "  -----+-----+-----" << endl<<endl; 
         cin >> playerChoice; 
         system("CLS"); 
    } 
       if(playerChoice == 1) 
        block[0][0] = "X"; 
       if(playerChoice == 2) 
        block[0][1] = "X"; 
       if(playerChoice == 3) 
        block[0][2] = "X"; 
       if(playerChoice == 4) 
        block[1][0] = "X"; 
       if(playerChoice == 5) 
        block[1][1] = "X"; 
       if(playerChoice == 6) 
        block[1][2] = "X"; 
       if(playerChoice == 7) 
        block[2][0] = "X"; 
       if(playerChoice == 8) 
        block[2][1] = "X"; 
       if(playerChoice == 9) 
        block[2][2] = "X"; 



    if(turnFirst == 2)//computer first 
    { 
      system("CLS"); 
      cout << "The computer picked: " <<endl<<endl; 
    } 
         if(computerRandomPick == 1) 
      block[0][0] = "O"; 
      if(computerRandomPick == 2) 
      block[0][1] = "O"; 
      if(computerRandomPick == 3) 
      block[0][2] = "O"; 
      if(computerRandomPick == 4) 
      block[1][0] = "O"; 
      if(computerRandomPick == 5) 
      block[1][1] = "O"; 
      if(computerRandomPick == 6) 
      block[1][2] = "O"; 
      if(computerRandomPick == 7) 
      block[2][0] = "O"; 
      if(computerRandomPick == 8) 
      block[2][1] = "O"; 
      if(computerRandomPick == 9) 
      block[2][2] = "O"; 



//Game Board. 


         cout << "  " << block[0][0] << " | " << block [0][1] << " | " << block [0][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  " << block [1][0] << " | " << block [1][1] << " | " << block [1][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
         cout << "  " << block [2][0] << " | " << block [2][1] << " | " << block [2][2] << endl; 
         cout << "  -----+-----+-----" << endl; 
    return 0; 
} 
+1

://codereview.stackexchange 所以,你可以为优化。 COM)。有一百万种方法可以改善这一点;并且在C和C++中不缺少Tic-Tac-Toe示例以便从那里学习。但最重要的是,你需要考虑消除重复;为什么要编写相同的代码来放置x和O给定数字两次,当您可以创建一个方法或函数来传递一个数字并将“X”或“O”作为参数?开始在一半的地方切割东西...... – HostileFork 2014-10-03 03:56:37

+0

使用更多功能。一般的规则是,如果你的函数超过25行错误,你可能做错了。 (这不是一个硬性规则,但你应该对任何比这个更长的功能有很强的理由) – o11c 2014-10-03 04:38:35

+0

请注意,如果你想获得想法,在这里有许多问题标记[tag:tic-tac-toe] (现在,你的是其中之一)。 – HostileFork 2014-10-03 06:11:56

回答

4

。假定嵌段[3] [3]声明为:

char block[3][3]; 

playerChoice可以是1-9。如果你的代码的工作,你只是想知道你会如何改进它,认为它采取以[codereview.stackexchange.com(HTTP

playerChoice --; // to make it 0-8 
block[playerChoice/3][playerChoice %3] = 'X'; // instead of "X" 
+0

感谢您的帮助! – Shico75 2014-10-03 04:39:00

+0

@ Shico75欣赏,如果你接受ans,请这样做 – 2014-10-03 04:41:43

+0

当然可以! - 只是想让你知道,你在玩家选择之后忘了“)”,这可能会让人们在将来阅读时感到困惑。 – Shico75 2014-10-03 20:44:34

0

这里有一个想法:您可以使用规则的网格结构来简化问题。

如果playerChoice介于1和3之间,则第一个索引为0.如果它在4和6之间,则索引为1,如果索引为7和9,则索引为2.这将输入细分为3组实际上,索引是(playerChoice - 1)/3,整数除法。

第二个索引每3个选择重复一次。这意味着使用模数可以在这里帮助实际上,索引是(playerChoice - 1) % 3

您可以将整个代码减少

block[(playerChoice-1)/3][(playerChoice-1)%3] = "X"; 

或一些变化。

相关问题