pygame Tic Tac Toe

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
Tim0123
User
Beiträge: 24
Registriert: Mittwoch 10. Februar 2021, 14:35

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() 
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

da fehlt was bei self.draw_figures
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten