c语言实现-猜数字-游戏

197 阅读3分钟

(一)游戏涉及的语法知识

  1. do while()循环
  2. 函数
  3. switch语句
  4. printf与scanf
  5. rand()生成随机数
  6. srand()设置随机数种子
  7. time()时间戳

(二)构建游戏主框架

请看下面这段代码:

#include<stdio.h>
void menu()
{
    printf("###########\n");
    printf("###1.play##\n");
    printf("###0.exit##\n");
    printf("###########\n");
}

int main()
{   
    int input = 0;
    do
    {
        menu();
        printf("请输入你的选择:");//提示用户输入
        //int input = 0;
        scanf("%d",&input);
        switch(input)    //由于input只有0,1两种(有限且离散)情况,所以用switch
        {
            case 1:
                //玩游戏
                break;
            case 0:
                //退出游戏
                break;
            default:
                //非法输入
                break;
                
        }

        
    }while(input);//此处用input控制循环是因为恰好input==0时既满足了退出游戏的情况,
                  //也满足了退出循环情况

    return 0;
}

上面switch旁注释提到,变量的情况“有限且离散”用switch合适。那么分支语句if.. elseif...和switch该怎么选择呢?请看下面示例

#include<stdio.h>
int main()
{
    int age = 0;
    scanf("%d",&age);
    if(age<18)
    {
        printf("未成年\n");
    }
    else if(age<=45)
    {
        printf("青年\n");
    }
    else if(age<60)
    {
        printf("中年\n");
    }
    else
    {
        printf("老年\n");
    }



    return 0;
}


可以看到,当变量的情况是“范围”时,用if....elseif合适。

(三)填充实现细节

好,回到本主题,接下里我们现在需要完善switch语句的case1,case0,default

 switch(input)
        {
            case 1:
               game();//调用函数
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入非法,请重新输入\n");
                break;
                
        }

函数game()的实现如下:

void game()
{
    int r = rand()%100+1;//在此之前需要设置随机数种子,不然生成的随机数是伪随机的
    int guess=0;
    while(1) //一直猜,直到猜中位置,猜中用break跳出
    {
        printf("请输入你猜的数字\n")
        scanf("%d",&guess);
        if(guess>r)
        {
            printf("大了\n");
        }
        else if(guess<r)
        {
            printf("小了\n");
        }
        else
        {
            printf("猜中了\n");
            break;
        }
    }
    
}

上面提到,要设置随机数种子,我们c语言中,利用srand()来设置种子,并且只需要在程序一开始设置一次就好了。如下:

int main()
{   
    int input = 0;
    srand((unsigned int)time(NULL))//在程序一开始就设置种子
                                //此处time()是时间戳,用于动态设置种子
    do
    {
        menu();
        printf("请输入你的选择:");
        scanf("%d",&input);
        switch(input)    
        {
            case 1:
                //玩游戏
                break;
            case 0:
                //退出游戏
                break;
            default:
                //非法输入
                break;
                
        }

        
    }while(input);
    return 0;
}

(四)整合及运行效果

最后整合在一起:

#include<stdio.h>
#include<time.h>
void menu()
{
    printf("###########\n");
    printf("###1.play##\n");
    printf("###0.exit##\n");
    printf("###########\n");
}
void game()
{
    int r = rand() % 100 + 1;//在此之前需要设置随机数种子,不然生成的随机数是伪随机的
    int guess = 0;
    while (1) //一直猜,直到猜中位置,猜中用break跳出
    {
        printf("请输入你猜的数字:");
        scanf("%d", &guess);
        if (guess > r)
        {
            printf("大了\n");
        }
        else if (guess < r)
        {
            printf("小了\n");
        }
        else
        {
            printf("猜中了\n");
            break;
        }
    }

}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));//在程序一开始就设置种子
        //此处time()是时间戳,用于动态设置种子
    do
    {
        menu();
        printf("请输入你的选择:");//提示用户输入

        //int input = 0;
        scanf("%d", &input);
        switch (input)    //由于input只有0,1两种(有限且离散)情况,所以用switch
        {
        case 1:
            game();//调用函数
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入非法,请重新输入\n");
            break;

        }


    } while (input);//此处用input控制循环是因为恰好input==0时既满足了退出游戏的情况,
    //也满足了退出循环情况

    return 0;
}

运行效果如下: image.png