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     \n");
        printf("1. Huong dan choi\n");
        printf("2. Bat dau choi\n");
        scanf("%d",&chedo);
        switch(chedo)
        {
        case 1:
        {
            printf("Ban co 1 cau hoi va 10 luot doan\n");
            printf("Ban phai tim duoc cau tra loi trong 10 luot doan\n");
            printf("Neu het 10 luot ban van chua tim duoc cau tra loi, thi ban se thua cuoc\n");
            break;
        }
        case 2:
        {
            char kytu = 0;
            char tuBimat[]= "NGUYENTRUNGBAC";
            int sokytuBimat[14]= {0};
            int soluotDoan = 10;
            int i = 0;
            printf("Cau hoi tro choi:\n");
            printf("Ty phu tre tuoi nhat Viet Nam la ai? \n");
            printf("     Tro choi bat dau     \n");

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

                if(!kiemtraKytu(kytu,tuBimat,sokytuBimat))
                {
                    soluotDoan--;
                }
            }
            if(win(sokytuBimat))
                printf("\n\nChuc mung, ban da chien thang!\nTu bi mat la: %s",tuBimat);
            else
                printf("\n\nXin chia buon, ban da thua!\nTu bi mat la: %s",tuBimat);
            break;
        }
        }
        printf("\n\nTro choi ket thuc!! \n");
        printf("Ban cho muon choi lai khong?\n");
        printf("Lua chon 1 de choi lai, lua chon 0 de thoat tro choi\n");
        printf("Lua chon cua ban la: ");
        scanf("%d",&choilai);
    }
    return 0;
}
char docKytu()
{
    char kytuNhapVao = 0;
    kytuNhapVao = getchar();
    kytuNhapVao = toupper(kytuNhapVao);

    while(getchar() != '\n');
    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] != '\0'; 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é

uppppppppppppppppppppppppppppppppppppppppppppppp
:cold_sweat:

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.

2 Likes

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

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ẻ

upppppppppppp :frowning:

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

2 Likes

à 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 :smiley:

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.

2 Likes

Tks bạn nhe :smiley: à 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

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

2 Likes

ok vậy tks bạn nhe <3

1 Like

Bạn đặt while(getchar()!=’\n’); sau phần: scanf("%d",&chedo); là trò chơi không bị khi mình nhấn chữ cái đầu tiên mà nó bỏ qua. Mình cũng đã cải tiến trò chơi, một người nhập vào và người thứ 2 thì đoán ký tự.

int chedo;
printf("TRO CHOI NGUOI TREO CO \n");
printf("1. Nguoi choi thu 1 nhap ky tu \n");
printf("2. Nguoi choi thu 2 bat dau choi \n");
printf("Lua chon cua ban la: ");
scanf("%d",&chedo);
***while(getchar()!='\n');***
switch(chedo)

Bài viết hoàn thành, các bạn có thể tham khảo bên: https://vn-z.vn/threads/goc-lap-trinh.37860/page-5

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?