Python Forum
Game “Pong” I have problems with the code
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Game “Pong” I have problems with the code
#1
I have programmed the game Pong. It can be opened and played, but it still indicates that there is an error:

Traceback (most recent call last):
File "/Users/xxxxxxxxxxr/PycharmProjects/Python/666.py", line 245, in <module>
game_to_five()
File "/Users/xxxxxxxxr/PycharmProjects/Python/666.py", line 240, in game_to_five
pygame.display.update()
pygame.error: video system not initialized

I hope you can help me. Would appreciate any answer :) Maybe you have some ideas or remarks concerning my code. My code from the game is:

import pygame
from pygame.locals import *

# Pygame initialisieren
pygame.init()
Clock = pygame.time.Clock()

screen_width = 1000
screen_height = 500


screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('Pong von Ben')

# Farbe definieren
bg = pygame.Color("#458B74")
black = (0, 0, 0)
white = (255, 255, 255)
blue = (255, 255, 255)
orange = (255, 140, 0)

# Soounds
plob_sound = pygame.mixer.Sound("pong.ogg")
score_sound = pygame.mixer.Sound("score.ogg")

# define game variables
margin = 50

# define font
basic_font = pygame.font.SysFont("freesansbold.ttf", 60)


# basic_font = pygame.font.SysFont("Helvetica", 60)


# Text erstllen und den text umwandeln in ein Bild und dieses auf das Spielbildschirm bringen
# dafür muss ich eine font (Schriftart) erstellen
def draw_text(text, basic_font, text_col, x, y):
    img = basic_font.render(text, True, text_col)
    screen.blit(img, (x, y))


def draw_board():
    screen.fill(bg)
    pygame.draw.line(screen, white, (0, margin), (screen_width, margin), 4)
    pygame.draw.line(screen, white, (500, margin), (500, 500), 4)
    # Kreis in der Mitte
    pygame.draw.ellipse(screen, white, [400, 180, 200, 200], 4)


# Man kann nicht direkt einen Text schreiben, mann muss es den text in ein Bild konvertieren und diesen mit screen.blit
# auf das "Screen" tun / x und y steht für wo der "Text" am Ende wo es sein soll // font muss noch bestimmt werden //
# text ist der text den man sehen möchte
def draw_text(text, basic_font, text_col, x, y):
    img = basic_font.render(text, True, text_col)
    screen.blit(img, (x, y))


class paddle():
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.rect = Rect(x, y, 10, 150)
        self.speed = 5
        self.ai_speed = 5

    # damit man den Paddle bewegen kann muss man die Tastatur mit einbinden wenn man eine Tast gefrückt hat und wie der Paddle
    # sich zu verhalten hat
    def move(self):
        key = pygame.key.get_pressed()
        # Wenn der UP-Key gedrückt wurde und "Grenzen" einrichten (solange der "Top" größer als margin ist kann man nach oben gehen
        # also unter dem Rand ist
        if key[pygame.K_UP] and self.rect.top > margin:
            self.rect.move_ip(0, -1 * self.speed)
        if key[pygame.K_DOWN] and self.rect.bottom < screen_height:
            self.rect.move_ip(0, self.speed)

    def draw(self):
        pygame.draw.rect(screen, white, self.rect)

    def ai(self):
        # ai to move the paddle automatically
        # move down
        if self.rect.centery < pong.rect.top and self.rect.bottom < screen_height:
            self.rect.move_ip(0, self.ai_speed)
        # move up
        if self.rect.centery > pong.rect.bottom and self.rect.top > margin:
            self.rect.move_ip(0, -1 * self.ai_speed)


class ball():

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

    def move(self):

        # check collision with top margin
        if self.rect.top < margin:
            pygame.mixer.Sound.play(plob_sound)
            self.speed_y *= -1
        # check collision with bottom of the screen
        if self.rect.bottom > screen_height:
            pygame.mixer.Sound.play(plob_sound)
            self.speed_y *= -1
        if self.rect.colliderect(player_paddle) or self.rect.colliderect(cpu_paddle):
            pygame.mixer.Sound.play(plob_sound)
            self.speed_x *= -1

        # check for out of bounds
        if self.rect.left < 0:
            pygame.mixer.Sound.play(score_sound)
            self.winner = 1
        if self.rect.left > screen_width:
            pygame.mixer.Sound.play(score_sound)
            self.winner = -1

        # update ball position
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        return self.winner

    def draw(self):
        pygame.draw.circle(screen, orange, (self.rect.x + self.ball_rad, self.rect.y + self.ball_rad), self.ball_rad)

    def reset(self, x, y):
        self.x = x
        self.y = y
        self.ball_rad = 8
        self.rect = Rect(x, y, self.ball_rad * 2, self.ball_rad * 2)
        self.speed_x = -4
        self.speed_y = 4
        self.winner = 0  # 1 is the player and -1 is the CPU


