1A2B猜数小游戏,电脑猜,C代码编写 您所在的位置:网站首页 3625小游戏 1A2B猜数小游戏,电脑猜,C代码编写

1A2B猜数小游戏,电脑猜,C代码编写

2024-05-27 23:59| 来源: 网络整理| 查看: 265

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结

前言

猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。查了网上很多关于这个游戏的帖子,大多都是计算机出题,人来猜。有非常多种策略可以实现七步之内猜出答案,但大部分跟算法相关,需要数据功底,这里介绍一个简单的反向穷举法,快速且易实现。

游戏规则:

0-9 10个数字设为4位密码数字不重复。现在猜这个密码,每次电脑猜完人会提示,如果数字且位置都对则显示为A,数字对位置错显示B,例如:密码为0123, 猜0134, 则提示为2A1B。可以9次以内保证可以猜对的策略。这次是电脑猜,人给提示。

人猜电脑给提示参考:1AB2链接

游戏基本步骤

首先需要说明游戏下规则

人写一个四位数的密码,每一位数都可以从0到9选一个,但四位数字不能有重复的。如4415这个密码就是不行的。0可以放到开头,如0123这样也是可以的。这是答案,电脑猜题人要猜的。猜题电脑打印一个自己猜测的密码,格式同上。写完后展示给人观看。人根据猜题电脑的数字回答几A几B,其中A的个数表示猜题电脑猜测的数字位置正确的数的个数,B表示数字正确而位置不对的数的个数。例如出题人写下的密码是1564,猜题人写下的是7514,这时人就要输入给电脑2A1B。电脑根据出题人提供的提示继续猜一个密码,出题人后续也要给出相应提示。直到电脑猜中出题人写下的数字,游戏结束。统计一下电脑猜了多少次。   算法思路

电脑最擅长的穷举法一个一个来猜,列出所有答案,通过提示一一排除不需要的错误答案,剩下最后一个即为正确答案,答案总共有5040种。即是:第一次,固定猜 0123;然后,人必定要给出一个正确的提示:XAXB(X代表数字)①。然后,电脑从0124开始搜索,每次加1,并分别和0123相比较,得到XAXB,找到与0123比较答案一样为XAXB的不重复所有新数字串,这里面的 数字串即有正确答案;选择这里面得第一个数字串为下一个猜的数字,如果对,则结束,如果不对,则人又会给出第二个提示XAXB-1,此时,我们从第二步中的新数字串猜的数的下一个开始继续搜索,对比获取满足XAXB-1的不重复数字串,把他存入又一个新的数字串里;以次类推····             可见,越往后猜,候选答案需要满足的约束条件越多,即越有可能是标准答案。如:当猜到第7步还没猜中时,第8步猜测的候选答案必须同时满足前7次的猜测记录,因此,越往后,排除掉的越多,加速越快。当搜索到数字串里没有数字时,则说明人的提示有误。             到这里,大家是否明白这种算法的原理呢?总结:就是,电脑从0124开始,假设它是正确答案,那么它和0123相比得到的XAXB,必然与正确答案和0123相比得到的XAXB相同;一直对比下去就会得到正确答案,即我们所猜测的候选答案与之前猜测的数字串相比,得到的XAXB序列,必然与历史记录完全相同,否则便可排除。             此算法的优点:实现简单,时间空间复杂度都不高,而且最多不超过9步可完成游侠,。

C代码实现 #include"stdio.h" // 全局变量ab int ab = 0; /** ** @brief: 电脑猜数输出 ** @param: number:表示猜的数字,a:记录提示A的值,b:记录提示B的值 **/ void Guess(int *num, int* a, int* b) { printf("I guess the number: %d%d%d%d ?\n", num[0],num[1],num[2],num[3]); printf("the number of A B:"); scanf("%d %d", a, b); } /** ** @brief: 比较两个4位数的位置和数值情况 ** @param: num1,num1:两个数组的指针,数组存了4个数字.ab:比较后AB的值 **/ int compare(int* num1, int* num2) { ab = 0; for(int i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有