智囊团解决方案的python脚本意外停止(增加范围后也会出现错误)

2024-10-01 13:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在这里修改一个给定的脚本:

How to solve the "Mastermind" guessing game?

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

数字=4

变量=10

次_until=100

…我没有任何问题。但当我试图增加'变量'到12个程序停止后,一点点进展。你知道吗

另外,我还有一个问题,如果我将“times\u 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)

Tags: inpygameiflinecodeusershidden
1条回答
网友
1楼 · 发布于 2024-10-01 13:29:54

我从代码中了解到,您从函数restart\u game调用函数rungame,如果

if times_done <= times_until:

从rungame调用restart\u game。所以,若times_until变量超过某个值,则得到最大递归深度超出误差。 您将得到一系列嵌套调用

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

以增加可以使用的最大递归深度系统设置递归限制功能。但是一个更好的解决方案是用这种方式重写代码 摆脱递归。你知道吗

相关问题 更多 >