mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

C++编程基础: 9. 猜数字小游戏

2025-04-13 12:38:06

本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们主要实现的是一个猜数字小游戏。

在这一节课里,我们综合之前课程的知识点来实现了一个猜数字的小游戏。首先让机器随机生成一个1到100之间的整数,然后在输出端提示用户输入一个整数来猜猜这个随机数是多少,获得输入后要先检测输入的内容是否是整数,不是的话要重新输入。接到合格的整数输入后,如果输入的数字与生成的随机数一致,则可提示成功后退出程序,否则程序会提示随机数比输入的数是高了还是低了,然后让用户再次输入猜测的数字,直到猜中为止。用流程图来描述这一过程的话,如下图:

Image

随机数的生成需要用到3个函数rand, srand和time,time(0)函数返回一个以秒为单位的系统时间,这个秒数是从1970年1月1日午夜0时开始计算的,用它作为srand的参数时,系统可能会警告隐式转换失去整数精度的问题,可以用强制类型转换来解决,即在time(0)前加上(int)或者(unsigned int)。srand是为了生成随机数的种子,不同的种子,才能“长出”不同的随机数,如果不在使用rand函数之前调用srand函数,每次产生的随机数将不会发生变化。

srand((int)time(0));

为了生成一个1到100之间的随机数,在调用rand函数后让得到的值用100来取余,使值在0到99之间,再做加1操作即可。

int randomInt = rand()%100+1;

由于这里我用的开发工具是Xcode,在加入了预处理编译指令#include <iostream>后就不用再包含这几个函数所属的头文件stdlib.h和time.h了,但在其他的编译环境,可能还需在程序前面加上如下两条指令:

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

获得随机数之后,就可以通过do-while(true)这样的无限循环结构来不断地让用户输入猜想的数字并和生成的随机数进行比较了,只有当猜想的数字和生成的随机数相等时才使用break;语句跳出这个无限循环。

完整程序实现如下:

#include <iostream>
int main(int argc, const char * argv[]) {
    using std::cout;
    using std::endl;
    using std::cin; 
    int x;
    srand((int)time(0));
    int randomInt = rand()%100+1;
    cout<<"A random integer (1 to 100) has been created."<<endl;
    do{
        cout<<"Please guess the number:"<<endl;
        if(cin>>x&&cin.get()=='\n'){
            if(x==randomInt){
                cout<<"That's right! The number is "<<x<<endl;
                break;
            }else{
                if(x<randomInt){
                    cout<<"The random number is higher."<<endl;
                }else{
                    cout<<"The random number is lower."<<endl;
                }
            }
        }else{
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            cout<<"Please input an integer!"<<endl;
        }
    }while(true);
    return0;
}