ゲーム 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 の動作の問題ですか?