C++珠玑妙算

C++ AI解珠玑妙算(mastermind)算法 珠玑妙算这个游戏大家都不陌生,规则就不多说了,直接进主题: 需要破译的密码由四位组成,每位可以是0~9中的任意数字。eg. (1544,4301,0918,...) 此算法可在20步内猜测出结果。 算法大致步骤分为两步: 第一步:求出这串密码是由哪四个数字组成。从0000迭代到9999就行,第一步最多需要十次猜测。 第二步:将由第一步得出的四个数字全排列,把全排列结果存在一个集合里。然后依次返回集合里的猜测并通过猜测结果做简单的划分。对集合进行进一步的消除从而减少猜测次数。 划分规则如下: 当 阅读详情

前言

最近一直想做珠玑妙算的小游戏,今天就给大家分享一下。

效果

1
2

系统制作

首先我们来做头文件,里面定义一个class game_system。

public

public:
	void startGame() {
    	PrintRules();
   	 	RunGame();
	}

private

变量

string guess, ans; //答案和猜测
int digit; //挑战位数

PrintRules

这段代码简单粗暴,用来解释规则:
系统随机生成n位的随机数,没有任意位是相同的。然后你猜一个数,猜完系统会给你两个提示。
第一个数代表数字和位置都猜对的数字个数,第二个数代表只有数字猜对的数字个数。

void PrintRules() {
        printf("                              MASTERMIND\n");
        printf("The rules of this game is:\n  1. The computer will randomly create a number.");
        printf("And every number in this number is different.\n");
        printf("  2. You will guess the number in each round, and the computer will give you two hints.\n");
        printf("The first number output is the number of numbers and positions guessed correctly");
        printf(", and the second number output is the number of numbers guessed correctly only.GoodLuck!\n");
    }

GetDigit

这段代码作用是获得玩家希望挑战的数字位数(3到7之间),这个值难度比较适中。当然,你可以自行根据需要调整,注意最大值不要超过10。

void GetDigit() {
    printf("Please enter the digit of the number ");
    printf("that you want to challange in this round of 'MASTERMIND'(3 - 7):");
    for (;;) {
        cin >> digit;
        if (digit <= 7 && digit >= 3) break;
        else printf("\nWrong input, please enter again\n");
    }
    printf("\n");
}

randomNumber

这段代码用来创作没有重复数位且第一位不是0的随机数

void randomNumber() {
    string choice = "123456789";
    srand(time(nullptr));
    int r = rand() % choice.size(); //创建从0到8的随机数做选择的下标
    ans += choice[r]; //答案后面加上随机选择的字符
    choice.erase(r, 1); //删除已选择过的选项
    choice += '0'; // 最高为不是零,将'0'加入选项
    for (int i = 1; i < digit; ++i) {
        srand(time(nullptr));
        r = rand() % choice.size();
        ans += choice[r];
        choice.erase(r, 1);
    }
}

获得合法输入

checkInput
bool checkInput() {
    string comp;
    for (int i = 0; i < guess.size(); ++i) {
        if (count(comp.begin(), comp.end(), guess[i]) > 0) return false; //判断是否重复
        else comp += guess[i]; //否则将遍历到的字符存入已出现字符串里
    }
    if (guess.size() != digit) return false; //若字符串大小超过选择挑战位数,返回假
    return true; //若合法,返回真
}
getInput
void getInput() {
    for (;;) {
        cin >> guess;
        if (checkInput()) break; //不停输入直到合法
        else printf("Wrong input, please enter again:");
    }
}

RunGame

函数都写完了,现在我们写运行游戏的函数。

void RunGame() {
    GetDigit(); //获得挑战位数
    randomNumber(); //获得随机数
    for (;;) {
        int all = 0, half = 0; //创建变量:数位皆猜对个数,数猜对个数
        getInput();
        for (int i = 0; i < digit; ++i) {
            if (ans[i] == guess[i]) ++all; //若位置和数字都猜对则提示第一个数加1
            else {
                for (auto j : guess) {
                    if (ans[i] == j) { //如果数字猜对则提示第二个数加1
                        ++half;
                        break;
                    }
                }
            }
        }
        if (all == digit)  { //若全部数位猜对,游戏胜利
            printf("Correct!");
            break;
        }
        else printf("%d%c%d\n", all, ' ', half); //否则输出提示
    }
}

头文件

#ifndef ABACUSCALCULATION_H_INCLUDED
#define ABACUSCALCULATION_H_INCLUDED

#include <iostream>
#include <algorithm>
#include <ctime>
#include <vector>
#include <string>
using namespace std;