# create paddles
player_paddle = paddle(screen_width - 40, screen_height // 2)
cpu_paddle = paddle(20, screen_height // 2)

# create pong ball
pong = ball(screen_width - 60, screen_height // 2 + 50)


def game_to_five():
    player_score = 0
    opp_score = 0

    live_ball = False
    winner = 0
    speed_increase = 0

    run = True
    while (player_score < 5 and opp_score < 5) and run:

        Clock.tick(60)

        draw_board()
        draw_text('OPP: ' + str(opp_score), basic_font, white, 20, 15)
        draw_text('P1: ' + str(player_score), basic_font, white, screen_width - 115, 15)
        draw_text('TEMPO: ' + str(abs(pong.speed_x)), basic_font, white, screen_width // 2 - 100, 15)

        # draw paddles
        player_paddle.draw()
        cpu_paddle.draw()

        if live_ball == True:
            speed_increase += 1
            winner = pong.move()
            if winner == 0:
                # draw ball
                pong.draw()
                # move paddles
                player_paddle.move()
                cpu_paddle.ai()
            else:
                live_ball = False
                if winner == 1:
                    player_score += 1
                elif winner == -1:
                    opp_score += 1

        # print player instructions
        if live_ball == False:
            if winner == 0:
                draw_text('Zum Starten klicken', basic_font, black, 300, screen_width // 2 - 300)
            if winner == 1:
                draw_text('YOU SCORED!', basic_font, black, 355, 160)
                draw_text('CLICK ANYWHERE TO START', basic_font, black, 200, 200)
            if winner == -1:
                draw_text('CPU SCORED!', basic_font, black, 355, 160)

                draw_text('CLICK ANYWHERE TO START', basic_font, black, 200, 200)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.MOUSEBUTTONDOWN and live_ball == False:
                live_ball = True
                pong.reset(500, 250)
            # screen_width - 60, screen_height // 2 + 50)

        if speed_increase > 500:
            speed_increase = 0
            if pong.speed_x < 0:
                pong.speed_x -= 1
            if pong.speed_x > 0:
                pong.speed_x += 1
            if pong.speed_y < 0:
                pong.speed_y -= 1
            if pong.speed_y > 0:
                pong.speed_y += 1

        pygame.display.update()

    new_game = False
    while not new_game:

        draw_board()
        draw_text('OPP: ' + str(opp_score), basic_font, white, 20, 15)
        draw_text('P1: ' + str(player_score), basic_font, white, screen_width - 115, 15)
        draw_text('TEMPO: ' + str(abs(pong.speed_x)), basic_font, white, screen_width // 2 - 100, 15)

        if player_score == 5:
            draw_text('P1 hat gewonnen!', basic_font, black, 355, 160)
        elif opp_score == 5:
            draw_text('OPP hat gewonnen!', basic_font, black, 300, 160)
        draw_text('Klicken um fortzufahren', basic_font, black, 260, 200)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                pong.reset(500, 250)
                new_game = True

        pygame.display.update()


# create game loop
while True:
    game_to_five()

pygame.quit()
Reply
#2
IS this the code for the 666.py file? Are you running this file directly or is it imported into another file being ran?
Recommended Tutorials:
Reply
#3
You get the error when you close the window? Then I don't it's not a problem necessarily.

I've spent many hours over exotic errors as it seems once you hit the close button on the window pygame.QUIT() a bunch of pygame stuff is unitilized, so code between the pygame.QUIT() and the actual end of the program which needs pygame ititalized can throw errors.

I've had it say my joystick wasn't initialized my "Text has zero width", and others.

try exiting the program instantly rather than allowing the loop to play out.

 for event in pygame.event.get():
            if event.type == pygame.QUIT: 
                pygame.quit()
metulburr likes this post
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
Exclamation pong paddles wont move skullkat232 5 2,285 Feb-13-2023, 03:53 PM
Last Post: Vadanane
  My game's code works but Python still freezes at random intervals. game_slayer_99 13 7,410 Dec-09-2021, 11:23 AM
Last Post: metulburr
  Problem with my pong code Than999 3 3,370 Oct-22-2021, 08:50 AM
Last Post: Qanima
  [PyGame] Problems with jump code in pygame Joningstone 4 5,272 Aug-23-2021, 08:23 PM
Last Post: deanhystad
  [PyGame] Creating Pong in Pygame Russ_CW 2 2,777 Oct-11-2020, 11:56 AM
Last Post: Russ_CW
  Bringing My Game Code Into Class Format ZQ12 1 2,163 Dec-22-2019, 05:32 AM
Last Post: michael1789
  Trying to make a simple pong game. kevindadmun 1 3,870 Aug-05-2019, 06:39 AM
Last Post: kevindadmun
  Smiley Pong Help Jasmineleroy 6 4,650 May-22-2019, 11:36 AM
Last Post: metulburr
  [PyGame] How do I add more balls to basic Pong game? JUtah 2 4,372 Apr-18-2019, 08:40 PM
Last Post: JUtah
  [PyGame] Pong game key.event problem erickDarko 2 4,130 Dec-12-2018, 03:17 PM
Last Post: erickDarko

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020