源码
#include <iostream>
#include <ctime>
using namespace std;
int a[17] = {0,1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
int b[17] = {0,2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31};
int c[17] = {0,4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31};
int d[17] = {0,8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31};
int e[17] = {0,16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
short sum=0;
bool temp;
int main() {
cout << "您已进入AI猜数,请想一个0~31的整数..." << endl;
clock_t start_time = clock();
while (clock() < start_time + CLOCKS_PER_SEC * 3) {}
cout << "想好了吗?请看牌!" << endl;
// 输出数组a
cout << "第一张牌" << endl;
for (int i = 0; i < 17; i++)
{
if (!(a[i] == 0))
{
cout << a[i] << " ";
}
if ((i % 4 == 0) && (i != 0))
{
cout << endl;
}
}
cout << "这张牌里有你想的数字吗?(有答1,无答0)";
clock_t one_time = clock();
while (clock() < one_time + CLOCKS_PER_SEC * 1) {}
cin >> temp;
sum += temp * 1;
cout << endl << endl;
// 输出数组b
cout << "第二张牌" << endl;
for (int i = 0; i < 17; i++)
{
if (!(b[i] == 0))
{
cout << b[i] << " ";
}
if ((i % 4 == 0) && (i != 0))
{
cout << endl;
}
}
cout << "这张牌里有你想的数字吗?(有答1,无答0)";
clock_t two_time = clock();
while (clock() < two_time + CLOCKS_PER_SEC * 1) {}
cin >> temp;
sum += temp * 2;
cout << endl << endl;
// 输出数组c
cout << "第三张牌" << endl;
for (int i = 0; i < 17; i++)
{
if (!(c[i] == 0))
{
cout << c[i] << " ";
}
if ((i % 4 == 0) && (i != 0))
{
cout << endl;
}
}
cout << "这张牌里有你想的数字吗?(有答1,无答0)";
clock_t three_time = clock();
while (clock() < three_time + CLOCKS_PER_SEC * 1) {}
cin >> temp;
sum += temp * 4;
cout << endl << endl;
// 输出数组d
cout << "第四张牌" << endl;
for (int i = 0; i < 17; i++)
{
if (!(d[i] == 0))
{
cout << d[i] << " ";
}
if ((i % 4 == 0) && (i != 0))
{
cout << endl;
}
}
cout << "这张牌里有你想的数字吗?(有答1,无答0)";
clock_t four_time = clock();
while (clock() < four_time + CLOCKS_PER_SEC * 1) {}
cin >> temp;
sum += temp * 8;
cout << endl << endl;
// 输出数组e
cout << "第五张牌" << endl;
for (int i = 0; i < 17; i++)
{
if (!(e[i] == 0))
{
cout << e[i] << " ";
}
if ((i % 4 == 0) && (i != 0))
{
cout << endl;
}
}
cout << "这张牌里有你想的数字吗?(有答1,无答0)";
clock_t five_time = clock();
while (clock() < five_time + CLOCKS_PER_SEC * 1) {}
cin >> temp;
sum += temp * 16;
cout << endl << endl;
cout << "你想的数是..." << endl;
clock_t end_time = clock();
while (clock() < end_time + CLOCKS_PER_SEC * 1) {}
cout << sum << "!";
return 0;
}
解析
-
整体功能概述
-
这是一个简单的猜数字游戏程序。程序要求用户想一个0 - 31之间的整数,然后通过展示五组数字(每组17个数字,其中包含0和特定组合的1 - 31之间的数字),询问用户所想的数字是否在每组数字中。根据用户的回答(是为1,否为0),通过特定的计算得出用户所想的数字并输出。
-
-
包含的头文件和命名空间
-
#include <iostream>
:引入输入/输出流库,用于实现控制台的输入和输出操作。 -
#include <ctime>
:引入与时间相关的库,在这个程序中主要用于控制程序流程中的等待时间。 -
using namespace std;
:使用标准命名空间,这样就可以直接使用cout
、cin
、clock_t
等标准库中的标识符,而不需要加上std::
前缀。
-
-
全局变量定义
-
int a[17]
、int b[17]
、int c[17]
、int d[17]
、int e[17]
:这五个数组分别存储了五组数字,每组数字都包含0以及特定组合的1 - 31之间的数字。这些数组用于向用户展示数字组,以确定用户所想的数字是否在其中,并且不会占用栈空间。 -
short sum = 0;
:用于存储根据用户回答计算得出的结果,最终这个结果就是用户所想的数字,soort:短整型。 -
bool temp;
:用于临时存储用户输入的回答(是为1,否为0)bool:布尔类型(0或1)。
-
-
main
函数内部逻辑-
程序开始时,向用户提示“您已进入AI猜数,请想一个0~31的整数...”,然后使用
clock_t start_time = clock();
获取当前的时钟滴答数,并通过while (clock() < start_time + CLOCKS_PER_SEC * 3) {}
等待3秒钟。这里的clock()
函数返回从程序启动到调用时所经过的时钟滴答数,CLOCKS_PER_SEC
表示每秒的时钟滴答数。 -
接着提示“想好了吗?请看牌!”,然后开始展示五组数字并询问用户。
-
以展示数组
a
为例:-
首先通过
for
循环输出数组a
中的非0数字,每4个数字换行(通过if ((i % 4 == 0)&&(i!= 0))
判断)。 -
然后询问用户“这张牌里有你想的数字吗?(有答1,无答0)”,获取当前时钟滴答数到
one_time
,并通过while (clock() < one_time + CLOCKS_PER_SEC * 1) {}
等待1秒钟,之后使用cin >> temp;
获取用户输入(1或0),并根据用户输入将sum
加上temp * 1
(如果用户输入1,表示所想数字在这组数字中,就将1加到sum
中,否则加0)。
-
-
对于数组
b
、c
、d
、e
的操作与数组a
类似,只是在计算sum
时分别乘以2、4、8、16。
-
-
最后,提示“你想的数是...”,获取当前时钟滴答数到
end_time
,通过while (clock() < end_time + CLOCKS_PER_SEC * 1) {}
等待1秒钟,然后输出sum
的值,这个值就是根据用户回答计算得出的用户所想的数字。
-
原理
程序中的五张卡片分别代表着二进制的五个数位。
第五张 第四张 第三张 第二张 第一张
16 8 4 2 1
0 1 0 1 0
\_____________________12_______________________/
(16*0 + 8*1 + 4*0 + 2*1 + 1*0=12)
(0个16,1个8,0个4,1个2,0个1的和)