PyGame Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ThePaulCraft
User
Beiträge: 11
Registriert: Samstag 10. Oktober 2020, 17:43

Sehr geehrte Forums Nutzer,
Ich habe leider ein kleines Problem mit PyGame, ich möchte ein Pong artiges Spiel programmieren und habe dafür auch schon den Großteil des Codes. Im Spiel soll es einen eckigen Ball und einen Schläger geben, der Ball soll immer fallen, es sei den er wird vom Schläger getroffen, dann "prallt" er an ihm ab und fliegt wieder nach oben, bis er den Rand des Fensters berührt. Nur beim Starten des Spieles fällt der Ball wie gewollt, buggt dann aber im Schläger, ich weiß leider echt nicht woran das liegt bzw. wie man das lösen kann. Ich würde mich über Hilfe sehr freuen! Hier der Code:

Code: Alles auswählen

import pygame
import random

pygame.init()
screen = pygame.display.set_mode([400,500])
pygame.display.set_caption("Pong")

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

done = False
fps = 25
clock = pygame.time.Clock()
speed = 5

class Pong:
    def __init__(self):
        self.direction = 0
        self.x = 125
        self.y = 500-25
        self.ball_x = 190
        self.ball_y = 400
        self.ball_x_richtung = 0

    def left(self):
        self.direction = 1

    def right(self):
        self.direction = -1

    def stil(self):
        self.direction = 0

    def colides(self):
        if self.ball_y == self.y and self.ball_x + 10 >= self.x <= self.ball_x:
            self.ball_x_richtung = random.randint(-2, 2)
            return True
        else:
            return False

    def colides_with_border(self):
        if self.ball_y == 1 or self.ball_x == 1 or self.ball_x + 10 >= 399:
            return True
        return False

    def losed(self):
        if self.ball_y - 10 > self.y:
            return True
        return False

    def loop(self):
        print(self.colides())
        ### Schläger
        if self.direction == 1 and self.x > 0:
           self.x -= speed
        if self.direction == 0:
            self.x = self.x
        if self.direction == -1 and self.x < 400-150:
            self.x += speed
        ### Ball
        Fall = True
        if self.colides():
            Fall = False

        if Fall:
            self.ball_y += 5
            self.ball_x += self.ball_x_richtung

        if not Fall:
            self.ball_y -= 5
            self.ball_x_richtung = random.randint(-2, 2)
            self.ball_x += self.ball_x_richtung

        if self.colides_with_border():
            self.ball_x += self.ball_x_richtung
            Fall = True

        if self.losed():
            global done
            done = True

    def draw(self):
        screen.fill(color=BLACK)
        pygame.draw.rect(screen, WHITE, (self.x, self.y, 150, 12), 0)
        pygame.draw.rect(screen, WHITE, (self.ball_x, self.ball_y, 10, 10))
        pygame.display.update()

game = Pong()

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_UP and event.key == pygame.K_DOWN:
                game.stil()
            if event.key == pygame.K_LEFT:
                game.left()
            if event.key == pygame.K_RIGHT:
                game.right()
        if event.type == pygame.KEYUP:
            game.stil()
    game.draw()
    game.loop()
    clock.tick(fps)
pygame.quit()
PS: ich entschuldige mich jetzt schonmal für meinen Codestil und die Benennung der Variablen!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Man muß sich für den Codestil nicht entschuldigen, sondern nur Kritik annehmen. Variablen werden in Python generell klein schrieben, was Du bis auf `Fall` auch tust.
In Pong.collides sind die Bedingungen falsch. x soll kleiner sein als ball_x und gleichzeitig kleiner als ball_x+10? Dass ball_y exakt gleich y sein kann, ist vielleicht durch die Wahl der Zahlen gegeben, eine gewisse Toleranz wäre da aber auch besser.
collides sollte aber nur einen Wahrheitswert zurückliefern und nicht auch noch die Ballrichtung in x ändern. Die in y wird ja gar nicht geändert.
In colides_with_border sind die Bedingungen mit == auch zu streng.
Man kann den Wahrheitswert der if-Abfrage auch direkt benutzen:

