2014-11-04 4 views
0

이 프로그램은 플레이어와 컴퓨터 사이의 간단한 Tic Tac Toe 게임입니다. 컴퓨터는 단지 공간이 이미 점유되어 있지 않은 경우 이동할 공간을 생성합니다. 또한, 나는 y 축이 수평축에있는 동안 수직축에 x 좌표를 가지고있다. 2 차원 배열을 사용하기 때문에이 작업을 수행했습니다.Tic-Tac-Toe Array 오류

프로그램을 실행할 때 일부 공백이 잘못되어 이유를 찾을 수 없습니다. 사용자가 포인트 (0,2)를 입력하면 프로그램은 포인트 (1,0)를 채우고 그 반대도 마찬가지입니다. 이것은 점 (1,2) 및 (2,0)에서도 발생합니다.

#include<iostream> 
#include<string> 
#include<stdlib.h> 
#include<ctime> 

using namespace std; 

int board[2][2]; 

int chooseFirstPlayer(); 
void userMove(int boardArray[2][2]); 
void compMove(int boardArray[2][2]); 
int checkIfWinner(int boardArray[2][2]); 
void displayBoard(int boardArray[2][2]); 

int main(){ 
    srand(time(NULL)); 
    int x,y,winner; 

    for(x = 0; x <= 2; x++){ //sets the enitre board array to 0 
     for(y = 0; y <= 2; y++){ 
      board[x][y] = 0; 
     } 
    } 

    if (chooseFirstPlayer() == 1){ //the user gets to movve first 

     do{//it will loop this until there is a winner 
      displayBoard(board); 
      userMove(board); 
      displayBoard(board); 
      winner = checkIfWinner(board); 

      if (winner == 0){//after the player moves, it will see if he won. If not, then the computer willbe able to move. 
       compMove(board); 
       displayBoard(board); 
       winner = checkIfWinner(board); 
      } 
     }while (winner == 0);//it will loop until a winner is found 


    } 
    else{//same structure as above just slightly altered to allow the computer to move first 

     do{ 
      compMove(board); 
      displayBoard(board); 
      winner = checkIfWinner(board); 

      if (winner == 0){ 
       userMove(board); 
       displayBoard(board); 
       winner = checkIfWinner(board); 
      } 
     }while(winner == 0); 
    } 

    if (winner = 1){ 
     cout << "Congratulations, you won!"; 
    } 
    else if (winner = 2){ 
     cout << "Sorry, you lost!"; 
    } 

} 

int chooseFirstPlayer(){//randomly genereate a number 1 or 2 to choose who moves first 

    return rand() % 2 + 1; 
} 

void userMove(int boardArray[2][2]){ 
    int userX, userY; 

    do{ 
     cout << "Enter an x coordinate: "<<endl; 
     cin >> userX; 

     cout << "Enter a y coordinate: "<<endl; 
     cin >> userY; 

     if (boardArray[userX][userY] != 0){ 
      cout << "That loaction is already occupied"<<endl; 
     } 
    }while(boardArray[userX][userX] != 0); 

    boardArray[userX][userY] = 1; 

} 

void compMove(int boardArray[2][2]){ 
    int compX,compY; 

    do{ 
     compX = rand() % 3; 
     compY = rand() % 3; 
    }while(boardArray[compX][compY] != 0); 

    boardArray[compX][compY] = 2; 
} 

int checkIfWinner(int boardArray[2][2]){ 


    if(boardArray[0][0] == boardArray[0][1] && boardArray[0][1] == boardArray[0][2]){ //across 
     return boardArray[0][0];} 
    else if (boardArray[1][0] == boardArray[1][1] && boardArray[1][1] == boardArray[1][2]){ 
     return boardArray[1][0];} 
    else if (boardArray[2][0] == boardArray[2][1] && boardArray[2][1] == boardArray[2][2]){ 
     return boardArray[2][0];} 
    else if (boardArray[0][0] == boardArray[1][0] && boardArray[1][0] == boardArray[2][0]){//down 
     return boardArray[0][0];} 
    else if (boardArray[0][1] == boardArray[1][1] && boardArray[1][1] == boardArray[2][1]){ 
     return boardArray[0][1];} 
    else if (boardArray[0][2] == boardArray[1][2] && boardArray[1][2] == boardArray[2][2]){ 
     return boardArray[0][2];} 
    else if (boardArray[0][0] == boardArray[1][1] && boardArray[1][1] == boardArray[2][2]){//diagonal 
     return boardArray[0][0];} 
    else if (boardArray[2][0] == boardArray[1][1] && boardArray[1][1] == boardArray[0][2]){ 
     return boardArray[2][0];} 
    else{ 
     return 0; 
     } 

} 

void displayBoard(int boardArray[2][2]){ 

    system("CLS"); 

    cout <<" "<<" Y1 "<<" Y2 "<<" Y3 "<<endl; 
    cout <<" X1 "<< "__"<<boardArray[0][0]<<"__|__"<<boardArray[0][1]<<"__|__"<<boardArray[0][2]<<"__"<<endl; 
    cout <<" X2 "<< "__"<<boardArray[1][0]<<"__|__"<<boardArray[1][1]<<"__|__"<<boardArray[1][2]<<"__"<<endl; 
    cout <<" X3 "<< " "<<boardArray[2][0]<<" | "<<boardArray[2][1]<<" | "<<boardArray[2][2]<<" "<<endl; 
} 

내 IDE

는 데브-C입니다 ++ (5.4.2)

+1

'int board [3] [3]'을 사용하십시오. 배열을 선언 할 때 마지막 인덱스가 아니라 크기를 선언하십시오. 0 기반 첨자는 혼동을 줄 수 있습니다. :) –

+0

** 코멘트 : ** "C++"에 대한 의문이 생길 때마다 IDE가 문제가되지 않습니다. 귀하의 경우에는 MingW라고 믿지만 버전을보고하지 않았습니다. –

+0

오, 나는 IDE가 문제라고 제안하지 않았다. –

답변

1

어레이는 2 × 그리고 당신은 수행

for(x = 0; x <= 2; x++){ //sets the enitre board array to 0 
     for(y = 0; y <= 2; y++){ 
      board[x][y] = 0; 
     } 
    } 

당신은 당신이 안 메모리에 액세스 할 수 있습니다. 그것은 당신이 한계를 벗어나는 것을 의미합니다!

여기서 xy은 결국 2와 같은 값을 취합니다. 1.

그래서, 당신은 3 × 3의 배열을 사용하거나 코드 (2까지가는 기능 checkIfWinner)를 변경할 수 있습니다 - 그것은 크기가 될 때까지 배열의

인덱싱은 0에서 시작합니다.


사이드 참고 : 그대로두면

if (winner = 1){ 
    cout << "Congratulations, you won!"; 
} 
else if (winner = 2){ 
    cout << "Sorry, you lost!"; 
} 

은 어떻게됩니까 :

당신은 여기에서 평등 연산자를 놓친? 과제가 발생하고 논리적 인 결과가 나오므로 첫 번째 조건은 항상 true가됩니다 (두 번째 조건이지만 코드는 그다지 진행되지 않습니다).

===으로 변경하십시오.

+0

고마워, 나는 너를 upvote 것이지만 나는이 사이트에 새로운 사람이다. –