class game_system
{
public:
    void startGame() {
        PrintRules();
        RunGame();
    }
private:
    string guess, ans;
    int digit;
    void RunGame() {
        GetDigit();
        randomNumber();
        for (;;) {
            int all = 0, half = 0;
            getInput();
            for (int i = 0; i < digit; ++i) {
                if (ans[i] == guess[i]) ++all;
                else {
                    for (auto j : guess) {
                        if (ans[i] == j) {
                            ++half;
                            break;
                        }
                    }
                }
            }
            if (all == digit)  {
                printf("Correct!");
                break;
            }
            else printf("%d%c%d\n", all, ' ', half);
        }
    }
    void PrintRules() {
        printf("                              MASTERMIND\n");
        printf("The rules of this game is:\n  1. The computer will randomly create a number.");
        printf("And every number in this number is different.\n");
        printf("  2. You will guess the number in each round, and the computer will give you two hints.\n");
        printf("The first number output is the number of numbers and positions guessed correctly");
        printf(", and the second number output is the number of numbers guessed correctly only.GoodLuck!\n");
    }
    void GetDigit() {
        printf("Please enter the digit of the number ");
        printf("that you want to challange in this round of 'MASTERMIND'(3 ¡ª 7):");
        for (;;) {
            cin >> digit;
            if (digit <= 7 && digit >= 3) break;
            else printf("\nWrong input, please enter again\n");
        }
        printf('\n');
    }
    void randomNumber() {
        string choice = "123456789";
        srand(time(nullptr));
        int r = rand() % choice.size();
        ans += choice[r];
        choice.erase(r, 1);
        choice += '0';
        for (int i = 1; i < digit; ++i) {
            srand(time(nullptr));
            r = rand() % choice.size();
            ans += choice[r];
            choice.erase(r, 1);
        }
    }
    bool checkInput() {
        string comp = "";
        for (int i = 0; i < guess.size(); ++i) {
            if (count(comp.begin(), comp.end(), guess[i]) > 0) return false;
            else comp += guess[i];
        }
        return guess.size() == digit;
        return true;
    }
    void getInput() {
        for (;;) {
            cin >> guess;
            if (checkInput()) break;
            else printf("Wrong input, please enter again:");
        }
    }
};

#endif // ABACUSCALCULATION_H_INCLUDED

请将此文件存放于正确的路径:xxx\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++
这个路径是Codeblocks::IDE的路径,如有其他需求请自行调整。
否则也可以随便放一个位置然后

#include <盘名:\\路径\AbacusCalculation.h>

main()

最后,创建新的C++源文件,代码如下:

#include <AbacusCalculation.h> // 路径名请自行调整

int main() {
    game_system game;
    game.startGame();
}

Github 源代码链接

github

程序员面试金典——解题总结: 9.17中等难题 17.5珠玑妙算游戏 #include #include #include #include #include using namespace std; /* 问题:珠玑妙算游戏的玩法如下。 计算机有4个槽,每个槽坊一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如计算机可能有RGGB四种(槽1位红色,槽2、3位绿色,槽4位蓝色)。 作为用户,你视图猜出颜色组合。打个比 阅读详情

相关推荐

珠玑妙算

珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。 给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜

Nnnn的博客 3321

C++ 珠心算测验

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。最近老师出了一些测验题,请你帮忙求出答案。

QMonsoon 1424

C++珠玑妙算头文件(实用)

内容概要: 基本都是代码,解释可参见 https://editor.youkuaiyun.com/md/?articleId=125415267 若要使用务必放到文件夹里的正确位置: E:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++ 可更据个人编译软件路径不同调整文件路径。

洛谷P2141珠心算测验 C++解法

#include<stdio.h> #include <iostream> #include <iomanip> #include<cmath> using namespace std; /* 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。 他随机生成一个正整数集合,集合中的数各不相同, 然后要求学生回答:其中有多少个数,恰好等于集合...

laqqqq的博客 2492

皮卡丘:

项目名称: 画一只小动物 预览地址: 温馨提示:请使用PC查看,小动物比较害羞,使用手机查看可能会犹抱琵琶半遮面 项目简介: 页面分为上下两部分展示 上部分展示项目的主要CSS样式 下半部分展示用CSS画出的小动物 页面右上角的按钮点击可以选择播放,暂停和三种速度展示CSS代码 技术栈: 使用HTML / CSS /原生JavaScript

CSAPP performance lab

CSAPP 深入理解计算机系统的performance Lab

weixin_46091531的博客 1251

[NOIP2014]珠心算测验 T1

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?最近老师出了一些测验题,请你帮忙求出答案。输入 输入共两行,第一行包含一个

superbia的博客 1368

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712

LT8711UX是一款高性能C/DP1.2型至HDMI2.0转换器,用于将USB Type-C源或DP1.2源连接到HDMI2.0接收器。该LT8711UX集成了一个DP1.2兼容的接收器,和一个HDMI2.0兼容的发射器。此外,还包括两个CC控制器,用于CC通信,以实现DP Alt模式和功率传输功能,一个用于上游Type-C端口和另一个用于下游端口。

