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

c

([email protected]) #1
#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é


([email protected]) #2

uppppppppppppppppppppppppppppppppppppppppppppppp
:cold_sweat:


(*grab popcorn*) #3

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.


([email protected]) #4

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


([email protected]) #5

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ẻ


([email protected]) #6

upppppppppppp :frowning:


(*grab popcorn*) #7

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


([email protected]) #8

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


(*grab popcorn*) #9

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.


([email protected]) #10

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


(*grab popcorn*) #11

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


([email protected]) #12

ok vậy tks bạn nhe <3


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