-1

ゲーム Snake (Python で) を楽しみのためにリメイクしようとしていますが、バグに遭遇し、それを修正する方法がわかりません。ヘビの頭は正しく動き、エサを食べ、体に新しいピースを追加します。しかし、体がうまく追従しません。

私は学生なので、http://www.codeskulptor.org/を使ってプログラミングしていますが、学校のコンピューターにダウンロードすることはできません。

コードを実行してもエラーは発生しませんが、食べ物を食べると、体が作成されますが、頭の上に投げられるか、消えます。

コードのどこに問題があるのか​​ わかりません。まず、何かを食べると、コードはeat関数を実行します。この関数は、移動の反対方向でヘビにピースを追加します. 次に、時間が正しければ、移動機能を実行します。これは蛇の端から手前まで貫き、手前の駒と同じ駒を作ります。すると、頭が前に動くので、胴体はどうなるかわかりません。

誰か助けてくれませんか?

import simplegui, time, random

startTime = False
direction = None
snake = [[212.5, 212.5]]

def draw(canvas):
    global snake, food
    canvas.draw_polygon([(food[0] - 11, food[1] - 11), (food[0] + 11, food[1] - 11), (food[0] + 11, food[1] + 11), (food[0] - 11, food[1] + 11)], 1, 'red', 'red')
    for coords in snake:
        canvas.draw_polygon([(coords[0] - 11, coords[1] - 11), (coords[0] + 11, coords[1] - 11), (coords[0] + 11, coords[1] + 11), (coords[0] - 11, coords[1] + 11)], 1, 'green', 'green')
    if (snake[0] == food):
        eat()
    if (not startTime and direction != None):
        move()
    else:
        if (time.time() - startTime > 0.19 and time.time() - startTime < 0.23):
            move()

def key_handler(key):
    if (key == 37):
        left()
    elif (key == 38):
        up()
    elif (key == 39):
        right()
    elif (key == 40):
        down()

def move():
    global snake, direction, startTime
    for x in range(len(snake) - 1, 0, -1):
        snake[x] = snake[x-1]
    if (direction[0] == 0):
        snake[0][0] += direction[1]
    else:
        snake[0][1] += direction[1]
    startTime = time.time()

def eat():
    global snake, direction, food
    food = relocate()
    if (direction[0] == 0):
        snake.append([snake[len(snake) - 1][0] - direction[1], snake[len(snake) - 1][1]])
    else:
        snake.append([snake[len(snake) - 1][0], snake[len(snake) - 1][1] - direction[1]])

def relocate():
    global snake
    location = [random.randrange(13, 413, 25) - .5, random.randrange(13, 413, 25) - .5]
    for coords in snake:
        if (location == coords):
            location = relocate()
            break
    return location

def left():
    global direction
    direction = [0, -25]

def up():
    global direction
    direction = [1, -25]


def right():
    global direction
    direction = [0, 25]

def down():
    global direction
    direction = [1, 25]

food = relocate()

frame = simplegui.create_frame('Snake', 425, 425)
frame.set_keydown_handler(key_handler)
frame.set_draw_handler(draw)
frame.start()

更新: Codeskulptor には Viz モードと呼ばれるこのモードがあり、コードを段階的に実行できます。このコードの使用:

snake = [[212.5, 212.5], [212.5, 237.5]]
direction = [0, 25]
for x in range(len(snake) - 1, 0, -1):
    snake[x] = snake[x-1]
if (direction[0] == 0):
    snake[0][0] += direction[1]
else:
    snake[0][1] += direction[1]
print (snake)

Viz モードでは、体が頭に移動すると同じリストになることが示されているため、頭を移動すると、同じ配列であるため、体が頭の位置に設定されます。これは私のコードの問題ですか、それとも Codeskulptor の動作の問題ですか?

4

2 に答える 2