Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Tìm bug bài TIC TAC TOE.

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    134

    Mặc định Tìm bug bài TIC TAC TOE.

    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]==aboard[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]==aboard[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 :
    scanf("%s",&b);a=b;
    1)Nếu iem thay %s bằng %c thì khi chạy thử, nó bỏ qua lượt đi của player 2

    scanf("%s",&b);a=b;
    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)

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    -> result = 0;a=b=0 : Init = NULL đi.
    Kiểu char và string init = NULL;
    sau đó nhận input : %c for char và %s for string.
    Tớ xem qua thấy bài cậu có nhận xét sau :
    1. vòng lặp do của cậu chứa 2 điều kiện rời
    2. cả cái board của cậu toàn điều kiện rời, cậu sửa hết thành else if đi.
    3. Chia cái board ra thành nhiều module nhỏ hơn

    Tham khảo bài Tik Tak Toe ở đây nhé : http://forums.congdongcviet.com/show...31&postcount=6
    Xem cái Project.
    None!

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    134

    -> result = 0;a=b=0 : Init = NULL đi.
    Kiểu char và string init = NULL;
    sau đó nhận input : %c for char và %s for string.
    Iem mới học C thôi, mới học qua kiểu char, tại code nì bỏ %c vào nó ko chịu chạy ngon nên phải thay = %s, chứ thực ra iem chưa biết gì về string
    Còn từ init nghĩa là gì vậy anh , em đang học = cuốn Apress.Beginning.C.From.Novice.to.Professional.4th .Edition.Oct.2006 down bên box ebook, iem search thử từ init trong cuốn này rồi nhưng ko thấy [>,<]

    3. Chia cái board ra thành nhiều module nhỏ hơn
    Cái này iem hông hiểu , chắc tại chưa học tới module gì đó

    1. vòng lặp do của cậu chứa 2 điều kiện rời
    2. cả cái board của cậu toàn điều kiện rời, cậu sửa hết thành else if đi.
    Có phải mấy cái if trong hàm checkwin ko? Iem thấy để vậy hay chuyển thành elseif nó cũng hoạt động như nhau à, với lại iem là newbie nên để vậy thấy dễ đọc hơn

    Thank, iem sẽ down cái project kia về coi thử

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn