C++原创 - 猜数游戏
闲暇之余写的!(绝对不是网课摸鱼看到论坛有人发过C C# Java Python 易语言做的,居然没有C++?
填上!
#include "ZhilingPack.h" // 可以在 https://raw.githubusercontent.com/girl-zhiling/ZhilingPack/main/ZhilingPack.h 获取
int main(){
loop:srand_set(); // 设定随机数种
SetConsoleTitleA("猜数游戏 | 当前尝试次数为 0 "); // 设定标题
int num = 0, input_num = 0, min = 0, max = 0, try_times = 0; // 定义初始变量 , 分别为
// num : 要猜的数字 input_num : 输入的数字 min :最小范围 max :最大范围 try_times : 尝试次数
std::string title = "猜数游戏 | 当前尝试次数为 ", time = std::to_string(try_times), final_title; // 定义初始字符串 , 分别为
// title : 标题模板 time : 次数 , 使用 to_string() 转换 final_title : 两者结合,最终出现的标题
std::cout << "请输入最小值:"; // 要求输入最小值
std::cin >> min; // 用户输入
std::cout << "请输入最大值:"; // 要求输入最大值
std::cin >> max; // 用户输入
num = random_number(min, max); // 赋值要猜的数字
auto start = std::chrono::system_clock::now(); // 起始时间
while(true){ // 循环往复猜数过程
std::cout << "输入你要猜的数:"; // 要求输入猜的数值
std::cin >> input_num; // 用户输入
try_times++; // 尝试次数自增
time = std::to_string(try_times); // 将尝试次数转换为字符串
final_title = title + time; // 将标题模板与最终标题结合
SetTitle(final_title); // 设定标题
if (input_num == num) break; // 如果二者相等 , 退出循环
if (input_num < num){ // 提示信息 : 小了 或 大了
std::cout << "小了!"; // 提示小了
}else std::cout << "大了!"; // 提示大了
}
auto end = std::chrono::system_clock::now(); // 结束时间
std::chrono::duration<double> duration_chrono = end - start; // 经过的时间 , 以 chrono::duration 储存
int duration = duration_chrono.count(); // 转换为 int 整型
std::cout << "猜对了!答案就是" << num << "\n"; // 猜中的信息
std::cout << "您一共用了" << try_times << "次在范围" << min << "-" << max << "中猜中!\n"; // 展示次数
std::cout << "耗时 : " << duration << "秒\n"; // 展示耗费时间
system("pause"); // 停止
system("cls"); // 清屏
goto loop; // 再来一次
}
二分法最快,Win32程序。
本帖最后由 smilencetion 于 2022-12-20 15:08 编辑
说到猜数字,以前看别人发的题也写了一个,还挺好玩的,位数长了以后要好好推理才行
猜数字
1.输入要猜的数字的位数n(n<=10)
2.计算机随机生成一个n位数(各位数字相异)
3.输入猜测的数字 给出提示信息如:A1B2
A表示位置和数字均正确的个数,B表示位置不正确但是数字正确的个数
4.根据提示信息继续猜数字
1次内猜对 给出天才提示
8次内猜对 给出大神提示
16次内猜对 给出有潜力提示
16次仍没有猜对 给出需努力提示
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CNT 16
long long getnum(int);
long long guessnum(int, long long);
int has(long long, int);
int count = 0;
int a;
int main(void)
{
int n, A, B, t;
long long num, guess;
do
{
printf("请输入位数n(1<=n<=10):");
t = scanf("%d", &n);
while (getchar() != '\n')
continue;
} while (t != 1 || n < 1 || n > 10);
putchar('\n');
num = getnum(n);
guess = guessnum(n, num);
while (count < CNT)
{
A = B = 0;
long long tmpN = num;
long long tmpG = guess;
while (tmpN)
{
A += tmpN % 10 == tmpG % 10;
B += has(num, tmpG % 10) && (tmpN % 10 != tmpG % 10);
tmpN /= 10;
tmpG /= 10;
}
printf("猜测结果:A%dB%d\n\n", A, B);
if (A < n && count < CNT)
{
guess = guessnum(n, num);
continue;
}
else
break;
}
if (count == CNT && A < n)
puts("还需努力");
else if (count > 8)
puts("有潜力");
else if (count > 1)
puts("大神");
else if (count == 1)
puts("天才");
return 0;
}
long long getnum(int n)
{
long long num = 0;
srand((unsigned)time(NULL));
for (int i = 0, t; i < n; i++)
{
do
{
t = rand() % 10;
} while ((i == 0 && t == 0 && n > 1) || a == 1);
a = 1;
num = 10 * num + t;
}
return num;
}
long long guessnum(int n, long long num)
{
long long guess;
int t;
do
{
count++;
printf("第%d次猜测,请输入你的猜测(%d位数):", count, n);
t = scanf("%I64d", &guess);
while (getchar() != '\n')
continue;
} while ((int)log10(guess) != (int)log10(num) || t != 1);
return guess;
}
int has(long long a, int b)
{
while (a)
{
if (a % 10 == b)
return 1;
a /= 10;
}
return 0;
} smilencetion 发表于 2022-12-20 15:01
说到猜数字,以前看别人发的题也写了一个,还挺好玩的,位数长了以后要好好推理才行
看到你这个,想起了之前爆火的那个猜单词游戏Wordless
也是很有意思的一种思路 windows下,好歹给个弄个界面~
谢谢分享! 这个代码挺清晰的 不错不错
谢谢楼主的分享{:301_992:} 感觉挺有意思的,学习一下{:1_899:} 感谢分享