Em mới học C, đang làm bài tập viết 1 trò chơi nhỏ : tictactoe (giống như caro trên 1 bàn cờ 3x3). Em chưa hoàn thành xong, nhưng đến đây thì gặp lỗi quái gỡ nên post lên, anh nào rãnh đọc rồi chỉ giúp iem cái
Code đây :
PHP Code:
#include<stdio.h>
void PrintScreen(char * board)
{ printf("\n\t+---+---+---+\n");
for (int i=0;i<3;i++)
{ printf("\t|");
for (int j=0;j<3;j++)
{
printf(" %c |",*(board+3*i+j));
}
printf("\n\t+---+---+---+\n");
}
}
int checkWin(char * board)
{
for (int i=0;i<3;i++)
{
if ((*(board+3*i+0)==*(board+3*i+1)) && (*(board+3*i+1)==*(board+3*i+2)) && ((char)*(board+3*i+2)=='o')) {printf("Player 1 win!"); return 1;}
if ((*(board+3*i+0)==*(board+3*i+1)) && (*(board+3*i+1)==*(board+3*i+2)) && ((char)*(board+3*i+2)=='x')) {printf("Player 2 win!"); return 1;}
if ((*(board+3*0+i)==*(board+3*1+i)) && (*(board+3*1+i)==*(board+3*2+i)) && ((char)*(board+3*2+i)=='o')) {printf("Player 1 win!"); return 1;}
if ((*(board+3*0+i)==*(board+3*1+i)) && (*(board+3*1+i)==*(board+3*2+i)) && ((char)*(board+3*2+i)=='x')) {printf("Player 2 win!"); return 1;}
}
if ((*(board+3*0+0)==*(board+3*1+1)) && (*(board+3*1+1)==*(board+3*2+2)) && ((char)*(board+3*2+2)=='o')) {printf("Player 1 win!"); return 1;}
if ((*(board+3*0+2)==*(board+3*1+1)) && (*(board+3*1+1)==*(board+3*2+0)) && ((char)*(board+3*2+0)=='o')) {printf("Player 1 win!"); return 1;}
if ((*(board+3*0+0)==*(board+3*1+1)) && (*(board+3*1+1)==*(board+3*2+2)) && ((char)*(board+3*2+2)=='x')) {printf("Player 2 win!"); return 1;}
if ((*(board+3*0+2)==*(board+3*1+1)) && (*(board+3*1+1)==*(board+3*2+0)) && ((char)*(board+3*2+0)=='x')) {printf("Player 2 win!"); return 1;}
return 0;
}
int main()
{ char board[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};
char a,result,b;
printf("Welcome to our game : TIC TAC TOE\n\n");
PrintScreen(&board[0][0]);
checkWin(&board[0][0]);
result = 0;a=b=0;
do
{
if (result==0)
{
printf("Player 1 : ");scanf("%s",&b);a=b;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
if (board[i][j]==a) board[i][j]='o';
PrintScreen(&board[0][0]);
result = checkWin(&board[0][0]);
}
if (result==0)
{
printf("Player 2 : ");scanf("%s",&b);a=b;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
if (board[i][j]==a) board[i][j]='x';
PrintScreen(&board[0][0]);
result = checkWin(&board[0][0]);
}
} while (result==0);
}
Em dùng 1 array [3,3] để biễu diễn bàn cờ. Hàm PrintScreen để in bàn cờ ra. Hàm checkWin trả về 0 hoặc 1 để kiểm tra coi có ai thắng chưa.
Rồi dùng vòng lặp While để người chơi nhập nước đi cho đến khi result = checkWin trả về 1 (tức là đã có người thắng);
Tới đây gặp 2 chỗ khó hiểu :
1)Nếu iem thay %s bằng %c thì khi chạy thử, nó bỏ qua lượt đi của player 2
2)Chỗ này iem dùng a chứ ko dùng b, nhưng lạ là nếu iem thay bằng scanf("%s",&a) thì lượt đầu nó chạy ko bình thường nữa (mấy anh thay thử rồi chạy thì biết)