猜数字游戏

干票大的(对于我来说),做个猜数字游戏,系统给出一个随机数,你输入一个数,如果大了系统提示你数太大,太小提示你太小,直到你猜到这个数为止

首先肯定是要用到函数的,根据TDD(测试驱动开发)的基本原则,先将主函数的基本框架写出来

我们需要一个游戏菜单,从中选择我们是进入游戏(1)还是退出游戏(0),然后就是游戏的主体函数

所以主体框架如下

int main()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
              game();
              break; 
        case 0:    
               printf("退出游戏\n");
               break;
        default:
             printf("输入无效,请重新输入\n");
             break; 

        }

    } while (input);
    return 0;
}

一步步来,首先把菜单函数设计出来

void menu()
{
    printf("************************************\n");
    printf("***********     1.play    **********\n");
    printf("***********     0.exit    **********\n");

}

很简单的一个菜单,对于现阶段的我也算够用了

然后就是游戏主体

让我们想想,其实猜的过程不难写,难点在于如何让系统给出一个随机数

这里就要用到随机数函数rand()

但是如果直接调用,那么给出的随机值将会面临范围有限,数值重复,而且直接调用给出的随机值并非完全随机,这不是我们想要的结果,这需要我们调用srand()设置一个随机数种子,这里我们运用时间作为种子来进行操作(因为只会这个),而srand()只需调用一次,所以我们将他置于主函数中,避免其进入循环同时我们给出的随机数必须界定一个范围,不然玩一次不知道要猜多久,这个其实不难,由于rand函数的值范围在0-32767,所以我们只需要对rand()这个整体进行一定的数学运算就可以缩小其产生的随机数范围,综上所述,我们写出完整的game()函数

void game()
{
    //生成随机数
    int ret=0;//存放我们的随机数
    //拿时间设置随机数,因为这是一个时刻变化的数据
    int guess=0;//存放猜的数字
    
    ret = rand() % 100 + 1;
    while (1)
    {
        printf("请猜数字:>");
        scanf("%d", &guess);
        if (guess > ret)
            printf("猜大了\n");
        else if (guess < ret)
            printf("猜小了\n");
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
    }
}

将以上部分进行拼装得到最终结果

void game()
{
    //生成随机数
    int ret=0;//存放我们的随机数
    //拿时间设置随机数,因为这是一个时刻变化的数据
    int guess=0;//存放猜的数字
    
    ret = rand() % 100 + 1;
    while (1)
    {
        printf("请猜数字:>");
        scanf("%d", &guess);
        if (guess > ret)
            printf("猜大了\n");
        else if (guess < ret)
            printf("猜小了\n");
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
    }
}

void menu()
{
    printf("************************************\n");
    printf("***********     1.play    **********\n");
    printf("***********     0.exit    **********\n");
    
}
 

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
              game();
              break; 
        case 0:    
               printf("退出游戏\n");
               break;
        default:
             printf("输入无效,请重新输入\n");
             break; 

        }

    } while (input);
    return 0;
}

关于以上函数,还有一个需要解释的就是time()这个函数,这个函数用于取用时间戳,时间戳是当前时间与某个固定时间的差,单位为秒

时间戳可以是从某个参考点(例如 Unix 纪元,即 1970 年 1 月 1 日 0 时 0 分 0 秒)开始计算的,也可以是从某个特定事件(例如某次系统启动)开始计算的

关于以上程序我们需要引用的头文件包括<stdlib.h> <time.h>

如果要更完美一点则是AI的一种解法

int main() {
    srand(time(0));

    int answer;
    int guess;
    int attempt;
    int choice;

    printf("-------- 猜数字游戏 --------\n");

    do {
        answer = rand() % 100 + 1;
        attempt = 0;
        guess = 0;

        printf("\n菜单:\n");
        printf("1. 开始游戏\n");
        printf("2. 退出游戏\n");
        printf("请选择: ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            printf("\n猜数字游戏开始!\n");

            do {
                printf("请输入你的猜测(1到100之间的整数):");
                scanf("%d", &guess);
                attempt++;

                if (guess > answer) {
                    printf("猜测偏大,请再次尝试。\n");
                }
                else if (guess < answer) {
                    printf("猜测偏小,请再次尝试。\n");
                }
                else {
                    printf("恭喜你猜对了!答案是 %d。\n", answer);
                    printf("你一共猜了 %d 次。\n", attempt);
                }
            } while (guess != answer);
            break;

        case 2:
            printf("\n退出游戏。谢谢参与!\n");
            break;

        default:
            printf("无效的选择,请重新选择。\n");
            break;
        }
    } while (choice != 2);

    return 0;
}
当然在这里两种写法并无本质差别,只是AI在细节方面的处理更加完美

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值