在C中没有限制的猜谜游戏中保持得分

时间:2015-12-02 12:47:20

标签: c arrays function if-statement

我正在通过制作一个简单的猜谜游戏来练习C编程。我在一些笔记中发现了这个问题,如下:

“编写一个播放数字猜谜游戏的应用程序:程序选择一个到一百个之间的随机数。然后用户猜出数字,程序告诉用户该数字是高于还是低于他们的猜测,直到用户猜对了。一旦用户正确猜到了数字,程序就应该告诉用户它花了多少猜测,并提供再次玩游戏。猜测成为玩家的得分。最小猜测成为最高分。 “

我编写了游戏编码,它运行正常。我创建了一个单独的函数来保存外部文件中的最高分(最少猜测)并且它可以工作。问题是它每次都会重写最高分。我想把最高分初始化为1,但猜测的数量不能少于此。注意,猜测的数量不受限制。 我该如何解决这个问题?

这是我的代码:

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

int readScore(void);
void saveScore(int score);

int main(){
    int menu=0;
    char name[16];
    int counter=0;
    int rand_num, score;
    int guess=0;

    FILE *fscore;

    while(menu != 4){
        printf("\n\n****** NUMBER GUESSING GAME MENU v1.0 ******\n");
        printf("\t1.Create Player Name.\n\t2.Play.\n\t3.View Score.\n\t4.Quit.\n");
        printf("***************************************\n");
        printf("Your Choice: ");
        scanf("%d", &menu);

        if(menu == 1){
            printf("Enter a player name: ");
            scanf("%15s", name);
        }
        else if(menu == 2){
            srand(time(NULL));
            rand_num = 1 + rand()%100;
            while(guess != rand_num){
                printf("\nGuess the number picked: ");
                scanf("%d", &guess);
                if(guess > rand_num){
                    printf("\nNumber is smaller than your guess.");
                }
                else if(guess < rand_num){
                    printf("\nNumber is greater than your guess.");
                }
                counter++;
            }
            printf("\nYour guess is correct!!\n");
            printf("Number of guesses: %d\n", counter);
            if(counter < score){
                saveScore(counter);
            }
        }
        else if(menu == 3){
            int score = readScore();
            printf("\nThe best score is: %d\n", score);
        }
    }
    return 0;
}
int readScore(void){
    // Read the score from file
    FILE *fscore = fopen("score.txt", "r");
    int score=1;
    fscanf(fscore, "%d", &score);
    fclose(fscore);
    return score;
}

void saveScore(int score){
    // Save the score to file
    FILE *fscore = fopen("score.txt", "w+");
    fprintf(fscore, "%d", score);
    fclose(fscore);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

测试fopen()

的返回值
FILE *fscore = fopen("score.txt", "r");
if (fscore == NULL) /* file does not exist
                    ** no games have been played */
                    return -1;

然后,在主程序中,测试-1

的结果
        else if(menu == 3){
            int score = readScore();
            if (score < 0) printf("No games have been played.\n");
            else printf("\nThe best score is: %d\n", score);
        }

答案 1 :(得分:0)

下面!你创建了一个变量得分,它没有定义的值,可能包含大的垃圾值让我们说 123456 !!因此 计数器总是小于得分 !!所以你的程序将保存新的高分!!

现在你的程序将运行一个新的循环!!但是在得分中仍然没有高分!因为你没有宣布得分的价值是多少!!因此,它再次使用得分作为 123456 !!即使你的新分数超过你的最后一个高分 !!它将取代你的最后一个高分 .....

这样做:

<强> 1。在运行main

时,将您的(int)分数与最后一个高分进行分配
int main(){
....//all your declarations;
    FILE* fscore;
    fscore = fopen("score.txt", "r");
    if(fscore!=NULL){
        fscanf(fscore, "%d", &score);
    }
    else if(fscore == NULL){           //if you haven't got any score in score.txt
        score = //lets_put_a_large_random_value;
    }
    fclose(fscore);
    // Now all the remaining codes begins....
}

我还在你的程序中发现了一些小错误: -

<强>我。如果您的程序选择menu == 1,程序将在取用用户名

后终止

<强> II。 void savescore(int score);不需要返回值..

<强> III。您在main()函数

中两次声明相同的 int score

希望您的程序现在正常运行!!