2014-06-05 9 views
0

파이썬 2.7을 사용하고 있습니다. 문자열 기반 수준을 다시 그리는 데 문제가 있습니다. 첫 번째 프레임에서는 괜찮 았지만 이후에는 더 이상 그려지지 않습니다. 나는 잠시 동안 고쳐지려고 노력 중이다.파이 게임 문자열 기반 레벨 그리기가 한번 사라집니다.

import pygame 
from pygame.locals import * 

xScan = 0 
yScan = 0 
level = "WWWWWWWW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WSSSSSSW" \ 
     "WWWWWWWW" 


class Player(): 
    def __init__(self, color, x, y, width, height, outline_size): 
     self.color = color 
     self.x = x 
     self.y = y 
     self.width = width 
     self.height = height 
     self.outline_size = outline_size 

    def draw(self): 
     pygame.draw.rect(screen, self.color, [self.x * 80, self.y * 80, self.width * 80, self.height * 80], self.outline_size) 


def draw_level(): 
    for tile in level: 
     global xScan, yScan 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 
     elif yScan == 5 and xScan == 7: 
      xScan = 0 
      yScan = 0 


def update(): 
    screen.fill([255, 255, 255]) 
    draw_level() 
    player.draw() 
    pygame.display.flip() 

pygame.init() 
screen = pygame.display.set_mode([640, 480]) 
pygame.display.set_caption("Squares n' Tiles!") 
player = Player([0, 100, 255], 1, 1, 1, 1, 0) 

running = True 
while running: 
    clock = pygame.time.Clock() 
    clock.tick(30) 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == K_ESCAPE: 
       running = False 
      if event.key == K_UP and player.y * 80 >= 160: 
       player.y -= 1 
      if event.key == K_DOWN and player.y * 80 < 320: 
       player.y += 1 
      if event.key == K_LEFT and player.x * 80 >= 160: 
       player.x -= 1 
      if event.key == K_RIGHT and player.x * 80 < 480: 
       player.x += 1 
      if event.key == K_c or event.key == K_r: 
       player.x = 1 
       player.y = 1 
     if event.type == pygame.QUIT: 
      running = False 
    update() 

pygame.quit() 

나는 문제가 코드의이 부분 내에있는 생각 :

def draw_level(): 
    for tile in level: 
     global xScan, yScan 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 
     elif yScan == 5 and xScan == 7: 
      xScan = 0 
      yScan = 0 

내가 이전 부분의 후반의 숫자 장난 해봤 여기에 전체 소스 코드입니다.

if xScan >= 7: 
    xScan = 0 
    yScan += 1 
elif yScan == 6: 
    xScan = 1 
    yScan = 0 
else: 
    xScan += 1 

위의 코드 유일한 문제는 왼쪽 상단 타일 그릴하지 않는다는 것입니다 : 여기에 (그 형식은 매우 일치하지 않습니다 불구하고) 대부분 문제가 해결되는 하나의 변형이다. 제대로 작동하도록 코드를 어떻게 바꿀 수 있습니까? 모든 프레임에서 화면을 흰색으로 채우고 수준을 다시 그려서 플레이어가 다시 그려지며 화면이 뒤집혀지기를 바랍니다. 모든 도움을 미리 감사드립니다. 또한 코드 구조에 대한 조언을 주시면 감사하겠습니다.

elif yScan == 5 and xScan == 7: 
     xScan = 0 
     yScan = 0 

당신이 level 문자열의 각 문자를 통해 반복하고 있기 때문입니다, 그래서 도달 한 최대 값이 XSCAN = 6, yScan = 5 :

답변

0

문제는이 블록이 실행되지 않는 것입니다 .

내가 woul 그리기 수준의 기능

def draw_level(): 
    xScan = 0 # no need for these to be global 
    yScan = 0 
    for tile in level: 
     if tile == "W": 
      pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
     elif tile == "S": 
      pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

     if xScan >= 0 and xScan < 7: 
      xScan += 1 
     elif xScan == 7: 
      xScan = 0 
      yScan += 1 

를 입력 할 때

대신 단지 xScanyScan를 초기화

level = "WWWWWWWW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WSSSSSSW\n" \ 
     "WWWWWWWW\n" # note the new line characters (\n) 

는 그런 다음과 같이지도를 반복 할 수 있습니다 :

def draw_level(): 
    for yScan, row in enumerate(level.split('\n')): 
     for xScan, tile in enumerate(row): 
      if tile == "W": 
       pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0) 
      elif tile == "S": 
       pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1) 

enumerate이 목록을합니다 (또는 반복 가능) 반환 문자 여러 줄의 대신에 하나의 긴 문자열로 수준을 저장하는 것이 좋습니다 거라고 목록의 각 항목에 대한 (색인, 항목) 쌍 (예 :

)
>>> a = 'test' 
>>> for i, c in enumerate(a): 
...  print('i is {}, c is {}'.format(i, c)) 
... 
i is 0, c is t 
i is 1, c is e 
i is 2, c is s 
i is 3, c is t 
+0

감사합니다. 감사합니다. – Mikeureko