2017-01-14 1 views
0

나는이 뱀 게임을 만들기 시작했고 나는 투쟁에 부딪쳤다. 나는 뱀이 한쪽 끝까지 도달하면 다른 쪽에서 올 것입니다. 왼쪽 끝 부분에 도달하면 오른쪽면에서 나오고 위쪽 끝 부분에 도달하면 뱀 바닥 부분에서 나오게됩니다. . 누군가가 저에게 어떻게하는지 보여줄 수 있다면 정말 고마워요.스네이크 게임 경계

import pygame 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

segment_width = 15 
segment_height = 15 
segment_margin = 3 

x_change = segment_width + segment_margin 
y_change = 0 


class Segment(pygame.sprite.Sprite): 

    def __init__(self, x, y): 
     super().__init__() 

     self.image = pygame.Surface([segment_width, segment_height]) 
     self.image.fill(WHITE) 

     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

pygame.init() 


screen = pygame.display.set_mode([1200, 800]) 


pygame.display.set_caption('Snakes') 

allspriteslist = pygame.sprite.Group() 

snake_segments = [] 
for i in range(3): 
    x = 250 - (segment_width + segment_margin) * i 
    y = 30 
    segment = Segment(x, y) 
    snake_segments.append(segment) 
    allspriteslist.add(segment) 


clock = pygame.time.Clock() 
done = False 

while not done: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       x_change = (segment_width + segment_margin) * -1 
       y_change = 0 
      if event.key == pygame.K_RIGHT: 
       x_change = (segment_width + segment_margin) 
       y_change = 0 
      if event.key == pygame.K_UP: 
       x_change = 0 
       y_change = (segment_height + segment_margin) * -1 
      if event.key == pygame.K_DOWN: 
       x_change = 0 
       y_change = (segment_height + segment_margin) 


    old_segment = snake_segments.pop() 
    allspriteslist.remove(old_segment) 

    x = snake_segments[0].rect.x + x_change 
    y = snake_segments[0].rect.y + y_change 
    segment = Segment(x, y) 

    snake_segments.insert(0, segment) 
    allspriteslist.add(segment) 

    screen.fill(BLACK) 

    allspriteslist.draw(screen) 

    pygame.display.flip() 

    clock.tick(5) 

pygame.quit() 
+0

코드에서 들여 쓰기를 수정하시기 바랍니다 있기 때문에되도록 수동으로 위의이 기능을 execut해야 함을 의미 적절한 파이썬 프로그램 –

+0

는'if'를 사용하여 현재 위치를 확인하고 다른쪽으로 이동합니다. – furas

답변

1

당신은 위치를 확인하기 위해 if를 사용하고 다른 쪽

x = snake_segments[0].rect.x + x_change 
y = snake_segments[0].rect.y + y_change 

if x < screen_rect.left: 
    x += screen_rect.width 
elif x + segment_width + segment_margin > screen_rect.right: 
    x -= screen_rect.width 

if y < screen_rect.top: 
    y += screen_rect.height 
elif y + segment_height + segment_margin > screen_rect.bottom: 
    y -= screen_rect.height 

segment = Segment(x, y) 

로 이동하지만 문제는 세그먼트가 이상적으로 화면을 채울하지 않는다는 것입니다 수 - 때로는 한쪽 나머지 세그먼트의 부분을 표시한다 다른쪽에. 두 번째 세그먼트를 그려야하고 두 세그먼트를 그려야하는지 확인하는 방법 draw()Segment에 추가해야합니다. 먼저 한쪽에는, 다른 한쪽에는 두 번째 세그먼트를 그립니다.

