2016-06-26 8 views
3

Ich kann nicht herausfinden, wie man das Essen für die Schlange zu essen erzeugt. Ich kenne die Position der Schlange in Zeile 97 und 98, ich habe eine Klasse erstellt, um ein Pixel zu erzeugen, wo ich in der Zeile 22 ein Stück Essen zeichnen möchte (EDIT: sollte wohl eine Funktion sein, kommentierte #def (?) In) der Code). Ich muss lediglich 15 Pixel an den X- und Y-Koordinaten von der zufällig zugewiesenen Position hinzufügen und sie ausdrucken, um einen Block zu erhalten.Wie erzeugt man das Essen für ein Schlangenspiel

Das Problem ist zu überprüfen, ob ich es esse oder nicht. Es sollte so etwas sein:

if x >= x_food && x <= x_food + 15 || y >= y_food && y <= y_food + 15: 
    ...add a point and make snake longer... 

Das Problem, sie alle zusammen aus irgendeinem Grunde setzt .. Kann jemand mir einen Tip geben oder lösen, wie ich diese Klasse schreiben sollte, so kann ich mit anderen Problemen weitergehen? Vielen Dank!

import pygame 
import random 

#Global variables 
#Color 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

#Start length of snake 
snake_length = 3 

#Set the width of the segments of the snake 
segment_width = 15 
segment_height = 15 
# Margin within each segment 
segment_margin = 3 

#Set initial speed 
x_change = segment_width + segment_margin 
y_change = 0 

#def (?) 
class Food(): 
    #Class to print food 
    x_food = random.randint(0, 785) 
    y_food = random.randint(0, 585) 


class Segment(pygame.sprite.Sprite): 
    """ Class to represent the segment of the snake. """ 
    # Methods 
    # Constructer function 
    def __init__(self, x, y): 
     #Call the parents constructor 
     super().__init__() 

     #Set height, width 
     self.image = pygame.Surface([segment_width, segment_height]) 
     self.image.fill(WHITE) 

     #Make our top-left corner the passed-in location. 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

#Call this function so the Pygame library can initialize itself 
pygame.init() 

#Create an 800x600 size screen 
screen = pygame.display.set_mode([800, 600]) 

#Set the title of the window 
pygame.display.set_caption("Snake") 

allspriteslist = pygame.sprite.Group() 

#Create an initial snake 
snake_segments = [] 
for i in range(snake_length): 
    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 

     #Set the speed based on the key pressed 
     #We want the speed to be enough that we move a full 
     #Segment, plus the margin 
     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_width + segment_margin) 

    #Get rid of last segment of the snake 
    #.pop() command removes last item in list 
    old_segment = snake_segments.pop() 
    allspriteslist.remove(old_segment) 

    #Figure out where new segment will be 
    x = snake_segments[0].rect.x + x_change 
    y = snake_segments[0].rect.y + y_change 
    segment = Segment(x, y) 

    #Insert new segment to the list 
    snake_segments.insert(0, segment) 
    allspriteslist.add(segment) 

    #Draw 
    #Clear screen 
    screen.fill(BLACK) 

    allspriteslist.draw(screen) 

    #Flip screen 
    pygame.display.flip() 

    #Pause 
    clock.tick(5) 

pygame.quit() 
+0

Wenn Sie interessiert sind Salviati, ich habe eine Pygame Schlange, kann ich Ihnen den Code senden, wenn Sie es möchten, und Sie können vielleicht ein paar Tipps davon erhalten, der Code ist actuely 3 Programme, 1 für die Schlange, 1 für das Essen und 1 für alles zusammen, –

Antwort

1

nahm ich Ihren Code und ich glaube, ich etwas ausrechnen, pls beachten Sie, dass dies nur überwacht, wenn die Schlange über den Block geht, dann druckt er: lecker, so dass Sie das Detail hinzufügen müssen, auch beachten, dass ich benutzen, um Ihre Klasse nicht um die Nahrung zu erzeugen:

import pygame 
import random 

#Global variables 
#Color 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

#Start length of snake 
snake_length = 3 

#Set the width of the segments of the snake 
segment_width = 15 
segment_height = 15 
# Margin within each segment 
segment_margin = 3 

#Set initial speed 
x_change = segment_width + segment_margin 
y_change = 0 

#def (?) 
class Food(): 
    #Class to print food 
    x_food = random.randint(0, 785) 
    y_food = random.randint(0, 585) 


class Segment(pygame.sprite.Sprite): 
    """ Class to represent the segment of the snake. """ 
    # Methods 
    # Constructer function 
    def __init__(self, x, y): 
     #Call the parents constructor 
     super().__init__() 

     #Set height, width 
     self.image = pygame.Surface([segment_width, segment_height]) 
     self.image.fill(WHITE) 

     #Make our top-left corner the passed-in location. 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

#Call this function so the Pygame library can initialize itself 
pygame.init() 

#Create an 800x600 size screen 
screen = pygame.display.set_mode([800, 600]) 

#Set the title of the window 
pygame.display.set_caption("Snake") 

allspriteslist = pygame.sprite.Group() 

#Create an initial snake 
snake_segments = [] 
for i in range(snake_length): 
    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 
x_food = random.randint(0, 785) 
y_food = random.randint(0, 585) 