weixin_63518914的博客 1639

C++题目练习第十天__ 珠玑妙算

当进入内循环时,进行判断一维该下标数据的标志位是否已经为1(表示位置及字符都猜正确)或者二维该下标数据的标志位是否已经为1(表示字符都猜正确),continue至下个数值进行伪数值判断,判断位置正确则统计伪数据正确,并进行标记。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。声明一个二维作为标志作用的数组,一维用来记录该数据是否猜对(一维下标位置正确赋值1),二维数组用来记录该数据是否伪猜对数值(二维下标位置伪正确赋值1)。,编写一个方法,返回猜中和伪猜中的次数。

weixin_64076388的博客 534

【系列06】端侧AI:构建与部署高效的本地化AI模型 第5章:模型剪枝(Pruning)

结构化剪枝移除的是模型中的整个结构,比如一个完整的神经元、一个卷积核或一个通道。修剪后的模型权重矩阵仍然是稠密的,因此能够充分利用现代硬件和软件的并行计算优势,从而显著提升推理速度。非结构化剪枝是最细粒度的剪枝方法。对于需要极致压缩但对推理速度要求不高的场景,非结构化剪枝是好的选择。它就像修剪一棵树,通过移除模型中不必要的“枝叶”,让模型变得更精简、更高效,从而适应资源受限的设备。,开发者可以方便地对模型的不同层进行剪枝,并根据需求进行微调,从而在不影响太多性能的前提下,获得一个更轻量、更高效的模型。

学习,输出==》再学习再输出 649

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

LeetCode 面试题 16.15. 珠玑妙算

易错题

英雄哪里出来 512

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

本文介绍了一个基于Python的多视角三维重建系统的实现,涵盖了特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。首先,系统通过安装必要的库(如OpenCV、NumPy等)并加载图像数据,初始化相机参数。接着,系统使用SIFT、SURF或ORB算法提取图像特征点,并通过FLANN或BF方法进行特征匹配,应用Lowe's ratio test筛选优质匹配。该系统为后续的相机位姿估计和三维重建奠定了基础,能够从多视角图像中恢复三维场景结构。

huanghm88的专栏 614

程序员面试金典 - 面试题 16.15. 珠玑妙算(map计数)

1. 题目 珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。 例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。 作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。 要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪...

Michael是个半路程序员 3671

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

本文介绍了在项目开发中实现坐标转换的方法,重点解析了两个关键函数UF_MTX4_csys_to_csys和UF_MTX4_vec3_multiply的使用。通过4个变换矩阵(transform1-4)实现工作坐标系与绝对坐标系之间的相互转换,并以圆柱体为例详细说明了坐标转换的具体实现过程,包括原点、X/Y轴方向的转换处理。相比之前采用的if-else判断方法,这种矩阵转换方式在代码复杂度和运行效率上都更具优势。

weixin_47753171的博客 599

好玩的珠玑妙算-加作弊带概率空间+日志存储240705mindMaster

珠玑妙算masterMind带计算概率空间 带日志

aw344的专栏 268

手把手教你实现RK3588的Secure Boot:密钥烧录与镜像签名验证

摘要:本文详细介绍了瑞芯微RK3588平台下SecureBoot的密钥烧录与镜像签名验证实现方法。首先阐述了SecureBoot的工作原理、安全优势及其在RK3588智能安防、工业控制等场景中的重要作用。接着分步骤指导了硬件准备、软件工具配置、密钥对生成等准备工作,并详细说明了进入烧录模式、工具选择配置、密钥烧录执行等关键操作流程。文章还解析了镜像签名生成与验证机制,包括启动验证流程和常见故障处理方法。最后对SecureBoot在RK3588设备中的未来应用进行了展望,强调其与TrustZone等安全技术融

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2045

上海计算机学会2022年5月月赛C++丙组T2珠玑妙算(一)

上海计算机学会2022年5月月赛C++丙组T2珠玑妙算(一)题解

全栈工程师Linda的博客 490

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

面试题 16.15. 珠玑妙算

面试题 16.15. 珠玑妙算 珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。 给定一种颜色组合solution和一个猜测guess,

Tzecto 172

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上海市计算机学会月赛 2022年5月月赛丙组

上海市青少年算法竞赛月赛2022年5月月赛丙组

Dsmtyu《-这是一串密码哦 1926

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

珠玑妙算益智小游戏 C语言从入门到入土(入门特别篇)_编写一个游戏程序珠玑妙算。

整数值加上‘0’,可以得到对应的数字字符。

2401_84975963的博客 324

【面试题】 16.15. 珠玑妙算

题目:珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。 给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪

漆黑梦工厂 152
上一篇: C++指定范围内随机数生成
下一篇: C / C++小数固定位数输出
peter_code
博客等级 码龄5年 41粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值