def draw(self, screen): 

     # draw oryginal segment 

     screen_rect = screen.get_rect() 
     screen.blit(self.image, self.rect) 

     # draw second segment on other side 

     # left - right 
     if self.rect.left < screen_rect.left: 
      temp_rect = self.rect.copy() 
      temp_rect.x += screen_rect.width 
      screen.blit(self.image, temp_rect) 
     elif self.rect.right > screen_rect.right: 
      temp_rect = self.rect.copy() 
      temp_rect.x -= screen_rect.width 
      screen.blit(self.image, temp_rect) 

     # top - bottom 
     if self.rect.top < screen_rect.top: 
      temp_rect = self.rect.copy() 
      temp_rect.y += screen_rect.height 
      screen.blit(self.image, temp_rect) 
     elif self.rect.bottom > screen_rect.bottom: 
      temp_rect = self.rect.copy() 
      temp_rect.y -= screen_rect.height 
      screen.blit(self.image, temp_rect) 

그러나 직접 group.draw() 실행 screen.blit(self.image, self.rect)

for x in allspriteslist: 
    x.draw(screen) 

전체 코드

import pygame 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

segment_width = 15 
segment_height = 15 
segment_margin = 3 

x_change = segment_width + segment_margin 
y_change = 0 


class Segment(pygame.sprite.Sprite): 

    def __init__(self, x, y): 
     super().__init__() 

     self.image = pygame.Surface([segment_width, segment_height]) 
     self.image.fill(WHITE) 

     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

    def draw(self, screen): 
     screen_rect = screen.get_rect() 
     screen.blit(self.image, self.rect) 

     if self.rect.left < screen_rect.left: 
      temp_rect = self.rect.copy() 
      temp_rect.x += screen_rect.width 
      screen.blit(self.image, temp_rect) 
     elif self.rect.right > screen_rect.right: 
      temp_rect = self.rect.copy() 
      temp_rect.x -= screen_rect.width 
      screen.blit(self.image, temp_rect) 

     if self.rect.top < screen_rect.top: 
      temp_rect = self.rect.copy() 
      temp_rect.y += screen_rect.height 
      screen.blit(self.image, temp_rect) 
     elif self.rect.bottom > screen_rect.bottom: 
      temp_rect = self.rect.copy() 
      temp_rect.y -= screen_rect.height 
      screen.blit(self.image, temp_rect) 


pygame.init() 


screen = pygame.display.set_mode((1200, 800)) 
screen_rect = screen.get_rect() 

pygame.display.set_caption('Snakes') 

allspriteslist = pygame.sprite.Group() 

snake_segments = [] 
for i in range(3): 
    x = 250 - (segment_width + segment_margin) * i 
    y = 30 
    segment = Segment(x, y) 
    snake_segments.append(segment) 
    allspriteslist.add(segment) 


clock = pygame.time.Clock() 
done = False 

while not done: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       x_change = (segment_width + segment_margin) * -1 
       y_change = 0 
      if event.key == pygame.K_RIGHT: 
       x_change = (segment_width + segment_margin) 
       y_change = 0 
      if event.key == pygame.K_UP: 
       x_change = 0 
       y_change = (segment_height + segment_margin) * -1 
      if event.key == pygame.K_DOWN: 
       x_change = 0 
       y_change = (segment_height + segment_margin) 


    old_segment = snake_segments.pop() 
    allspriteslist.remove(old_segment) 

    x = snake_segments[0].rect.x + x_change 
    y = snake_segments[0].rect.y + y_change 

    if x < screen_rect.left: 
     x += screen_rect.width 
    elif x + segment_width + segment_margin > screen_rect.right: 
     x -= screen_rect.width 

    if y < screen_rect.top: 
     y += screen_rect.height 
    elif y + segment_height + segment_margin > screen_rect.bottom: 
     y -= screen_rect.height 

    segment = Segment(x, y) 

    snake_segments.insert(0, segment) 
    allspriteslist.add(segment) 

    screen.fill(BLACK) 

    #allspriteslist.draw(screen) 

    for x in allspriteslist: 
     x.draw(screen) 

    pygame.display.flip() 

    clock.tick(5) 

pygame.quit() 
+0

ty 너무 많은 남자 :) 정말 그것을 쓸어 – safam

+0

설명을 추가합니다. – furas

관련 문제