2013-10-20 89 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),這與人們(以及我只是猜測你已經習慣的)相反。