Game Chiếc Nón Kỳ Diệu Trên C

Mình đang viết game Chiếc nón kỳ diệu trên C. Có vấn đề mình cần mọi người trợ giúp?

thay vì nó ra:
H----
-A—
–N--
—O-
-----I
mà mình muốn ra HANOI thì làm sao?

Mình không hiểu ý bạn lắm ?

:v Bạn dùng mảng lưu kết quả như thế nào?
Ở trên mình nghĩ chắc bạn khởi tạo lại mảng mỗi lần lặp?
Nói chung là xin code để tìm lỗi dễ hơi :stuck_out_tongue:

2 Likes

bạn lưu từ cần đoán là HANOI vào 1 mảng tĩnh,sau đó đếm phần tử của mảng tĩnh đó để cáp phát động cho 1mảng,mảng này dùng để lưu các từ đoán đúng của người chơi-> để so sánh vs mảng HANOI,mảng động này ban đầu khởi tạo gt cho các phần tử là’*’.Tiếp theo,khi người chơi đoán 1 chữ nếu đúng(cần viết 1 hàm kt sự có mặt của từ ng chơi đoán) thì thay đổi gt của mảng động.Trò chơi này mình đã làm rồi,nếu bạn có thắc mắc gì thìinhf sẵn lòng trả lời :smiley:

Thêm cái system("color B") cho đẹp xíu :smiley: Dùng mảng xử lý problems này nhé!

Code của mình đây. Mọi người xem sai chỗ nào nhé!

theo mình nghĩ thì nếu muốn in ra kết quả những chữ cái đã đoán đúng thì dùng một mảng nữa có độ lớn trùng với mảng câu trả lời, mảng này có 2 giá trị 0 và 1, 0 là chưa đoán đc còn 1 là đoán đc. Lúc in ra kết quả thì xét mảng này là biết đoán đc chữ nào thôi :slight_smile:

Mình cũng nghĩ như bạn Giang Son Nguyen là tạo 1 mảng nữa có độ dài tương tự như mảng trả lời, theo như trên là quatrinh[] = “-----”. Mỗi 1 lần khi bạn đoán 1 chữ cái thì sẽ check trong mảng trả lời xem có từ đó ko, nếu có thì thay chữ cái đó vào mảng quatrinh[] (vị trí có thể lấy từ mảng trả lời hoặc bạn từ điền vào), nếu không thì thôi. Mỗi lần bạn chỉ cần in mảng quatrinh[] ra thôi

Mình hiểu rồi! Cảm ơn bạn

Ngoài ra bạn có thể tạo ra một chuỗi toàn các dấu trừ cùng kích thước với “HANOI”. khi đoán trúng thì dấu trừ biến thành kí tự cùng vị trí trong “HANOI”. Khi in ra bạn chỉ việc in chuỗi đó ra.
Cách dùng mảng bool cũng khá hay, tự mình không nghĩ ra được :>

Mình củng từng làm bài này nên chia sẻ cho bạn:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>//toupper();
#include <time.h>


int main(int argc, char* argv[])
{
    FILE* filePointer = NULL;
    filePointer = fopen("file1.txt", "r+");
    char stringg[1000] = "", guessLetter, tempStr[1000] = "", stringGetAll[1000] = "";
    int i =0, j = 0, check, checkInputLetter = 0, getAllWord = 0, right,\
    randomWord = 0, numberWord = 0, currentLetter = 0;
    // Tinh so luong cac tu khoa numberWord bang cach tinh so luong '\n'
    do{
        currentLetter = fgetc(filePointer);
        if(currentLetter == '\n')
            numberWord++;
    } while(currentLetter != EOF);
    // Chon mot so bat ky giua 0 va numberWord
    srand(time(NULL));
    randomWord = (rand()%(numberWord - 0 + 1)) + 0;
    // Dua con tro ve dau tap tin
    rewind(filePointer);
    while(i != randomWord){
        currentLetter = fgetc(filePointer);
        if(currentLetter == '\n')
            i++;
    }
    if(filePointer != NULL){
        fgets(stringg, 1000, filePointer);
        printf("Tu khoa co %d chu cai\n",strlen(stringg) - 1);
        for(i = 1; i < strlen(stringg); i++)
            printf("*");
         for(i = 0; i < strlen(stringg) - 1; i++){
                tempStr[i] = '*';
            }
        do{
            right = 0;
            printf("\nBan co muon doan luon tu khoa khong?\t1-Yes\t2-No");
            scanf("%d", &getAllWord);
            if(!(getAllWord - 1)){
                printf("Moi ban nhap tu khoa:\n");
                fflush(stdin);
                gets(stringGetAll);
                if(strlen(stringg) - 1 == strlen(stringGetAll)){
                    for(i = 0; i < strlen(stringg) - 1; i++){
                        if(stringg[i] == stringGetAll[i]){
                            right++;
                        }
                        else{
                            printf("Khong chinh xac!\n");
                            break;
                        }
                    }
                if(right == strlen(stringg) - 1){
                    break;
                }
                }
                else printf("Khong chinh xac!\n");
            }
            check = 0;
            do{
                checkInputLetter = 0;
                printf("\nGuess a letter!");
                fflush(stdin);
                guessLetter = getchar();
                guessLetter = toupper(guessLetter);
                for(i = 0; i < strlen(stringg) - 1; i++){
                    if(guessLetter == tempStr[i]){
                        checkInputLetter++;
                    }
                }
                if(checkInputLetter){
                    printf("\nBan da doan ky tu nay roi!");
                }
            } while(checkInputLetter);
            for(i = 0; i < strlen(stringg) - 1; i++){
                if(stringg[i] == guessLetter){
                    tempStr[i] = guessLetter;
                    j++;
                    check++;
                }
            }
            if(check){
                printf("\nCo %d chu %c!", check, guessLetter);
            }
            else{
                printf("\nKhong co chu %c nao!", guessLetter);
            }
            printf("\n%s", tempStr);
        } while(j != strlen(stringg) - 1);
        fclose(filePointer);
        printf("Great!You have already got the word. Congratulation!\a\n");
    }
    else{
        printf("Failed to open file");
    }
    fflush(stdin);
    getchar();
    return 0;
}

