Schachbrett Pygame

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 möchte ein Schachbrett in pygame erzeugen, aber weiß nicht wie. Ich habe schon ein paar sachen versucht aber nichts hat geklappt.
Kann mir da jemand helfen ?
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
Tim0123 hat geschrieben: Freitag 13. Mai 2022, 14:46 Kann mir da jemand helfen ?
Ja.








Kannst du etwas ausholen? Was klappt nicht? Eventuell mit Beispielcode und Fehlermeldung.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tim0123: Was hast Du denn versucht? Und was genau heisst Schachbrett erzeugen? Einfach einfarbige, gefüllte Rechtecke zeichnen? Reicht es eine Farbe zu zeichnen, weil die andere sowieso dem Hintergrund entspricht? Bilder von zwei verschiedenen Feldern entsprechend platzieren?

Ein üblicher Weg sind zwei verschachtelte Schleifen über die Spielbrettkoordinatenindizes und die bitweisen Operatoren & (bitweises und) und ^ (bitweises exklusiv-oder) zu verwenden um zu bestimmen ob man ein weisses oder ein schwarzes Feld an den Spielbrettkoordinaten vorliegen hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tim0123
User
Beiträge: 24
Registriert: Mittwoch 10. Februar 2021, 14:35

Das hier ist mein versuch. Ich bin offen für verbesserungsvorschläge ich weis dass der code nicht soo gut ist
main:

Code: Alles auswählen

import pygame
import sys
from board import Board
from settings import *

class Game():
    def __init__(self):
        pygame.init()
        display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
        self.clock = pygame.time.Clock()
        self.board = Board()

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit
            
            
            self.board.update()
            pygame.display.update()
            self.clock.tick(FRAMERATE)
    
Game()
board:

Code: Alles auswählen

import pygame
from settings import *

class Field(pygame.sprite.Sprite):
    def __init__(self, color, size, x_pos, y_pos):
        super().__init__()
        self.image = pygame.Surface(size, size)
        self.image.fill(color)
        self.rect = self.image.get_rect(center = (x_pos, y_pos))

class Board():
    BLOCK_SIZE = 27
    def __init__(self):
        self.draw_board()
        self.fields = pygame.sprite.Group()

    def _create_all_fields(self):
        pass

    def draw_board(self):
        for row_index, row in enumerate(shape_board):
            for col_index, col in enumerate(row):
                x = col_index + self.BLOCK_SIZE
                y = row_index + self.BLOCK_SIZE
                
                if not col_index % 2:
                    field = Field(Colors.GREY1, self.BLOCK_SIZE, x, y)
                else:
                    field = Field(Colors.WHITE, self.BLOCK_SIZE, x, y)
                self.fields.add(field)

    def update(self):
        self.fields.draw(pygame.display.get_surface)
settings:

Code: Alles auswählen

from enum import Enum

WINDOW_WIDTH = 1400
WINDOW_HEIGHT = 1240
FRAMERATE = 60

class Colors(Enum):
    GREY1 = (100,100,100)
    GREY2 = (43, 43, 43)
    WHITE = (0,0,0)

shape_board = [
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
    'xxxxxxxx'
]
Fehlermeldungen:
File "e:\Python Coding\Projects\Chess\board.py", line 8, in __init__
self.image = pygame.Surface(size, size)
ValueError: size needs to be (number width, number height)

ich würde gerne zwei verschiedene Felder platzieren
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tim0123: Was ist an der Fehlermeldung unklar? Schau mal in die Dokumentation was `Surface` als Argument(e) erwartet und was Du stattdessen übergibst.

Und dann solltest Du alles in eine Datei packen. Man schreibt nicht ein Modul/eine Datei pro Klasse. Das ist Python und nicht Java.

`Board.draw_board()` macht nicht was der Name suggeriert: Da wird nichts gezeichnet. Die Methode macht als öffentliche Methode auch gar keinen Sinn, im Grunde nicht einmal als eigene Methode, denn das gehört zum initialisieren des Objekts, also eigentlich in die `__init__()`.

`sys.exit` wird nicht aufgerufen, da passiert also nichts. Die Funktion sollte man aber auch gar nicht verwenden wenn man nicht zumindest potentiell einen anderen Rückgabecode als 0 an den Programmaufrufer übermitteln will. An der Stelle würde man die Methode einfach mit ``return`` verlassen und gut ist.

Das `display_surface` sollte man nicht einfach verwerfen sondern sauber durch das Programm reichen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tim0123
User
Beiträge: 24
Registriert: Mittwoch 10. Februar 2021, 14:35

__blackjack__ hat geschrieben: Freitag 13. Mai 2022, 15:21 @Tim0123: Was ist an der Fehlermeldung unklar? Schau mal in die Dokumentation was `Surface` als Argument(e) erwartet und was Du stattdessen übergibst.

Und dann solltest Du alles in eine Datei packen. Man schreibt nicht ein Modul/eine Datei pro Klasse. Das ist Python und nicht Java.

`Board.draw_board()` macht nicht was der Name suggeriert: Da wird nichts gezeichnet. Die Methode macht als öffentliche Methode auch gar keinen Sinn, im Grunde nicht einmal als eigene Methode, denn das gehört zum initialisieren des Objekts, also eigentlich in die `__init__()`.

`sys.exit` wird nicht aufgerufen, da passiert also nichts. Die Funktion sollte man aber auch gar nicht verwenden wenn man nicht zumindest potentiell einen anderen Rückgabecode als 0 an den Programmaufrufer übermitteln will. An der Stelle würde man die Methode einfach mit ``return`` verlassen und gut ist.

Das `display_surface` sollte man nicht einfach verwerfen sondern sauber durch das Programm reichen.
also soll ich beim letzten Punkt beim board.py file game.py importieren und die display_surface variable dort verwenden ?
und bei pygame.org steht: Die einzigen erforderlichen Argumente sind die Größen
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

schau mal in welcher Datenstruktur die Größen übergeben werden sollen:

Code: Alles auswählen

Surface((width, height), flags=0, depth=0, masks=None)
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Tim0123
User
Beiträge: 24
Registriert: Mittwoch 10. Februar 2021, 14:35

Oh, Vielen Dank dass ihr mir geholfen habt
Antworten