C语言 记忆测试(Memory Test)小游戏的实现

刘晓燕老师的C Programming Language选修课作业。


一、问题说明

原问题描述如下:

The problem is to write a memory-test game. The computer displays a sequence of digits on the screen for a short period of time. The player then has to memorize them, and when the digits disappear from the screen, he must enter exactly the same sequence of digits. Each time the player succeeds, he can repeat the process to get a longer list of digits to try. The objective is to continue the process for as long as possible.

问题是编写一个记忆测试游戏。 计算机在短时间内在屏幕上显示一系列数字。 玩家必须记住它们,当数字从屏幕上消失时,他必须输入完全相同的数字序列。 每次玩家成功时,他都可以重复该过程以获取更长的数字列表来尝试。 目标是尽可能延续这一过程。

显然,这就是设计一个能输出数字并能比对输入的数字的程序。

二、流程设计

根据题目可大致设计如下流程:

记忆测试游戏流程图
图1 记忆测试游戏流程图

三、程序设计

  1. 数字串的输出
    调用<stdlib.h>中的rand()函数,一个一个数地输出。调用<time.h>中的clock()函数,定义wait_time和show_time后,使用对clock() - wait_time < show_time * CLOCKS_PER_SEC的判断达到数字串输出一定时间的效果。之后退格并输出空格,实现字符串消失的效果。
  2. 输入与判断
    对于数字串的输入,一开始考虑调用scanf()函数,但由于scanf()函数在不用空格分开的情况下,不能一次只读入一个数字。于是改成了getchar()函数。使用getchar()函数获取输入的数字,再将其的ASCII码值与前面生成的数字进行比较。
  3. 游戏的结束
    如果数字串输入完全正确,数字串加长、时间增加,进入下一轮游戏。如果输入错误,通过break停止判断,输出正确答案和本次游戏的分数。游戏分数是根据玩家正确输入的数字串的数字总个数决定的。之后用户可选择是否重来。

四、程序源代码

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

int main()
{
    time_t seed=0;
    time_t wait_time=0;
    int show_time=1;
    unsigned int i=1;
    char choose='1';
    char input1;
    unsigned int score=0;
    unsigned int input2;
    unsigned int flag=1;

    printf("准备好进行记忆测试了吗?\n");
    printf("屏幕上即将显示一串数字,你是否能记住它们呢?\n");
    printf("输入正确就可以挑战更高的难度了!\n");
    printf("按回车键开始!\n");
    getchar();
    printf("那么就开始吧!\n");
    int length=3;
    while(choose=='1'){
        for(;;length+=2,show_time++)
            {
                wait_time = clock();
                srand(time(&seed));
                for(i = 1; i <= length; i++)
                    printf("%u", rand() % 10);
                for( ; clock() - wait_time < show_time * CLOCKS_PER_SEC;);
                for(i=1; i<=length; i++)
                printf("\b \b");
                printf("\n记住了吗?那么就试试吧:");
                srand(seed);

                for(i = 1; i <= length; i++)
                {
                    input1=getchar();
                    input2=(int)input1-(int)'0';
                    if(input2 != rand() % 10)
                    {
                        printf("很遗憾!错误。正确答案:");
                        srand(seed);
                        for(i = 1; i <= length; i++)
                            printf("%u", rand() % 10);
                        flag=0;
                        break;
                    }
                }
                fflush(stdin);
                if(flag==0)break;
                score=score+length;
                printf("正确!继续挑战!下一个是:\n");
            }

       printf("\n你本次的分数为:%u\n是否重来?\n是-----1  否-----0\n",score);
       choose=getchar();
       if(choose=='1')printf("再来一次:\n");
       else printf("本次游戏结束,再见!");
       fflush(stdin);
    }
    return 0;
}

五、程序测试

这里写图片描述
图2 程序运行演示

经测试,达到预期效果。

参考资料:C语言实现简单的记忆力测试游戏

猜你喜欢

转载自blog.csdn.net/twentyonepilots/article/details/80513070