2

私はここ数か月間、python を学ぼうとしてきましたが、知識をさらに向上させるためにスネーク ゲームを作成することにしました。何が悪いのかわかりませんが、ループの出力でスタックします。私は複数のことを試しましたが、どれも成功につながりませんでした。これが私のコードです:

import pygame, sys
from pygame.locals import *
from collections import deque

pygame.init()

clock = pygame.time.Clock()

background = [
    ['++++++++++++++++++++++++++++++'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['+                            +'],
    ['++++++++++++++++++++++++++++++']]



screen_surface = background
y, x = 7, 14
location = (y, x)

snake_head = '@'
snake_body = 'x'
direction = 'left'
past_moves = deque([(7, 15), (7, 16), (7, 17), (7, 18)])

def Clear_ScreenSurface():
    screen_surface = background

def Draw_ScreenSurface():
    for i in range(15):
         a = screen_surface[i][:]
         if i == 14:
             return
         print a


def Update_Past_Moves():
    past_moves.popleft()

def Print_Snake_Body():
    for i in range(len(past_moves)):
        a1 = past_moves[i][0] - 1
        a2 = past_moves[i][1] - 1
        screen_surface[a1][a2:(a2 + 1)] = snake_body

def Print_Snake_Head():
    screen_surface[location[0]][location[1]:(location[1] + 1)] = snake_head

def Check_Collision():
    if location[1] == 0 or location[1] == 29:
        pass
    if location[0] == 0 or location[0] == 14:
        pass
    for a in range(len(past_moves)):
        a = a - 1
        if location[0] == past_moves[a][0] and location[1] == past_moves[a][1]:
        pass

def main():

    direction = 'left'
    y, x = 7, 14
    location = (y, x)
    while 1:
        Print_Snake_Head()
        Print_Snake_Body()
        Draw_ScreenSurface()
        Clear_ScreenSurface()
        past_moves.append(location)

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    direction = 'up'
                elif event.key == pygame.K_LEFT:
                    direction = 'left'
                elif event.key == pygame.K_DOWN:
                    direction = 'down'
                elif event.key == pygame.K_RIGHT:
                    direction = 'right'

        if direction == 'up':
            location = (y - 1, x)
            y, x = location[0], location[1]
        if direction == 'left':
            location = (y, x - 1)
            y, x = location[0], location[1]
        if direction == 'down':
            location = (y + 1, x)
            y, x = location[0], location[1]
        if direction == 'right':
            location = (y, x + 1)
            y, x = location[0], location[1]

        if location != 'O':
            Update_Past_Moves()

        Check_Collision()
        clock.tick(30)

main()

そして、これは出力です:

['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x',     'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x',     'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x',     'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
['+                            +', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@',     '@', '@', '@', '@']
['+                            +']
['+                            +']
['+                            +']
['+                            +']
['+                            +']
['+                            +']
['++++++++++++++++++++++++++++++']
['+                            +']
['+                            +']
['+                            +']
['+                            +']


Traceback (most recent call last):
  File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 112, in <module>
    main()
  File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 78, in main
    Draw_ScreenSurface()
  File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 45, in Draw_ScreenSurface
    print a
KeyboardInterrupt

CTRL-c (windows) を押して終了する必要があり、この出力が繰り返されます。不要なコードで質問をスパムしたくありませんでした。前もって感謝します。

4

2 に答える 2

2

以下は、「移動リスト」のサイズを縮小します

def Update_Past_Moves():
    past_moves.popleft()

したがって、ヘビを印刷しようとすると、最終的に描画するものは何もありません。

def Print_Snake_Body():
    for i in range(len(past_moves)):
        # No moves left

そのため、表示されるのはヘビの「頭」、@文字だけです。

于 2012-06-28T17:42:59.520 に答える
0

あなたが使用しているので、無限ループは問題ないようですwhile 1:

ヘッドは常に位置の 1 セル下に出力されます。そのため、2 行目に @ が表示されます。

def Print_Snake_Head():
    screen_surface[location[0]][location[1]:(location[1] + 1)] = snake_head

if location != 'O':場所は文字ではなく座標のペアであるため、この行は意味がありません。

于 2012-06-28T20:59:37.913 に答える