Pygame, Spiel Pong, Probleme
Verfasst: Mittwoch 2. Februar 2022, 01:35
Ich probiere gerade ein Spiel zu programmieren aber komme einfach seit Tagen nicht mehr weiter. Es geht um das Spiel Pong, wobei ich aber nur alleine gegen den Ball spiele.
Problem 1: Der Code läuft nicht, weil er ein Problem bei if event.type == pygame.KEYDOWN:, hat.
Problem 2: Ich weiß nicht wie ich es schaffe, dass das Spiel endet, sobald der Ball die linke Wand berührt.
Problem 3: Ich weiß nicht wie ich es schaffe, dass der Ball nach jedem Berühren des Bat´s (Spielers/Schlägers) ein wenig schneller wird, um das Spiel spannender zu machen.
Problem 4: Ich möchte noch Klassen einfügen erstellen. Eine Klasse für den Schläger (Bat) und eine für den Ball. Ich habe dies schonmal probiert, mir aber dadurch den ganzen Code kaputt gemacht
Ich weiß, dass es recht viele Probleme sind, aber vielleicht ist hier ja eine begabte Person die Ahnung davon hat und mir weiterhelfen kann. Ich füge den kompletten Code nochmal unten an. Falls jemand auch über Discord leichter Helfen kann, weils dort mit Dateien schicken usw. leichter ist, kann er/sie auch gerne seinen Namen hier lassen, sodass ich ihn/sie adden kann.
Hier einmal mein kompletter bisheriger Code:
# Importieren der Pygame-Bibliothek
import pygame, sys, math
# Initialisierung von Pygame
pygame.init()
# Farben
white = (255, 255, 255)
red = (255, 0, 0)
black = (0, 0, 0)
# Festlegen der Displayeinstellungen
window_height = 600
window_broad = 600
screen = pygame.display.set_mode((window_height, window_broad))
# Spieltitel
pygame.display.set_caption("Pong")
# Bildschirm Aktualisierung
clock = pygame.time.Clock()
# Score
score = 0
# Definieren der Variablen/Konstanten vom Ball
ballpos_x = 300
ballpos_y = 300
ball_d = 20
ballmove_x = 2
ballmove_y = 2
# Definieren der Variablen/Konstanten vom Schläger
bat_x = 10
bat_y = 300
bat_speed = 0
bat_broad = 20
bat_height = 100
# Ab hier beginnt die Hauptschleife
active = True
while active:
# Überprüfen, ob Nutzer eine Aktion durchgeführt hat
for event in pygame.event.get():
if event.type == pygame.QUIT:
active = False
# Tasten für Spieler (Schläger)
for event in pygame.key.get_pressed():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
bat_speed += 8
if event.key == pygame.K_UP:
bat_speed -= 8
if event.type == pygame.KEYUP:
if event.key == pygame.K_DOWN:
bat_speed -= 8
if event.key == pygame.K_UP:
bat_speed += 8
bat_y += bat_speed
# Spielfeld löschen
screen.fill(black)
# Spielfeld/figuren zeichnen
# Ball zeichnen
ball = pygame.draw.ellipse(screen, white, [ballpos_x, ballpos_y, ball_d, ball_d])
# Schläger zeichnen
player1 = pygame.draw.rect(screen, white, [bat_x, bat_y, bat_broad, bat_height])
# Ballbewegungen
# Falls Ball an eine Wand kommt dreht er sich mit * -1 um
ballpos_x += ballmove_x
ballpos_y += ballmove_y
if ballpos_y > window_height - ball_d or ballpos_y < 0:
ballmove_y = ballmove_y * -1
if ballpos_x > window_height - ball_d or ballpos_x < 0:
ballmove_x = ballmove_x * -1
# Kollision vom Spieler (Schläger) und dem Ball
if player1.colliderect(ball):
ballmove_x = ballmove_x * -1
ballpos_x = 40
score += 1
bat_height -= 5
ausgabetext = "Score:" + str(score)
font = pygame.font.SysFont(None, 70)
text = font.render(ausgabetext, True, red)
screen.blit(text, [100, 10])
# Fenster aktualisieren
pygame.display.flip()
# Frame-Rate/Refresh in hz festlegen
clock.tick(120)
pygame.quit()
Problem 1: Der Code läuft nicht, weil er ein Problem bei if event.type == pygame.KEYDOWN:, hat.
Problem 2: Ich weiß nicht wie ich es schaffe, dass das Spiel endet, sobald der Ball die linke Wand berührt.
Problem 3: Ich weiß nicht wie ich es schaffe, dass der Ball nach jedem Berühren des Bat´s (Spielers/Schlägers) ein wenig schneller wird, um das Spiel spannender zu machen.
Problem 4: Ich möchte noch Klassen einfügen erstellen. Eine Klasse für den Schläger (Bat) und eine für den Ball. Ich habe dies schonmal probiert, mir aber dadurch den ganzen Code kaputt gemacht
Ich weiß, dass es recht viele Probleme sind, aber vielleicht ist hier ja eine begabte Person die Ahnung davon hat und mir weiterhelfen kann. Ich füge den kompletten Code nochmal unten an. Falls jemand auch über Discord leichter Helfen kann, weils dort mit Dateien schicken usw. leichter ist, kann er/sie auch gerne seinen Namen hier lassen, sodass ich ihn/sie adden kann.
Hier einmal mein kompletter bisheriger Code:
# Importieren der Pygame-Bibliothek
import pygame, sys, math
# Initialisierung von Pygame
pygame.init()
# Farben
white = (255, 255, 255)
red = (255, 0, 0)
black = (0, 0, 0)
# Festlegen der Displayeinstellungen
window_height = 600
window_broad = 600
screen = pygame.display.set_mode((window_height, window_broad))
# Spieltitel
pygame.display.set_caption("Pong")
# Bildschirm Aktualisierung
clock = pygame.time.Clock()
# Score
score = 0
# Definieren der Variablen/Konstanten vom Ball
ballpos_x = 300
ballpos_y = 300
ball_d = 20
ballmove_x = 2
ballmove_y = 2
# Definieren der Variablen/Konstanten vom Schläger
bat_x = 10
bat_y = 300
bat_speed = 0
bat_broad = 20
bat_height = 100
# Ab hier beginnt die Hauptschleife
active = True
while active:
# Überprüfen, ob Nutzer eine Aktion durchgeführt hat
for event in pygame.event.get():
if event.type == pygame.QUIT:
active = False
# Tasten für Spieler (Schläger)
for event in pygame.key.get_pressed():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
bat_speed += 8
if event.key == pygame.K_UP:
bat_speed -= 8
if event.type == pygame.KEYUP:
if event.key == pygame.K_DOWN:
bat_speed -= 8
if event.key == pygame.K_UP:
bat_speed += 8
bat_y += bat_speed
# Spielfeld löschen
screen.fill(black)
# Spielfeld/figuren zeichnen
# Ball zeichnen
ball = pygame.draw.ellipse(screen, white, [ballpos_x, ballpos_y, ball_d, ball_d])
# Schläger zeichnen
player1 = pygame.draw.rect(screen, white, [bat_x, bat_y, bat_broad, bat_height])
# Ballbewegungen
# Falls Ball an eine Wand kommt dreht er sich mit * -1 um
ballpos_x += ballmove_x
ballpos_y += ballmove_y
if ballpos_y > window_height - ball_d or ballpos_y < 0:
ballmove_y = ballmove_y * -1
if ballpos_x > window_height - ball_d or ballpos_x < 0:
ballmove_x = ballmove_x * -1
# Kollision vom Spieler (Schläger) und dem Ball
if player1.colliderect(ball):
ballmove_x = ballmove_x * -1
ballpos_x = 40
score += 1
bat_height -= 5
ausgabetext = "Score:" + str(score)
font = pygame.font.SysFont(None, 70)
text = font.render(ausgabetext, True, red)
screen.blit(text, [100, 10])
# Fenster aktualisieren
pygame.display.flip()
# Frame-Rate/Refresh in hz festlegen
clock.tick(120)
pygame.quit()