Code: Alles auswählen

    def colides_with_border(self):
        return self.ball_y == 1 or self.ball_x == 1 or self.ball_x + 10 >= 399
Die Vergangenheitsform von to lose ist lost nicht losed.

Globale Variablen sollte man nicht verwenden. Pong.loop kann doch den Rückgabewert für done verwenden, das muß nicht global sein.

Fall ist nur True, wenn gerade der Schläger berührt wird. Da fehlt also die Ballrichtung in y, die Du Dir nirgends merkst.
ThePaulCraft
User
Beiträge: 11
Registriert: Samstag 10. Oktober 2020, 17:43

Sirius3 hat geschrieben: Montag 21. Dezember 2020, 11:05 Man muß sich für den Codestil nicht entschuldigen, sondern nur Kritik annehmen. Variablen werden in Python generell klein schrieben, was Du bis auf `Fall` auch tust.
In Pong.collides sind die Bedingungen falsch. x soll kleiner sein als ball_x und gleichzeitig kleiner als ball_x+10? Dass ball_y exakt gleich y sein kann, ist vielleicht durch die Wahl der Zahlen gegeben, eine gewisse Toleranz wäre da aber auch besser.
collides sollte aber nur einen Wahrheitswert zurückliefern und nicht auch noch die Ballrichtung in x ändern. Die in y wird ja gar nicht geändert.
In colides_with_border sind die Bedingungen mit == auch zu streng.
Man kann den Wahrheitswert der if-Abfrage auch direkt benutzen:

Code: Alles auswählen

    def colides_with_border(self):
        return self.ball_y == 1 or self.ball_x == 1 or self.ball_x + 10 >= 399
Die Vergangenheitsform von to lose ist lost nicht losed.

Globale Variablen sollte man nicht verwenden. Pong.loop kann doch den Rückgabewert für done verwenden, das muß nicht global sein.

Fall ist nur True, wenn gerade der Schläger berührt wird. Da fehlt also die Ballrichtung in y, die Du Dir nirgends merkst.
Danke für die schnelle Antwort! Ich werde den code auf jeden fall nochmal üerarbeiten, sprich Fall klein schreiben usw. und natürlich den Fehler beheben! Ich kann mich nur für die schnelle Antwort bedanken!
ThePaulCraft
User
Beiträge: 11
Registriert: Samstag 10. Oktober 2020, 17:43

Sirius3 hat geschrieben: Montag 21. Dezember 2020, 11:05 Man muß sich für den Codestil nicht entschuldigen, sondern nur Kritik annehmen. Variablen werden in Python generell klein schrieben, was Du bis auf `Fall` auch tust.
In Pong.collides sind die Bedingungen falsch. x soll kleiner sein als ball_x und gleichzeitig kleiner als ball_x+10? Dass ball_y exakt gleich y sein kann, ist vielleicht durch die Wahl der Zahlen gegeben, eine gewisse Toleranz wäre da aber auch besser.
collides sollte aber nur einen Wahrheitswert zurückliefern und nicht auch noch die Ballrichtung in x ändern. Die in y wird ja gar nicht geändert.
In colides_with_border sind die Bedingungen mit == auch zu streng.
Man kann den Wahrheitswert der if-Abfrage auch direkt benutzen:

Code: Alles auswählen

    def colides_with_border(self):
        return self.ball_y == 1 or self.ball_x == 1 or self.ball_x + 10 >= 399
Die Vergangenheitsform von to lose ist lost nicht losed.

Globale Variablen sollte man nicht verwenden. Pong.loop kann doch den Rückgabewert für done verwenden, das muß nicht global sein.

Fall ist nur True, wenn gerade der Schläger berührt wird. Da fehlt also die Ballrichtung in y, die Du Dir nirgends merkst.
Update: Dank deinem Post läuft das Spiel jetzt richtig gut! Nochmals danke für die antwort!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht den Post eines anderen Users voll zitieren. Der steht schon darüber.
ThePaulCraft
User
Beiträge: 11
Registriert: Samstag 10. Oktober 2020, 17:43

Das werde ich in Zukunft unterlassen.
Antworten