while not done: 

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

     #Set the speed based on the key pressed 
     #We want the speed to be enough that we move a full 
     #Segment, plus the margin 
     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_width + segment_margin) 

      if y < y_food+30: 
       if x > x_food and x < x_food+30 or x+20 > x_food and x+20<x_food+30: 
        print('yummy') 



    #Get rid of last segment of the snake 
    #.pop() command removes last item in list 
    old_segment = snake_segments.pop() 
    allspriteslist.remove(old_segment) 

    #Figure out where new segment will be 
    x = snake_segments[0].rect.x + x_change 
    y = snake_segments[0].rect.y + y_change 
    segment = Segment(x, y) 

    #Insert new segment to the list 
    snake_segments.insert(0, segment) 
    allspriteslist.add(segment) 

    #Draw 
    #Clear screen 
    screen.fill(BLACK) 
    pygame.draw.rect(screen, WHITE, [x_food, y_food, 30, 30]) 

    allspriteslist.draw(screen) 

    #Flip screen 
    pygame.display.flip() 

    #Pause 
    clock.tick(5) 

pygame.quit() 

Hoffnung, das half, danke!

+1

Perfekt! Jetzt funktioniert es, nur noch eine kleine Anpassung zu tun :) Ty! – Salviati

+0

kein Problem, froh, dass es für Sie Salviati gearbeitet hat –

1

wie über die Verwendung von:

if snake_headx == foodx and snake_heady == foody: 

    food_eated() 
    snake_grow() 

nur ein Vorschlag obwohl

nur knapp sein Ziel all ur-Code zu lesen, nur dachte u es finden könnte nützlich.

tatsächlich kam ich zu einer Lösung, so grundlegend was du willst ist ein Quadrat, und wenn die Schlange in der Nähe von diesem Quadrat etwas passieren sollte ?, well ive bekam ein Rennspiel, das Sie zum Absturz bringt, wenn Sie ein quadratisches Auto treffen il den Code einfach hier kopieren:

if y < thing_starty+thing_height: 
     if x > thing_startx and x < thing_startx+thing_width or  x+car_width > thing_startx and x+car_width<thing_startx+thing_width: 
      snake_eated() 
      snake_grow() 

dies die x und y Ihres Autos (oder Schlange) und überprüft, überwacht, wenn die Sache (oder Lebensmittel) ‚sy kleiner als Ihr Auto ist, dann überprüft er die x und viele andere Dinge, und im Grunde erstellt es eine große Linie rund um Ihren Platz, die Sie in Ihrem Fall nicht überqueren können, Sie müssten nur den Rest hinzufügen, würde das funktionieren?

+0

Ich habe es jetzt versucht, aber leider ohne Erfolg. Das Quadrat wird in der oberen linken Ecke gedruckt (zeigt an, dass es nicht die Koordinaten erhält, sondern verwendet (0,0)) und wird super langsam. Ich weiß nicht, wie ich es machen soll. – Salviati

+0

Können Sie eine Version Ihres Codes anzeigen, die versucht, die 'Food'-Klasse zu verwenden? Der Code in der Frage versucht nicht einmal, ihn überhaupt zu verwenden. – Blckknght

+0

Ja, ich werde die Klasse aktualisieren, wenn ich nach Hause komme. Ich habe den Code in eine andere Textdatei kopiert, während ich daran arbeitete, also habe ich nichts kaputt gemacht und den falschen Code hier gepostet. – Salviati

1
if x >= x_food && x <= x_food + 15 || y >= y_food && y <= y_food + 15: 

Warum wollen Sie OR diese Paare von Bedingungen? Müssen nicht alle 4 Tests gleichzeitig wahr sein?

if x >= x_food && x <= x_food + 15 && y >= y_food && y <= y_food + 15: 
+0

Nein, müssen sie nicht, die Schlange kommt aus Richtung x oder y. Also muss nur einer von ihnen wahr sein. – Salviati

+2

'&&' und '||' sind keine gültigen Operatoren in Python. Verwenden Sie 'und' und' oder'. Ich denke aber, dass Sie "und" bei allen Tests hier haben wollen. Es macht keinen Sinn, dass das Essen gegessen wird, nur weil du in der gleichen Reihe bist, auch wenn du weit rechts oder links bist. Sie müssen sowohl in derselben Zeile als auch in derselben Spalte sein. – Blckknght

+0

Ja, das habe ich heute früh erkannt, als ich es getestet habe. Muss mir entfallen sein. Über die || und && es war ein Fehler, weil ich vor kurzem viel C codiert habe. Ty für die Klärung! – Salviati

1

Machen Sie Ihr Essen zu einem Sprite mit einem einfachen gefüllten Rechteck als Bild, und verwenden Sie dann Sprite Kollision pygame.sprite.spritecollide(), um zu überprüfen, ob Ihre Schlange mit Ihrem Essen kollidiert. Pygame wird sich um die tatsächliche Logik kümmern, ob sich zwei Rechtecke für dich überschneiden.

Da Sie bereits Sprite-Gruppen verwenden, schlage ich vor, dass Sie eine Update-Funktion für Ihre Schlangensegmente schreiben, die sie bewegt, anstatt jedes Mal ein neues Segment zu erstellen. Dann kannst du einfach allspriteslist.update() in deiner Hauptspielschleife anrufen, die die Aktualisierungsfunktion für jedes Schlangensegment aufruft.

Schließlich möchten Sie vielleicht einen Blick auf die zahlreichen snake examples auf der Pygame-Website werfen.