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 ?
Schachbrett Pygame
- __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.
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
Das hier ist mein versuch. Ich bin offen für verbesserungsvorschläge ich weis dass der code nicht soo gut ist
main:
board:
settings:
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
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()
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)
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'
]
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
- __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.
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
also soll ich beim letzten Punkt beim board.py file game.py importieren und die display_surface variable dort verwenden ?__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.
und bei pygame.org steht: Die einzigen erforderlichen Argumente sind die Größen
Hallo,
schau mal in welcher Datenstruktur die Größen übergeben werden sollen:
Grüße
Dennis
schau mal in welcher Datenstruktur die Größen übergeben werden sollen:
Code: Alles auswählen
Surface((width, height), flags=0, depth=0, masks=None)
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]