-2

開始点がグリッドの中央で、ユーザーが列と行の数を指定する、グリッド全体のランダムな動きをグラフ化するプログラムを作成しています。現在の問題は、プログラムの終了を知らせる必要がある 2 つの変化する変数があることです。X は水平移動用、Y は垂直移動用です。どちらかがグリッドの外に出たら、プログラムを終了する必要があります。現時点では、1 つの変数がオフになると、もう一方がオフになるまで実行を続けます。(例.垂直方向にグリッドから外れても、プログラムはランダムな方向を選択して水平方向に移動し続けます。水平方向にも同じことが言えます。)したがって、どちらかが移動したときに終了するようにプログラムを作成する方法がわかりません。両方を待つのではなく、オフにします。ここに私がこれまでに持っているものがあります:

import random
def rightmove(width, px):
px += 1
if px > width:
    return px
else:
    return px

def leftmove(width, px):
px -= 1
    if px == -1:
    return px
else:
    return px

def downmove(height, py):
py += 1
if py == height:
    return py
else:
    return py

def upmove(height, py):
py += 1
if py == -1:
    return py
else:
    return py

def main():
height = raw_input("Please enter the desired number of rows: ")
height = int(height)
width = raw_input("Please enter the desired number of columns: ")
width = int(width)
px = round(width/2)
px = int(px)
py = round(height/2)
py = int(py)
print "Manhattan (" + str(width) + ", " + str(height) + ")"
print "(x, y) " + str(px) + " " + str(py)
topy = height + 1
topx = width + 1
while 0 <= px <= width:
    while 0 <= py <= height:
    s = random.randint(0, 1)
    if s == 0:
        x = random.randint(0, 1)
        if x == 0:
            px = leftmove(width, px)
            if px <= 0:
                print "Direction E (x, y) " + str(px)
            else:
                print "Direction E"
        else:
            px = rightmove(height, px)
            if px <= width:
                print "Direction W (x, y) " + str(px)
            else:
                print "Direction W"
    else:
        y = random.randint(0, 1)
        if y == 0:
            py = downmove(height, py)
            if py <= height:
                print "Direction S (x, y) " + str(py)
            else:
                print "Direction S"
        else:
            py = upmove(height, py)
            if py <= 0:
                print "Direction N (x, y) " + str(py)
            else:
                print "Direction N"


main()

意図した出力のサンプルを次に示します。

>>> manhattan(5,7)
(x, y) 2 3
direction N (x, y) 1 3
direction N (x, y) 0 3
direction S (x, y) 1 3
direction W (x, y) 1 2
direction S (x, y) 2 2
direction E (x, y) 2 3
direction S (x, y) 3 3
direction W (x, y) 3 2
direction N (x, y) 2 2
direction W (x, y) 2 1
direction E (x, y) 2 2
direction W (x, y) 2 1
direction N (x, y) 1 1
direction N (x, y) 0 1
direction S (x, y) 1 1
direction W (x, y) 1 0
direction E (x, y) 1 1
direction W (x, y) 1 0
direction W
4

2 に答える 2

1

これは、実際のインデントされたコードを見ない推測にすぎませんが、問題は次のとおりだと思います。

while 0 <= px <= width:
    while 0 <= py <= height:
        # a whole mess of logic

py範囲外になると、内側のループをエスケープしますが、範囲外になるまでその内側のループを繰り返し続けますpx

px範囲外になると、範囲外になるまで内側のループ内に留まりますpy

あなたが望むのは、どちらかが範囲外になるとすぐに逃げることです. つまり、両方が境界内にある限り継続する単一のループが必要です。英語から Python に直接翻訳できるもの:

while 0 <= px <= width and 0 <= py <= height:
    # same whole mess of logic
于 2013-09-05T22:06:36.673 に答える
0

適切なインデントを使用したwhileループは次のようになると思います。

while 0 <= px <= width:
    while 0 <= py <= height:
        s = random.randint(0, 1)
        if s == 0:
            x = random.randint(0, 1)
            if x == 0:
                px = leftmove(width, px)
                if px <= 0:
                    print "Direction E (x, y) " + str(px)
                else:
                    print "Direction E"
            else:
                px = rightmove(height, px)
                if px <= width:
                    print "Direction W (x, y) " + str(px)
                else:
                    print "Direction W"
        else:
            y = random.randint(0, 1)
            if y == 0:
                py = downmove(height, py)
                if py <= height:
                    print "Direction S (x, y) " + str(py)
                else:
                    print "Direction S"
            else:
                py = upmove(height, py)
                if py <= 0:
                    print "Direction N (x, y) " + str(py)
                else:
                    print "Direction N"

これがあなたが持っているものなら、解決策は簡単です。まず、if px <= 0:if py <= 0:の両方を使用するように変更します>=

次に、終了を意味する各 print ステートメントの後に return ステートメントを追加します。例えば:

if px >= 0:
    print "Direction E (x, y) " + str(px)
else:
    print "Direction E"
    return

return ステートメントを使用する場合は、2 つのネストされたwhileループの代わりに、単純に を使用できますwhile True:

または、必要に応じて、whileabarnert が提案したようにループの条件を変更でき、return ステートメントを入れることを心配する必要はありません。

于 2013-09-05T22:08:34.640 に答える