2013-10-24 35 views
-6

我想知道如何创建一个数组,其值为从1111开始,一直到8888.我问这是因为我需要生成一个4位数字的列表每个数字在1-8之间。我想要以循环的形式呈现。此外,我迷失在我的功能修剪,methodicalEliminate,guessAndEliminate,和guessThreeThenEndoate在我的以下程序。以下是指导:在数组中生成列表和使用函数

此作业重点介绍在程序中使用数组,包括使用一个作为函数的参数。

问题描述 在Mastermind游戏中,玩家只会被给予有限数量的猜测来尝试识别隐藏的组合(如12次猜测)。通常这是玩游戏的唯一限制。 但是,一些球员可能会互相竞争,看看谁能够以较少的尝试猜出对方的组合。在这种情况下,问题不仅在于提出一个策略,可以在指定限度内找到答案,而是找到可能需要最少猜测次数的策略。

这里是计算机进来的地方 - 人们可以编写一个程序来测试不同的猜测策略,看看它们是如何工作的。由于计算机可以比一个人更快速地进行分析和计算,因此它可以假装代表我们使用我们选择的任何策略来扮演Mastermind,并告诉我们需要多长时间才能做到这一点。

整体解决方案

当然,这将是非常困难的教电脑沿着相同的路线作为一个人的理由。例如,如果我们猜测组合1111并得到一个黑色挂钩,我们会记住,答案中只有一个1,然后继续对这一事实进行其他猜测。如果我们接下来猜测1222并且得到一个白色钉,我们就会知道没有2,并且单个1不在第一个位置。但是如何在经过一系列猜测之后对这些信息进行跟踪将会非常困难。

幸运的是,对于使用数组的计算机模拟,我们可以用不同的方式记录所有已知的事实。我们只是列出所有可能的答案,然后从列表中删除不再是解决方案的号码。如果我们的第一次猜测告诉我们只有一位数字,我们会删除所有没有该功能的数字。当我们发现没有2时,我们消除所有包含2的值。最终,剩下的唯一数字就是正确的答案。

一些简单的对策

  1. 这是许多玩家使用,类似于上述的相同的策略。只是有条不紊地以直接的方式获得可能性。 1111的第一个猜测会回答解决方案中有多少个1;接下来的猜测会回答解决方案中有多少个2,并且还会说出任何1的可能位置,以此类推。 使用我们的列表方法,其中包含从1111,1112,1113,1114等开始的大量可能性,我们的下一个猜测将始终是列表中的第一个。

  2. 下一个策略是为那些喜欢更多兴奋的人。猜测似乎或多或少是随机的,希望能够发现更多的信息。模拟这种方法非常简单 - 如果您有一个数字列表,只需随机选择一个。如果您有837种可能性在阵列中进行选择,只需在0至836范围内选取一个随机下标。

  3. 该第三种策略考虑在某种意义上给出与给定猜测类似结果的答案的可能性类似于彼此。因此,为了获得更多信息,它仍然会随机挑选一些数字,而不考虑如何评估它们,然后才开始考虑结果。 为了实现这一点,让我们选择三个可能的答案并猜测它们,暂时忽略它们为我们赚取了多少黑色挂钩和白色挂钩。只有在做出这些猜测之后,我们才会调整可能性列表,然后继续作为上面的第二个策略。

样品接口 这些是目前实施的抽查结果:请输入相结合的尝试,或者为0的随机值:0 在2475猜测

Guessing 1111... 
Guessing 2222... 
Guessing 2333... 
Guessing 2444... 
Guessing 2455... 
Guessing 2456... 
Guessing 2475... 

有条不紊的消除需要7次尝试。

Guessing 6452... 
Guessing 2416... 
Guessing 2485... 
Guessing 2445... 
Guessing 2435... 
Guessing 2425... 
Guessing 2475... 

猜测和消除所需的7次尝试。

Guessing 7872... 
Guessing 6472... 
Guessing 1784... 
Guessing 2475... 

猜猜三然后消除所需的4次尝试。

玩另一个游戏? (Y/N)Y 请输入的组合来尝试,或0的随机值:0 猜测在4474

Guessing 1111... 
Guessing 2222... 
Guessing 3333... 
Guessing 4444... 
Guessing 4445... 
Guessing 4464... 
Guessing 4474... 

有条不紊消除需要7次尝试。

Guessing 3585... 
Guessing 7162... 
Guessing 4474... 

猜测和消除所需的3次尝试。

Guessing 8587... 
Guessing 1342... 
Guessing 1555... 
Guessing 7464... 
Guessing 6764... 
Guessing 4468... 
Guessing 4474... 

猜三然后消除所需的7次尝试。 注意:该程序允许每个数字上升到8而不是6.即使有4096个可能的答案,它仍然可以很快找到它们。

程序规格 分配的程序必须执行以下所有功能。根据需要允许附加的 - 以下是必需的。未来的作业不会详细描述下面的功能 - 而是要求学生在编写程序之前先设计自己的功能描述。主要: 简单地管理程序的整体行为。一个数字将被选作目标组合 ,然后每个策略将尝试 找到它。 电话:generateAnswer,(所有三个比较必须有相同的答案) methodicalEliminate,guessAndEliminate,guessThreeThenEliminate

