2016-01-31 28 views
0

有這個編碼的問題,如何檢查並顯示贏家?我試圖添加它,但由於函數checkWinner()變成錯誤。井字c + +查看和打印得主

#include <iostream> 
using namespace std; 

void showBoard(void); 
void playerInput(int p); 
void checkWinner(); 
void nextPlayer(int); 

int board[3][3]={{0,0,0},{0,0,0},{0,0,0}}; 

int main() 
{ 
int r; 
int c; 
int player; 
int winner; 
int turns; 

cout << "******* Tic Tac Toe Game *******" << endl; 

showBoard(); 
nextPlayer(1); 
checkWinner(); 

return 0; 
} 

輸出板功能:

void showBoard(void) 
{ 
int r; 
int c; 

for(r=0; r<=2; r++) 
{ 
    for(c=0; c<=2; c++) 
    { 
     if(board [r][c]==0) 
      cout << "0 "; 
     else if (board [r][c]==1) 
      cout << "1 "; 
     else 
      cout << "2 "; 
    } 
    cout << endl; 
} 
} 

這是玩家輸入功能:

void playerInput(int p) 
{ 
int row; 
int col; 

if(p==1) 
    cout <<"You are player number 1 \n\n"; 
else 
    cout <<"You are player number 2 \n\n"; 

cout<<"Please enter your coordinate:"; 
cin>>row; 
cout<<"\n"; 
cin>>col; 

if(p==1) 
    board[--row][--col]=1; 
if(p==2) 
    board[--row][--col]=2; 
} 

繼承人,我現在面對的問題,如何使它顯示的贏家?

void checkWinner() 
{ 
int winner; 

for (int i=0; i<=2; i++) 
{ 
    if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][0]!=0) 
    { 
     winner=board[i][0]; 
    } 
} 

for(int i=0; i<=2; i++) 
{ 
    if (board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[0][i]!=0) 
    { 
     winner=board[0][i]; 
    } 
} 

if(board[0][0]=board[1][1] && board[1][1]==board[2][2] && board[0][0]!=0) 
{ 
    winner=board[0][0]; 
} 

if(board[0][2]=board[1][1] && board[1][1]==board[2][0] && board [0][2]!=0) 
{ 
    winner=board[0][2]; 
} 

if(board[0][0]==board[0][1] && board[0][1]==board[0][2]&& board[0][2]==board[0][1]&& board[1][0]==board [1][1]&& board[1][1]==board [1][2]&& board[1][2]==board[2][0]&&board[2][0]==board [2][1]&& board[2][1]==board [2][2] && board [0][0]!=0) 
{ 
    winner=0; 
} 
} 

void nextPlayer(int player) 
{ 
playerInput(player); 
showBoard(); 

if(player==1) 
    player=2; 
else 
    player=1; 

nextPlayer(player); 
} 

問題是遊戲沒有結束,但它仍然要求玩家恢復並不斷更新價值。 點擊下方查看我正面臨的問題。謝謝!

Click to view my output, it doesn't end the game

+0

你說的是什麼**錯誤**? –

+0

'由於函數checkWinner()會變成錯誤'聽起來像這是在你的問題中解釋的重要一點... – John3136

+1

正確地格式化你的代碼顯示了兩個非常明顯的地方,你使用'='但你應該使用' =='。 –

回答

0

在代碼中的兩個點,你已經在你的if語句中使用=。這導致初始化,而不是平等檢查。您應該使用==代替=

if (board[0][0] = board[1][1] && /** This should be a == for checking equality */ 
    board[1][1] == board[2][2] && 
    board[0][0] != 0) 
{ 
    winner=board[0][0]; 
} 

if (board[0][2] = board[1][1] && /** This should be a == for checking equality */ 
    board[1][1] == board[2][0] && 
    board[0][2] != 0) 
{ 
    winner = board[0][2]; 
} 
+0

這不是他的代碼中唯一的問題。遞歸也是搞砸了,所以'checkWinner()'永遠不會被調用。 –

0

您的代碼有一個嚴重的遞歸問題。該功能在checkWinner()從未main被調用,因爲函數nextPlayer(1);是無限遞歸,因爲它缺乏一個基本情況

A 遞歸基例,是什麼導致遞歸函數停止遞歸。

注意,在你的代碼:

void nextPlayer(int player) 
{ 
playerInput(player); 
showBoard(); 

if(player==1) 
    player=2; 
else 
    player=1; 
nextPlayer(player); 
} 

一旦nextPlayer(1);main調用,它永遠不會返回,因爲,它總是進入在函數結束自己的nextPlayer(player);的另一個電話。爲此,您需要一個基本案例來停止此遞歸。

現在,你的邏輯基本情況實際上應該是,繼續玩,這是由checkWinner()函數處理前檢查贏家。

但是,問題是,checkWinner()函數返回void這意味着沒什麼所以,在目前的狀態,我們不能把它作爲一個基本情況。

但是,如果我們重新設計它返回的東西,如:

  • 0玩耍上
  • 1或2表示選手贏得
  • ,最後-1表示該板是全沒有人獲勝(一個領帶)。

所以,改革checkWinner()功能(我也修正了幾個條件,所以必須在代碼仔細看):

int checkWinner() 
{ 
int winner; 

// any of the rows is same 
for (int i=0; i<=2; i++) 
{ 
    if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][0]!=0) 
    { 
    winner = board[i][0]; 
    return winner; 
    } 
} 

// any of the columns is same 
for(int i=0; i<=2; i++) 
{ 
    if (board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[0][i]!=0) 
    { 
    winner = board[0][i]; 
    return winner; 
    } 
} 

// 1st diagonal is same 
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[0][0]!=0) 
{ 
    winner = board[0][0]; 
    return winner; 
} 

// 2nd diagonal is same 
if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board [0][2]!=0) 
{ 
    winner = board[0][2]; 
    return winner; 
} 

// if we reached here nobody has won yet 

// if any empty box on board then play on 
for(int i=0; i<=2; i++) 
{ 
    for(int j=0; j<=2; j++) 
    { 
    if(board[i][j]==0) 
    { 
    winner = 0; 
    return winner; 
    } 
    } 
} 

winner = -1; // all boxes full and nobody won so A tie has occurred 
return winner; 
} 

現在,它可以使用,我們將用它void nextPlayer(int player)功能:

void nextPlayer(int player) 
{ 
int winner = checkWinner(); 

if(winner == 0) // play on 
{ 
    playerInput(player); 
    showBoard(); 

    if(player==1) 
    player=2; 
    else 
    player=1; 
    nextPlayer(player); 
} 
else if(winner == -1) 
{ 
    cout<<"\nGame drawn!\n"; 
} 
else 
{ 
    cout<<"\nPlayer "<<winner<<" wins!\n"<<endl; 
} 
} 

需要注意的是,在我們開始做任何事情checkWinner()檢查條件。

而現在,在main函數調用checkWinner(),這是不可達不管怎麼說,不需要,現在將在void nextPlayer(int player)每一步操作前要做:

#include <iostream> 
using namespace std; 

void showBoard(void); 
void playerInput(int p); 
int checkWinner(); 
void nextPlayer(int); 

int board[3][3]={{0,0,0},{0,0,0},{0,0,0}}; 

int main() 
{ 
int r; 
int c; 
int player; 
int winner; 
int turns; 

cout << "******* Tic Tac Toe Game *******" << endl; 

showBoard(); 
nextPlayer(1); 

return 0; 
} 

的功能其餘的都是正確並且保持不變。

+0

@Hafaisy你解決了你的問題嗎? –