còn đây là nội dung file1.txt để cùng thư mục với file .exe bạn nhé
FACEBOOK
CHELSEA
MANCHESTERCITY
MANCHESTERUNITED
LIVEPOOL
BARCELONA
REALMADRID
ARSENAL

Vậy vd như HANOI thì có chuoi[] = ‘-----’. Nếu đoán trúng chữ H thì dấu “-” đầu tiên thay thế bằng chữ H. Làm sao để in ra 4 dấu “-” còn lại. Còn nếu đoán trúng chữ N thì làm sao để ra zậy: --N–.

Vd cho chuỗi s[] = “HOCHIMINH” có chiều dài 9.
-Nếu đoán trúng chữ H thì làm sao để in ra như thế này:
H–H----H
–Nếu đoán trúng chữ I thì làm sao để in ra như thế này:
H–HI-I-H

Dòng này là sao bạn? Với biến ý nghĩa của biến right

cách dễ nhất là bạn làm 1 cái mảng int char_count[26][100] tức là mảng 2 chiều 26 dòng 100 cột, với quy ước là không có từ nào quá 98 ký tự. Trong đó
char_count[0] cho biết về thông tin số chữ A có trong từ đang hỏi
char_count[1] cho biết về thông tin số chữ B có trong từ đang hỏi
char_count[2] cho biết về thông tin số chữ C có trong từ đang hỏi

char_count[25] cho biết về thông tin số chữ Z có trong từ đang hỏi

char_count[i] là mảng 1 chiều 100 số nguyên, trong đó:
số nguyên đầu tiên [0] chỉ có giá trị 0 hoặc 1, cho biết là ký tự thứ i đã được người chơi chọn hay chưa.
số nguyên thứ hai [1] chứa số lượng ký tự thứ i có trong từ đang hỏi, nếu ko có thì có giá trị 0.
các số nguyên còn lại chứa vị trí ký tự thứ i xuất hiện trong từ đang hỏi.

ví dụ cho từ “HOCHIMINH”, mảng char_count ban đầu sẽ mang giá trị

0 0 -
0 0 -
0 1 2
0 0 -
0 0 -
0 0 -
0 0 -
0 3 0 3 8
0 2 4 6
0 0 -
0 0 -
0 0 -
0 1 5
0 1 7
0 1 1
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -
0 0 -

viết lại cho gọn là

[C] 0 1 2
[H] 0 3 0 3 8
[I] 0 2 4 6
[M] 0 1 5
[N] 0 1 7
[O] 0 1 1

khi người chơi đoán chữ H (lưu ở char guess, từ đang đoán ban đầu là secret mang giá trị ---------

  • tra char_count[guess-'A'][0]: nếu là 0 thì tiếp tục, nếu là 1 thì output là đã đoán chữ H rồi.
  • tra char_count[guess-'A'][1]: nếu là 0 thì output “Không có chữ H”. nếu lớn hơn 0 thì duyệt lần lượt char_count[guess-'A'][j] với j = 2 tới char_count[guess-'A'][1] + 1, ví dụ ở đây là từ 2 tới 4, ta có các index lần lượt là 0, 3, 8, gán secret[0] = guess, secret[3] = guess, secret[8] = guess. Thu được H--H----H, xuất chuỗi này ra.

rồi cứ thế mà chạy, tới khi hết limit thì người chơi thua, hoặc thêm 1 biến đếm số lượng chữ cái đã được mở, nếu mở hết thì người chơi thắng.

1 Like

Đúng rồi! Bạn có thể chỉ mình cách làm dc ko?

bạn đã hoàn thành chương trình chiếc nón kì diệu này chưa, có thể cho mình tham khảo không.

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