python - 我的 Python 状态机陷入无限循环

标签 python state-machine

我是Python新手。我的代码遇到无限循环,不断添加和打印 numberCycles。我的 C++ 逻辑运行良好。 请您帮忙找出原因吗?

  • 第一行输入是模拟次数。
  • 下一行是单个生殖周期的分钟数。
  • 下一行是行数 (x),后跟一个空格,然后是列数 (y)。
  • 下一组 y 行将包含 x 个字符,其中一个句点 (.) 代表空格和一个大写字母 B 代表一只起始兔子尝试向方向复制。如果有一只兔子,它就会去 sleep 。
<小时/>

输入.txt

2     # 2 simulations
5     # 5 minutes/cycle
3 3   # 3*3 map
...
.B.
...
1
4 4
B.BB
..B.
...
B.B
<小时/>

现货.py

#!/usr/bin/env python

class Spot(object):
    isBunny = bool()
    nextCycle = 0
    UP = 0
    RIGHT = 1
    DOWN = 2
    LEFT = 3
    SLEEP = 4

    def __init__(self, newIsBunny):
        self.isBunny = newIsBunny
        self.nextCycle = self.UP

    def setNextCycle(self):
        if (self.nextCycle != self.SLEEP):
            self.nextCycle += 1

    def getNextCycle(self):
        return self.nextCycle

    def getIsBunny(self):
        return self.isBunny

    def makeBunny(self):
        if not self.isBunny:
            self.nextCycle = self.UP
        self.isBunny = True

兔子.py

#!/usr/bin/env python
from Spot import Spot
import os

class Bunny(object):    
    @classmethod
    def main(cls, args):
        with open(os.path.expanduser('~/Desktop/input.txt')) as f: 
            numSims = int(f.readline()) 
            myMap = []  
            print numSims
            minPerCycle= int(f.readline()) 
            print minPerCycle
            for k in xrange(numSims): 
                xyLine= f.readline()
                row = int(xyLine.split()[0]) 
                col = int(xyLine.split()[1])  
                print row,col
                for i in range(0,row): 
                    myLine = f.readline() 
                    myMap.append([]) 
                    for j in range(0,col): 
                        myMap[i].append(Spot(myLine[j] == 'B')) 

                numCycles = 1

                if cls.isFilled(row,col,myMap):
                    numCycles = 0

                while not cls.isFilled(row,col,myMap):
                    numCycles += 1
                    print numCycles
                    for m in range(0,row): 
                        for n in range(0,col): 
                            if myMap[m][n].getIsBunny():
                                if myMap[m][n].getNextCycle() == Spot.UP:
                                    if m>0:
                                        myMap[m-1][n].makeBunny()
                                    break
                                elif myMap[m][n].getNextCycle() == Spot.RIGHT:
                                    if n<col-1:
                                        myMap[m][n+1].makeBunny()
                                    break
                                elif myMap[m][n].getNextCycle() == Spot.DOWN:
                                    if m<row-1:
                                        myMap[m+ 1][n].makeBunny()
                                    break
                                elif myMap[m][n].getNextCycle() == Spot.SLEEP:
                                    if n>0:
                                        myMap[m][n- 1].makeBunny()
                                    break
                            myMap[m][n].setNextCycle() 
                time = numCycles * minPerCycle
                print "It took " , time , " minutes for the bunnies to take over the world!\n"
                del myMap[:]
            f.close()

    @classmethod
    def isFilled(cls,row,col,myMap):
        for a in range(0,row): 
            for b in range(0,col): 
                if not myMap[a][b].getIsBunny():
                    return False
        return True


if __name__ == '__main__':
    import sys
    Bunny.main(sys.argv)

最佳答案

它永远不会向左走。此外,您还为内部循环设置了中断,因此永远不会调用 myMap[m][n].setNextCycle()。我刚刚看到your C++ code并且您将其转换为 Python 时出现错误(使用 Spot.SLEEP 而不是 Spot.LEFT)。

break 语句在 C++ 中有意义,因为您想要中断 switch。在这里,您使用的是 if..else

应该是这样的:

while not cls.isFilled(row, col, myMap):
    numCycles += 1
    print numCycles
    for m in range(0,row): 
        for n in range(0,col): 
            if myMap[m][n].getIsBunny():
                if myMap[m][n].getNextCycle() == Spot.UP:
                    if m>0:
                        myMap[m-1][n].makeBunny()
                elif myMap[m][n].getNextCycle() == Spot.RIGHT:
                    if n<col-1:
                        myMap[m][n+1].makeBunny()
                elif myMap[m][n].getNextCycle() == Spot.DOWN:
                    if m<row-1:
                        myMap[m+ 1][n].makeBunny()
                elif myMap[m][n].getNextCycle() == Spot.LEFT:
                    if n>0:
                        myMap[m][n-1].makeBunny()

            myMap[m][n].setNextCycle()

关于python - 我的 Python 状态机陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12615842/

相关文章:

python - 尝试打印包含多个字典的列表内容时出错

C block 作用域

neural-network - 图灵完备性有多大用处?神经网络图灵完备吗?

c# - 在(通过转换为状态机)递归生成器方法中摆脱 'yield' 的最简单方法?

javascript - Getconnection() 不适用于状态机

python - 如何在 python 控制台中一次输入多个命令

python - 为什么 Python 在执行前没有发现错误?

python - 如何使用python在递归中正确返回值?

python - 在 Google App Engine 上使用 Python 进行开发时,我应该使用什么模拟对象框架?

c# - 简单的词法解析器