2013-10-20 45 views
1

我目前的教学尝试使用数组时自己的C++和遇到了一个问题:简单数组操作错误?

我试图做一个井字棋游戏,用户将输入两个整数公布他想移动的位置,然后为他们打印棋盘。

除此之外,当我尝试一次修改我的主板,它往往会改变两个值!

示例)如果我输入的前四个数字是{0,1,1,0}我期望绘制两个字母 - 一个“x”和一个“o”。

但不是多个 “O” s的画!

谢谢你的帮助!

#include <string> 
#include <iostream> 
using namespace std; 

string board[2][2]; 
int xpos, ypos; 
string turn; 

int main() 
{ 
for(int i = 0; i < 3; i++) 
{ 
    for(int j = 0; j < 3; j++) 
    { 
     board[i][j]="-"; 
    } 

} 
for(int i=0;i<9;i++) 
{ 
    if(i%2==0) 
     turn = "x"; 
    else 
     turn = "o"; 

    cout<< "Where are you moving?\n"; 
    cin>> xpos >> ypos; 

    board[xpos][ypos] = turn; 

    cout<<"The board is:\n"; 
    cout<< board[0][0]+board[0][1]+board[0][2]+ "\n"; 
    cout<< board[1][0]+board[1][1]+board[1][2]+ "\n"; 
    cout<< board[2][0]+board[2][1]+board[2][2]+ "\n"; 

} 
return 0; 
} 
+0

你要走出阵列。这是未定义的行为。 – chris

回答

1

一开始变化

string board[2][2]; 

string board[3][3]; 

作为你的循环是从0到2 - 即3项

+0

哦! 2 in board [2] [2]是指4个总项目,而不是9个? – druckermanly

+0

@ user2899162 - Nowt不是约克郡的东西 - 它是一个数字 –

0

从2×2改变阵列至3×3后,我测试了代码,它似乎在工作。

,但您应该检查的xposypos值用户输入后:由于代码现在,

board[xpos][ypos] = turn; 

可以出界,并且可以引起程序崩溃(如果用户输入任何东西在任何坐标上大于2)。

最后,这是个人喜好的问题,你的代码现在使用用户输入的坐标从0到2。通常,人们会说他们在范围为1〜3(所以1,1将是顶最左边的广场,而不是中间的广场)。改变这个是改变先前引用的行到

board[xpos-1][ypos-1] = turn; 

(当然,检查后的值介于1和3之间)。

编辑:另外,坐标是垂直水平的(意思是给出的第一个值表示垂直坐标,第二个值表示水平坐标)。因此,在一个标准的笛卡尔图上,你的价值被表示为(y,x),这与人们(以及我只是猜测你已经习惯的)相反。