Spielfeld formen
Verfasst: Freitag 2. Juni 2023, 20:22
Hallo zusammen. ich programmiere gerade das spiel "mensch aerger dich nicht". Ich habe schon die farbauswahl implementiert indem ein extra fenster zuerst geoeffnet wird. nach der farbauswahl wird das spielfeld angezeigt. allerding fehlt noch die eigentliche spiellogik, heisst ich baue zuerst dei grundlagen. das spielfeld wird allerding als rechteck angezeigt bzw ich habe die zielfelder und startfelder sowie die teamfelder in der entsprechenden farbe dargestellt. Mich stoeren die unnotigen felder dazwischen und das mein spielfeld nicht kreuzfoermig ist. hat jemand einen vorschlag wie ich das umschreiben koennte. Tut mir leid wegen den umlauten, habe eine amerikansiche tastatur.
Code: Alles auswählen
import pygame
import sys
import random
# Pygame initialisieren
pygame.init()
# Fenstergröße festlegen
WINDOW_SIZE = (400, 200)
# Fenster erstellen
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption('Farbauswahl')
# Farben definieren
RED = (255, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# Schriftart festlegen
font = pygame.font.Font(None, 36)
# Spielfarben
spielfarben = [
(RED, "Rot", False),
(GREEN, "Grün", False),
(YELLOW, "Gelb", False),
(BLUE, "Blau", False)
]
# Farbauswahl-Funktion für Spieler
def farbauswahl(spieler_nummer):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
for i, (farbe, name, gewaehlt) in enumerate(spielfarben):
if 50 + i * 80 <= mouse_pos[0] <= 50 + (i + 1) * 80 and 80 <= mouse_pos[1] <= 160:
if not gewaehlt:
spielfarben[i] = (farbe, name, True)
return farbe
# Hintergrund füllen
screen.fill(WHITE)
# Farbauswahl anzeigen
for i, (farbe, name, gewaehlt) in enumerate(spielfarben):
if gewaehlt:
pygame.draw.rect(screen, (200, 200, 200), pygame.Rect(50 + i * 80, 80, 60, 60))
text = font.render(str(spieler_nummer), True, BLACK)
text_rect = text.get_rect(center=(50 + i * 80 + 30, 160))
screen.blit(text, text_rect)
else:
pygame.draw.rect(screen, farbe, pygame.Rect(50 + i * 80, 80, 60, 60))
text = font.render(name, True, BLACK)
text_rect = text.get_rect(center=(50 + i * 80 + 30, 160))
screen.blit(text, text_rect)
# Anzeige aktualisieren
pygame.display.flip()
# Spielerfarben wählen
spieler_farben = []
for spieler_nummer in range(1, 5):
farbe = farbauswahl(spieler_nummer)
spieler_farben.append(farbe)
spielfarben = [(color, name, gewaehlt) for color, name, gewaehlt in spielfarben if color != farbe]
# Fenstergröße festlegen
WINDOW_SIZE = (600, 600)
# Fenster erstellen
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption('Mensch Ärger Dich Nicht')
# Breite und Höhe eines einzelnen Quadrats
SQUARE_SIZE = WINDOW_SIZE[0] // 13
# Schriftart festlegen
font = pygame.font.Font(None, 36)
# Würfelfunktion
def wuerfeln():
return random.randint(1, 6)
# Position des Würfelquadrats
dice_square_x = 6
dice_square_y = 6
# Spielfigur-Klasse
class Spielfigur:
def __init__(self, color, start_x, start_y):
self.color = color
self.x = start_x
self.y = start_y
def draw(self):
pygame.draw.circle(screen, self.color, ((self.x + 0.5) * SQUARE_SIZE, (self.y + 0.5) * SQUARE_SIZE),
SQUARE_SIZE // 4)
pygame.draw.circle(screen, BLACK, ((self.x + 0.5) * SQUARE_SIZE, (self.y + 0.5) * SQUARE_SIZE),
SQUARE_SIZE // 4, 2)
# Erstellen der Spielfiguren
spielfiguren = []
for i, farbe in enumerate(spieler_farben):
if farbe == RED:
spielfiguren.extend([
Spielfigur(RED, 1, 1),
Spielfigur(RED, 1, 2),
Spielfigur(RED, 2, 1),
Spielfigur(RED, 2, 2)
])
elif farbe == GREEN:
spielfiguren.extend([
Spielfigur(GREEN, 10, 10),
Spielfigur(GREEN, 10, 11),
Spielfigur(GREEN, 11, 10),
Spielfigur(GREEN, 11, 11)
])
elif farbe == YELLOW:
spielfiguren.extend([
Spielfigur(YELLOW, 1, 10),
Spielfigur(YELLOW, 1, 11),
Spielfigur(YELLOW, 2, 10),
Spielfigur(YELLOW, 2, 11)
])
elif farbe == BLUE:
spielfiguren.extend([
Spielfigur(BLUE, 10, 1),
Spielfigur(BLUE, 10, 2),
Spielfigur(BLUE, 11, 1),
Spielfigur(BLUE, 11, 2)
])
# Spielhauptschleife
aktueller_spieler = -1
wurf_count = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
click_x = mouse_pos[0] // SQUARE_SIZE
click_y = mouse_pos[1] // SQUARE_SIZE
if click_x == dice_square_x and click_y == dice_square_y:
dice_value = wuerfeln()
if dice_value == 6:
# Setze Spielfigur des Spielers in das Startfeld
if spieler_farben[aktueller_spieler] == RED:
spielfiguren[aktueller_spieler * 4].x = 1
spielfiguren[aktueller_spieler * 4].y = 5
elif spieler_farben[aktueller_spieler] == GREEN:
spielfiguren[aktueller_spieler * 4].x = 11
spielfiguren[aktueller_spieler * 4].y = 7
elif spieler_farben[aktueller_spieler] == YELLOW:
spielfiguren[aktueller_spieler * 4].x = 5
spielfiguren[aktueller_spieler * 4].y = 11
elif spieler_farben[aktueller_spieler] == BLUE:
spielfiguren[aktueller_spieler * 4].x = 7
spielfiguren[aktueller_spieler * 4].y = 1
else:
if spielfiguren[aktueller_spieler * 4].x != -1 or dice_value == 6:
# Vorwärtsbewegung um die gewürfelte Zahl
if spielfiguren[aktueller_spieler * 4].x != -1:
new_x = spielfiguren[aktueller_spieler * 4].x + dice_value
new_y = spielfiguren[aktueller_spieler * 4].y
if new_x > 12:
steps_to_goal = new_x - 12
if new_y == 6 and steps_to_goal <= 4:
new_x = 6 + steps_to_goal
new_y = aktueller_spieler * 3 + 7
else:
new_x = spielfiguren[aktueller_spieler * 4].x
new_y = spielfiguren[aktueller_spieler * 4].y
else:
if new_x == 6 and new_y >= aktueller_spieler * 3 + 7 and new_y <= aktueller_spieler * 3 + 10:
new_x = spielfiguren[aktueller_spieler * 4].x
new_y = spielfiguren[aktueller_spieler * 4].y
spielfiguren[aktueller_spieler * 4].x = new_x
spielfiguren[aktueller_spieler * 4].y = new_y
if wurf_count >= 3 or (spielfiguren[aktueller_spieler * 4].x == -1 and dice_value != 6):
aktueller_spieler += 1
if aktueller_spieler >= len(spieler_farben):
aktueller_spieler = 0
wurf_count = 0
# Hintergrund füllen
screen.fill(WHITE)
# Gitter zeichnen
for x in range(13):
for y in range(13):
color = (255, 255, 255)
# Team-Bereiche farbig machen
if 1 <= x < 3 and 1 <= y < 3:
color = RED
elif 10 <= x < 12 and 1 <= y < 3:
color = BLUE
elif 1 <= x < 3 and 10 <= y < 12:
color = YELLOW
elif 10 <= x < 12 and 10 <= y < 12:
color = GREEN
# Zielfelder farbig machen
if 2 <= x < 6 and y == 6:
color = RED
elif x == 6 and 7 <= y < 11:
color = YELLOW
elif x == 6 and 2 <= y < 6:
color = BLUE
if 7 <= x < 11 and y == 6:
color = GREEN
# Startfelder
if 1 <= x < 2 and y == 5:
color = RED
elif x == 5 and 11 <= y < 12:
color = YELLOW
elif x == 7 and 1 <= y < 2:
color = BLUE
if 11 <= x < 12 and y == 7:
color = GREEN
pygame.draw.rect(screen, color, pygame.Rect(x * SQUARE_SIZE, y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE))
pygame.draw.rect(screen, BLACK, pygame.Rect(x * SQUARE_SIZE, y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE), 1)
# Feld, in dem das Würfelergebnis angezeigt wird
pygame.draw.rect(screen, (200, 200, 200),
pygame.Rect(dice_square_x * SQUARE_SIZE, dice_square_y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE))
# Würfelrand in Spielerfarbe zeichnen
pygame.draw.rect(screen, spieler_farben[aktueller_spieler],
pygame.Rect(dice_square_x * SQUARE_SIZE, dice_square_y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE), 4)
# Würfelergebnis anzeigen, wenn vorhanden
if 'dice_value' in locals():
text = font.render(str(dice_value), True, BLACK)
text_rect = text.get_rect(center=((dice_square_x + 0.5) * SQUARE_SIZE, (dice_square_y + 0.5) * SQUARE_SIZE))
screen.blit(text, text_rect)
# Spielfiguren zeichnen
for spielfigur in spielfiguren:
spielfigur.draw()
# Anzeige aktualisieren
pygame.display.flip()