吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2775|回复: 20
收起左侧

[C&C++ 原创] C++原创 - 猜数游戏

[复制链接]
LzxLeo 发表于 2022-12-20 09:25
闲暇之余写的!(绝对不是网课摸鱼
看到论坛有人发过C C# Java Python 易语言做的,居然没有C++?
填上!
[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程序。

免费评分

参与人数 4吾爱币 +6 热心值 +4 收起 理由
yunbaixi + 1 + 1 用心讨论,共获提升!
zhushui + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
kingzswang + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

smilencetion 发表于 2022-12-20 15:01
本帖最后由 smilencetion 于 2022-12-20 15:08 编辑

说到猜数字,以前看别人发的题也写了一个,还挺好玩的,位数长了以后要好好推理才行

[C] 纯文本查看 复制代码
猜数字

1.输入要猜的数字的位数n(n<=10)
2.计算机随机生成一个n位数(各位数字相异)

3.输入猜测的数字 给出提示信息如:A1B2 
A表示位置和数字均正确的个数,B表示位置不正确但是数字正确的个数

4.根据提示信息继续猜数字

1次内猜对 给出天才提示
8次内猜对 给出大神提示
16次内猜对 给出有潜力提示
16次仍没有猜对 给出需努力提示



2022-12-20_150640.png
[C] 纯文本查看 复制代码
#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[10];

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[t] == 1);
        a[t] = 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;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
LzxLeo + 1 + 1 我很赞同!

查看全部评分

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

[mw_shl_code=c,tru ...

看到你这个,想起了之前爆火的那个猜单词游戏Wordless
也是很有意思的一种思路
coolcalf 发表于 2022-12-20 12:28
seawaycao 发表于 2022-12-20 12:32

谢谢分享!
tencentma 发表于 2022-12-20 14:30
这个代码挺清晰的
huaxincanmeng 发表于 2022-12-21 17:47
不错不错
automatic 发表于 2022-12-22 01:14

谢谢楼主的分享
lzg6664 发表于 2022-12-22 23:16
感觉挺有意思的,学习一下
zhushui 发表于 2022-12-23 18:36
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表