Seite 1 von 1

pygame Tic Tac Toe

Verfasst: Freitag 3. Juni 2022, 20:12
von Tim0123
Hey ich will ein Tic Tac Toe Spiel machen, aber ich bekomme die Kreise nicht auf das Bild gemalt. Es kommt auch keine Fehlermeldung. Es sieht alles so aus wie es aussehen soll nur die Kreise fehlen.
Code:

Code: Alles auswählen

import pygame
import numpy as np
from enum import Enum


class Color(Enum):
    BG = (0, 186, 150)
    GREY = (54, 54, 54)
    COLOR_LINES = (0, 130, 111)
    WHITE = (255, 255, 245)

class Game:
    WINDOW_WIDTH = 1000
    WINDOW_HEIGHT = 1000
    SQUARE_SIZE = WINDOW_HEIGHT/3
    def __init__(self):
        self.grid = np.zeros(((3, 3)))
        self.grid[1,1] = 1
        self.screen = pygame.display.set_mode((self.WINDOW_WIDTH, self.WINDOW_HEIGHT))
        self.screen.fill(Color.BG.value)
        pygame.display.set_caption("Tic Tac Toe")
        self.clock = pygame.time.Clock()
    
    def draw_lines(self):
        for i in range(1, 3):
            pygame.draw.lines(self.screen, Color.COLOR_LINES.value, False, ((0 + 50, i * self.WINDOW_WIDTH/3), (self.WINDOW_WIDTH - 50, i * self.WINDOW_HEIGHT/3)), 10) # horizontal lines
            pygame.draw.lines(self.screen, Color.COLOR_LINES.value, False, ((i * self.WINDOW_WIDTH/3, 0 + 50), (i * self.WINDOW_WIDTH/3, self.WINDOW_HEIGHT - 50)), 10) # vertical lines

    def draw_figures(self):
        for row in range(3):
            for col in range(3):
                if self.grid[row, col] == 1:
                    pygame.draw.circle(self.screen, Color.WHITE.value, (int(col*self.SQUARE_SIZE+self.SQUARE_SIZE//2), int(row * self.SQUARE_SIZE + self.SQUARE_SIZE//2 )), 100, 15)

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return

            self.draw_lines()
            self.draw_figures
            pygame.display.update()
            self.clock.tick(60)


if __name__ == "__main__":
    game = Game()
    game.run() 

Re: pygame Tic Tac Toe

Verfasst: Freitag 3. Juni 2022, 20:58
von ThomasL
da fehlt was bei self.draw_figures

Re: pygame Tic Tac Toe

Verfasst: Sonntag 5. Juni 2022, 11:32
von __blackjack__
@Tim0123: Weitere Anmerkungen zum Quelltext:

Das Hauptprogramm sollte in einer eigenen Funktion stehen. So wird immer noch ein globaler Name `game` erzeugt.

Es fehlen Aufrufe von `pygame.init()` und `pygame.quit()`. Letzteres sollte man auch bei Programmfehlern sicherstellen.

`WINDOW_WIDTH` und `WINDOW_HEIGHT` haben den gleichen Wert und müssen das auch haben, denn momentan verwendet die Zeichenroutinen teilweise den falschen Namen für die Berechnungen was nur nicht auffällt, weil die den gleichen Wert haben. Entweder sollte man das korrigieren, oder nicht zwei verschiedene Namen für den gleichen Wert verwenden.

`SQUARE_SIZE` wird in `draw_figures()` verwendet, aber nicht in `draw_lines()`. Dort wird der Wert ständig neu berechnet.

Die `lines()`-Funktion für einzelne Linien zu verwenden ist ungewöhnlich, dafür ist eigentlich die `line()`-Funktion vorgesehen.

In `draw_figures()` würde ich nicht die 3 hart kodieren, sondern mich an der tatsächlien Grösse von `self.grid` orientieren mit `enumerate()`.

Code: Alles auswählen

#!/usr/bin/env python3
from enum import Enum

import numpy as np
import pygame


class Color(Enum):
    BG = (0, 186, 150)
    GREY = (54, 54, 54)
    COLOR_LINES = (0, 130, 111)
    WHITE = (255, 255, 245)


class Game:
    WINDOW_SIZE = 1000
    SQUARE_SIZE = WINDOW_SIZE / 3

    def __init__(self):
        self.grid = np.zeros((3, 3))
        self.grid[1, 1] = 1
        self.screen = pygame.display.set_mode(
            (self.WINDOW_SIZE, self.WINDOW_SIZE)
        )
        self.screen.fill(Color.BG.value)
        pygame.display.set_caption("Tic Tac Toe")
        self.clock = pygame.time.Clock()

    def draw_lines(self):
        margin = 50
        line_width = 10
        for i in range(1, 3):
            #
            # Horizontal lines.
            #
            pygame.draw.line(
                self.screen,
                Color.COLOR_LINES.value,
                (margin, i * self.SQUARE_SIZE),
                (self.WINDOW_SIZE - margin, i * self.SQUARE_SIZE),
                line_width,
            )
            #
            # Vertical lines.
            #
            pygame.draw.line(
                self.screen,
                Color.COLOR_LINES.value,
                (i * self.SQUARE_SIZE, margin),
                (i * self.SQUARE_SIZE, self.WINDOW_SIZE - margin),
                line_width,
            )

    def draw_figures(self):
        for y, row in enumerate(self.grid):
            for x, cell in enumerate(row):
                if cell == 1:  # TODO Magische Zahl durch etwas sprechenderes ersetzen.
                    pygame.draw.circle(
                        self.screen,
                        Color.WHITE.value,
                        (
                            int(x * self.SQUARE_SIZE + self.SQUARE_SIZE / 2),
                            int(y * self.SQUARE_SIZE + self.SQUARE_SIZE / 2),
                        ),
                        100,
                        15,
                    )

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return

            self.draw_lines()
            self.draw_figures()
            pygame.display.update()
            self.clock.tick(60)


def main():
    try:
        pygame.init()
        Game().run()
    finally:
        pygame.quit()


if __name__ == "__main__":
    main()