generateAnswer: 要么允许在键盘的用户选择的神秘组合, 或提供有选择计算机会生成一个随机组合。 (对于一款竞技游戏,可能很有趣,知道哪种组合 最难猜测!) 参数:无! 返回:一个4位数的组合,在范围为1每个数字至8

generateSearchSpace: 填充用的四位数的所有可能组合的阵列中的范围 值1到8 参数: 猜测(修改后的int数组)猜测列表 长度(输出int)列表中值的数量 前提条件: 数组必须分配给不少于4096个元素。

装饰: 分析一个特定的猜测的响应,然后从不再 可能的答案的可能性列表消除 任何值。在每种情况下,它都假定 列表中的值是答案,并相应地评估猜测。如果 的黑色和白色挂钩数量与指定的数量不相同,则 则不能成为正确的答案。 参数:猜测 猜测(改性int数组)列表 长度(改性INT)在列表 猜测(输入INT),其已被评估 黑色(输入INT)猜测多少黑色栓该猜测值的数量获得 白(输入INT)有多少白钉认为猜赢得 先决条件: 黑白真正做到含有比较 猜测与实际的答案 后置条件的结果: 长度已减少(我们学到了一些东西) 个活答案占据了第一的“长度”的猜测阵列(所以列表是短) 调用位置 :评估

methodicalEliminate: 与所有可能的候选名单开始解答了 不断猜测第一元素列表,并相应地 微调的答案,直到回答被发现 参数: 答案(输入INT)的实际答案 (必要得到黑/白栓) 返回:寻找答案需要猜测的数 调用:generateSearchSpace,eva luate,修剪

gusssAndEliminate: 与所有可能的候选名单开始回答 不断猜测随机元素的列表,并相应地 微调的答案,直到回答被发现 参数: 答案(输入INT )实际的答案 返回:找到答案 呼叫所需的猜测数:generateSearchSpace,评估,修剪

gusssThreeThenEliminate: 开始与所有可能的候选者的名单答案 第一猜测随机三个答案微调 possibilites名单之前,然后在同一时间 参数对答案缩小 一个随机猜测: 答案(输入INT)的实际答案 返回:找到答案 呼叫所需的猜测数:generateSearchSpace,评估,修剪

注意:这些最后函数使用正确的答案来评估每个 猜测,然后用黑/白栓的猜测 策略。这些策略中的任何一个都可能偷看 决定下一步做什么的答案!

ALSO:以下功能也应该出现在此项目 之前的作业中,尽管它们本身并不是 的一部分。

评价: 答案(输入INT): 通过与答案 正确性是由黑钉(在正确的位置正确的数字) 和白色钉(在不正确的位置正确的数字) 参数表示比较评价相结合(输入int)当前猜测 黑色(输出int)黑色数字 白色(输出int)白色数字 前提条件: 答案和猜测都是4位数字,没有零数字 后置条件: 黑色和白色都是> 0和它们的总和是< = 4 呼叫:nthDigit,clearNthDigit

nthDigit: 标识的组合 位数是否从左至右或从右至左计数的第n位是未指定 参数: 组合(输入INT)组合检查 位置(输入int)以检查哪个数字 (返回)(输出INT)的实际位 前置条件的值: 组合具有的数字的适当数量,并且位置< =位数 post-con dition: =返回数字< = 9(个位数)

clearNthDigit: 耳朵的组合的第n位到零,所以它不再匹配 数字必须以相同的方式作为算nth数字以上。 参数: 组合(入/出INT)组合来修改 位置(输入int)以设置为0 先决条件,其位: 的那些相同nthDigit上述 后条件: 对应位被设置为零 电话:nthDigit(可选,取决于实施)

感谢您阅读这样一个长期的问题,我希望你能帮助我在数组上!

+1

哇!这真的很长!我不确定,但我认为这个问题不适合于SO,也许你应该在programmer.stackexchange.com中提问 – deepmax

+6

我很欣赏这种努力,但实际上不应该有任何理由提供这么长的赋值说明。询问你正在专门针对你的代码的特定方面的问题,例如 - 我试图做到这一点,但我这样做的方式给了我这个,这是意想不到的。我在这里错过了什么?我到处寻找,但我似乎无法找到解决方案。 – ChiefTwoPencils

+0

你似乎有很好的提问技巧,但是你可以改进自己的风格以适应[阅读] [问]和[SSCCE](http://sscce.org)的指南。 – brasofilo

回答

0

仅仅因为你的猜测具有1111到8888的形式,并不意味着它们是数字。

如果对它们进行算术计算是有意义的,它们是数字。在猜测上定义算术计算没有任何意义:在猜测6214上添加猜测4571会有什么意义?

如果您的猜测不是数字,请不要使用为数字保留的表示形式。你可以,但是,使用的四个整数数组:

int guesses[4][4096]; 
int g = 0; 
for (int i = 1; i <= 8; ++i) 
    for (int j = 1; j <= 8; ++j) 
    for (int k = 1; k <= 8; ++k) 
     for (int m = 1; m <= 8; ++m) 
     guesses[g++] = {i, j, k, m}; 

我非常确信,把所有可能猜测到阵列guesses一样,是也不是个好主意;该代码主要演示如何产生猜测。

通过其他功能,想想应该对剩下的问题进行高级别的操作(比如“消除在第三位具有一定数量的所有猜测”等)。这应该给你一个关于替换guesses阵列的更好的数据结构的想法。