2017-01-14 3 views
0

私はこのヘビのゲームを作り始めました。私は闘争に遭遇しました。私はヘビが片側の端に達するときそれが反対側から来るとき、それが左側の端に達したらそれは右側から出て行き、上端に達したら底から出てくることを望む。もし誰かが私にそれをする方法を教えてもらえると本当に感謝します。Snakesゲームの境界

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

コードにインデントを修正してくださいので、それがあるように手動で上記のこの機能をステートメしなければならないことを意味適切なPythonプログラム –

+0

は、 'if'を使って現在位置を確認し、反対側に移動します。 – furas

答えて

1

あなたは位置を確認し、他の側に

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) 

を移動するためにifを使用することができます。しかし、問題は、セグメントは、理想的には、画面を埋めていないということである - 時々、あなたは片側、残りの上にセグメントの一部が表示されます反対側に。メソッドdraw()Segmentに追加する必要があります。両方のセグメントを描画し、2つのセグメントを描画する必要があるかどうかを確認する必要があります。

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

あまりにも多くの男:)本当にそれを信じて – safam

+0

私は説明を追加します。 – furas