01/10/2018, 08:47

Cần giúp đỡ về trò chơi "Người treo cổ" trong C

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char docKytu();
int win(int sokytuBimat[]);
int kiemtraKytu(char kytu, char tuBimat[], int sokytuBimat[]);
int main(int argc, char *argv[])
{
    int choilai = 1;
    while(choilai)
    {
        int chedo;
        printf("     TRO CHOI NGUOI TREO CO     
");
        printf("1. Huong dan choi
");
        printf("2. Bat dau choi
");
        scanf("%d",&chedo);
        switch(chedo)
        {
        case 1:
        {
            printf("Ban co 1 cau hoi va 10 luot doan
");
            printf("Ban phai tim duoc cau tra loi trong 10 luot doan
");
            printf("Neu het 10 luot ban van chua tim duoc cau tra loi, thi ban se thua cuoc
");
            break;
        }
        case 2:
        {
            char kytu = 0;
            char tuBimat[]= "NGUYENTRUNGBAC";
            int sokytuBimat[14]= {0};
            int soluotDoan = 10;
            int i = 0;
            printf("Cau hoi tro choi:
");
            printf("Ty phu tre tuoi nhat Viet Nam la ai? 
");
            printf("     Tro choi bat dau     
");

            while(soluotDoan > 0 && !win(sokytuBimat))
            {
                printf("
Ban co %d luot doan de choi", soluotDoan);
                printf("
Tu bi mat la gi?
");
                for(i = 0; i < 14; i++)
                {
                    if(sokytuBimat[i])
                        printf("%c",tuBimat[i]);
                    else
                        printf("*");
                }
                printf("
Xin moi ban doan mot ky tu: ");
                kytu = docKytu();

                if(!kiemtraKytu(kytu,tuBimat,sokytuBimat))
                {
                    soluotDoan--;
                }
            }
            if(win(sokytuBimat))
                printf("

Chuc mung, ban da chien thang!
Tu bi mat la: %s",tuBimat);
            else
                printf("

Xin chia buon, ban da thua!
Tu bi mat la: %s",tuBimat);
            break;
        }
        }
        printf("

Tro choi ket thuc!! 
");
        printf("Ban cho muon choi lai khong?
");
        printf("Lua chon 1 de choi lai, lua chon 0 de thoat tro choi
");
        printf("Lua chon cua ban la: ");
        scanf("%d",&choilai);
    }
    return 0;
}
char docKytu()
{
    char kytuNhapVao = 0;
    kytuNhapVao = getchar();
    kytuNhapVao = toupper(kytuNhapVao);

    while(getchar() != '
');
    return kytuNhapVao;
}
int win(int sokytuBimat[])
{
    int i = 0;
    int nguoichoiChienThang = 1;
    for(i = 0; i < 14; i++)
    {
        if(sokytuBimat[i] == 0)
        {
            nguoichoiChienThang = 0;
        }
    }
    return nguoichoiChienThang;
}
int kiemtraKytu(char kytu, char tuBimat[], int sokytuBimat[])
{
    int i = 0;
    int kytuChinhXac = 0;
    for(i = 0; tuBimat[i] != ''; i++)
    {
        if(kytu == tuBimat[i])
        {
            kytuChinhXac = 1;
            sokytuBimat[i]= 1;
        }
    }
    return kytuChinhXac;
}

Sau khi compile xong thì nó bị như thế này

Lần chọn “n” thứ 1 nó không xác định và vẫn hiện “***********” lần nhập “n” thứ 2 thì nó xác nhận, hiểu không hiểu vì sao nó lại như thế, các bạn chia sẽ giúp mình với nhé

ntbac.1dream@gmail.com viết 10:52 ngày 01/10/2018

uppppppppppppppppppppppppppppppppppppppppppppppp

*grab popcorn* viết 10:48 ngày 01/10/2018

Vì ký tự đầu tiên bạn nhập vào là n, nhưng chương trình đọc là \n

Lần 2:

Lỗi này do bạn đặt chưa đúng vị trí while(getchar() != '\n'); thôi.

ntbac.1dream@gmail.com viết 10:56 ngày 01/10/2018

Mình ko dùng ký tự “n” cũng bị nữa =.=

ntbac.1dream@gmail.com viết 11:00 ngày 01/10/2018

về vị trí của while(getchar() != '\n'; thì mình đã test ở 1 bài khác ko sử dụng switch và vòng lặp boolean restart trò chơi while(choilai)thì nó hoạt động suôn sẻ

ntbac.1dream@gmail.com viết 10:59 ngày 01/10/2018

upppppppppppp

*grab popcorn* viết 11:01 ngày 01/10/2018

O-O sr, mình đọc reply tưởng bạn đã sữa được rồi.

Như mình nói, ở hàm dockytu, do bạn đặt while(getchar() != '\n'); chưa đúng. Nên nó nhận luôn ký tự xuống dòng ở cái lần chọn menu -> đọc sai

ntbac.1dream@gmail.com viết 11:02 ngày 01/10/2018

à mình tìm đc lỗi này rồi, vấn đề ở switch(luachon) khi mình chọn số 1 or 2 thì nó sẽ vẫn còn lưu ‘\n’ của mình trong vùng bộ nhớ đệm nên xảy ra lỗi lần nhập ký tự đầu tiên

*grab popcorn* viết 10:50 ngày 01/10/2018

9 xác rồi đó \ :v /

Để xóa đi bạn chỉ cần đặt vòng while trc khi nhập ký tự nào đó là xong.

ntbac.1dream@gmail.com viết 10:48 ngày 01/10/2018

Tks bạn nhe à bạn rành về cái cài đặt SDL_image vào CodeBlocks ko? Nếu được thì hỗ trợ teamviewer giúp mình được ko vì mình thử vài cách trang mạng rồi nhưng ko thành công chỉ thành công thư viện SDL thường thui

*grab popcorn* viết 11:03 ngày 01/10/2018

Xin lỗi, nhưng mình ko biết dùng SDL

ntbac.1dream@gmail.com viết 10:47 ngày 01/10/2018

ok vậy tks bạn nhe <3

Bài liên quan
0