【问题标题】:python script for Mastermind solving stops unexpectedly (also gives error after increasing range)用于Mastermind解决的python脚本意外停止(增加范围后也会出错)
【发布时间】:2015-04-07 10:15:06
【问题描述】:

我已尝试在此处调整给定脚本之一:

How to solve the "Mastermind" guessing game?

当我试图获得以下结果时:

数字 = 4

变量 = 10

times_until = 100

...我没有任何问题。但是当我尝试将“变量”增加到 12 个程序时,在稍微进步后停止。

我还有另一个问题,如果我将 'times_until' 更改为 500 程序会给我如下错误:

 Traceback (most recent call last):
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 72, in <module>
                        rungame(hidden_code, strategy_allrand)
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 58, in rungame
                restart_game()
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 37, in restart_game
                rungame(hidden_code, strategy_allrand)
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 58, in rungame
                restart_game()
                ...
                ...
                restart_game()
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 37, in restart_game
                rungame(hidden_code, strategy_allrand)
                File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 50, in rungame
                print ("That's it.  After %d tries, I won." % (i+1,))
                File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/idlelib/PyShell.py", line 1347, in write
                return self.shell.write(s, self.tags)
                RuntimeError: maximum recursion depth exceeded while calling a Python object
                >>>

请注意,我对 python 并不了解——即使是一点点——。刚刚在大学里听过一次关于它的讲座,但没有任何其他经验。只需要将它调整为一个项目并从中检索一些结果。

这是我在下面改编的代码。如果有人提到我做错了什么导致这些错误,我会很高兴。

                import random
                #from itertools import izip, imap
                try:
                # Python 2
                from itertools import izip
                from itertools import imap
                except ImportError:
                # Python 3
                izip = zip
                imap = map


                digits = 4
                variables = 10
                times_until = 500
                maxtries = 25
                times_done = 0
                average_cal = 0

                fmt = '%0' + str(digits) + 'd'
                searchspace = tuple([tuple(map(int,fmt % i)) for i in range(0,variables**digits)])

                def compare(a, b, imap=imap, sum=sum, izip=izip, min=min):
                count1 = [0] * variables
                count2 = [0] * variables
                        strikes = 0
                for dig1, dig2 in izip(a,b):
                if dig1 == dig2:
                strikes += 1
                count1[dig1] += 1
                count2[dig2] += 1
                balls = sum(imap(min, count1, count2)) - strikes
                return (strikes, balls)

                def restart_game():
                hidden_code = random.choice(searchspace)
                rungame(hidden_code, strategy_allrand)

                def rungame(target, strategy, verbose=True):#, maxtries=):
                possibles = list(searchspace)
                for i in range(maxtries):
                g = strategy(i, possibles)
                #if verbose:
                #print ("Out of %7d possibilities.  I'll guess %r" % (len(possibles), g),)
                score = compare(g, target)
                #if verbose:
                #print (' ---> ', score)
                if score[0] == digits:
                if verbose:
                print ("That's it.  After %d tries, I won." % (i+1,))
                global times_done
                times_done += 1

                global average_cal
                average_cal += (i+1)

                if times_done <= times_until:
                restart_game()
                else:
                print ("That's it. Average %f " % (average_cal/times_until,))
                break
                        possibles = [n for n in possibles if compare(g, n) == score]
                return i+1

                def strategy_allrand(i, possibles):
                return random.choice(possibles)



                if __name__ == '__main__':
                hidden_code = random.choice(searchspace)
                rungame(hidden_code, strategy_allrand)

【问题讨论】:

  • 格式化您的源代码。目前的形式很难阅读。

标签: python python-2.7 python-3.x


【解决方案1】:

我从你的代码中了解到,你从函数restart_game调用函数rungame,如果

if times_done <= times_until:

你从rungame调用restart_game。因此,如果 times_until 变量超过某个值,您将得到最大递归深度超出错误。 你会得到一系列嵌套调用的形式

rungame(...)
restart_game(...)
rungame(...)
restart_game(...)
...

要增加最大递归深度,您可以使用 sys.setrecursionlimit 函数。但是更好的解决方案是以这种方式重写您的代码 摆脱递归。

【讨论】:

  • 对不起,我仍在尝试格式化代码,我也是 stackoverflow 的新手:p,谢谢,我会查看 sys.setrecursionlimit 函数,因为我不认为我可以用更好的方式重写它。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2016-10-30
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多