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é
Bài liên quan
uppppppppppppppppppppppppppppppppppppppppppppppp
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.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ụngswitch
và vòng lặp boolean restart trò chơiwhile(choilai)
thì nó hoạt động suôn sẻupppppppppppp
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à 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
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.
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
Xin lỗi, nhưng mình ko biết dùng SDL
ok vậy tks bạn nhe <3