LzxLeo 发表于 2022-12-20 09:25

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:01

本帖最后由 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;
}

LzxLeo 发表于 2022-12-28 11:39

smilencetion 发表于 2022-12-20 15:01
说到猜数字,以前看别人发的题也写了一个,还挺好玩的,位数长了以后要好好推理才行



看到你这个,想起了之前爆火的那个猜单词游戏Wordless
也是很有意思的一种思路

coolcalf 发表于 2022-12-20 12:28

windows下,好歹给个弄个界面~

seawaycao 发表于 2022-12-20 12:32


谢谢分享!

tencentma 发表于 2022-12-20 14:30

这个代码挺清晰的

huaxincanmeng 发表于 2022-12-21 17:47

不错不错

automatic 发表于 2022-12-22 01:14


谢谢楼主的分享{:301_992:}

lzg6664 发表于 2022-12-22 23:16

感觉挺有意思的,学习一下{:1_899:}

zhushui 发表于 2022-12-23 18:36

感谢分享
页: [1] 2 3
查看完整版本: C++原创 - 猜数游戏