global_match_memory/global_match_memory.py

298 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pygame
import random
import sys
import os
# -------------------------------
# CountryCapital Memory Game
# -------------------------------
CARD_FRONT_COLOR = (245, 246, 248)
MATCH_COLOR = (160, 220, 160)
TEXT_COLOR = (10, 30, 40)
BG_COLOR = (10, 42, 83) # dunkles Blaugrün wie deine Startseite
BUTTON_FILL = (18, 122, 138)
BUTTON_BORDER = (255, 255, 255)
FPS = 30
SCREEN_WIDTH, SCREEN_HEIGHT = 900, 600
# --- Absoluter Pfad zu deinem Logo ---
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
BACKGROUND_FILE = os.path.join(BASE_DIR, "GlobalHintergrund.png") # dein Kartenbild
# -------------------------------
# Kartenrückseite = komplettes Bild
# -------------------------------
def build_card_back(image_path, size):
"""Skaliert dein Logo-Bild so, dass es die Karte komplett bedeckt."""
w, h = size
surf = pygame.Surface((w, h), pygame.SRCALPHA).convert_alpha()
if os.path.exists(image_path):
try:
img = pygame.image.load(image_path).convert_alpha()
img = pygame.transform.smoothscale(img, (w, h)) # volle Fläche
surf.blit(img, (0, 0))
except pygame.error as e:
print(f"⚠️ Fehler beim Laden von {image_path}: {e}")
surf.fill((127, 127, 200)) # Notfallfarbe
else:
print(f"⚠️ Bild nicht gefunden: {image_path}")
surf.fill((127, 127, 200))
return surf
class MemoryGame:
def __init__(self):
self.deck = []
self.pair_map = {}
self.matched = []
self.revealed = []
self.scores = [0, 0]
self.current_player = 0
self.font = None
self.card_rects = []
self.selected = []
self.found_pairs = 0
self.total_pairs = 0
self.running = True
self.awaiting_confirmation = False
self.confirmation_result = None
self.correct_answer_expected = None
self.state = "continent"
self.buttons = []
self.selected_continents = []
self.level = None
self.pair_count = 6
self.bg_image = None
self.card_back = None
# -------------------------------
# Kartendateien laden
# -------------------------------
def load_cards(self, filename):
if not os.path.exists(filename):
print(f"⚠️ File not found: {filename}")
return []
pairs = []
with open(filename, "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 2:
pairs.append((parts[0], parts[1]))
return pairs
def prepare_deck(self):
self.deck = []
for continent in self.selected_continents:
base = continent
if self.level == "Easy":
self.deck += self.load_cards(base + "-major.txt")
elif self.level == "Normal":
self.deck += self.load_cards(base + "-major.txt")
self.deck += self.load_cards(base + "-Minor.txt")
elif self.level == "Hard":
self.deck += self.load_cards(base + "-major.txt")
self.deck += self.load_cards(base + "-Minor.txt")
self.deck += self.load_cards(base + "-Dependent.txt")
if not self.deck:
print("⚠️ No cards loaded, check text files.")
sys.exit()
random.shuffle(self.deck)
self.deck = self.deck[:self.pair_count]
def setup_game(self):
self.cards = []
self.pair_map = {}
for country, capital in self.deck:
self.cards.append(country)
self.cards.append(capital)
self.pair_map[country] = capital
self.pair_map[capital] = country
random.shuffle(self.cards)
self.matched = [False] * len(self.cards)
self.revealed = [False] * len(self.cards)
self.total_pairs = len(self.deck)
self.card_rects = []
self.selected = []
cols = 4
rows = (len(self.cards) + cols - 1) // cols
margin = 10
card_width = (SCREEN_WIDTH - (cols + 1) * margin) // cols
card_height = (SCREEN_HEIGHT - (rows + 1) * margin - 100) // rows
# Kartenrückseite = dein Logo vollflächig
self.card_back = build_card_back(BACKGROUND_FILE, (card_width, card_height))
y_offset = 80
for i, _ in enumerate(self.cards):
col = i % cols
row = i // cols
x = margin + col * (card_width + margin)
y = y_offset + margin + row * (card_height + margin)
rect = pygame.Rect(x, y, card_width, card_height)
self.card_rects.append(rect)
# -------------------------------
# Menü zeichnen
# -------------------------------
def draw_menu(self, screen, title, options):
screen.fill(BG_COLOR)
title_text = self.font.render(title, True, (255, 255, 255))
screen.blit(title_text, (SCREEN_WIDTH // 2 - title_text.get_width() // 2, 100))
self.buttons = []
for i, option in enumerate(options):
rect = pygame.Rect(SCREEN_WIDTH // 2 - 150, 200 + i * 70, 300, 50)
pygame.draw.rect(screen, BUTTON_FILL, rect, border_radius=10)
pygame.draw.rect(screen, BUTTON_BORDER, rect, 2, border_radius=10)
text = self.font.render(option, True, (255, 255, 255))
screen.blit(text, (rect.centerx - text.get_width() // 2, rect.centery - text.get_height() // 2))
self.buttons.append((rect, option))
pygame.display.flip()
# -------------------------------
# Spiel zeichnen
# -------------------------------
def draw_game(self, screen):
screen.fill(BG_COLOR)
title = self.font.render(f"Player {self.current_player + 1}'s turn", True, (255, 255, 255))
screen.blit(title, (20, 20))
score_text = self.font.render(f"Scores: P1={self.scores[0]} P2={self.scores[1]}", True, (220, 230, 235))
screen.blit(score_text, (20, 50))
for i, rect in enumerate(self.card_rects):
if self.matched[i]:
pygame.draw.rect(screen, MATCH_COLOR, rect)
pygame.draw.rect(screen, (0, 0, 0), rect, 2)
text = self.font.render(self.cards[i], True, TEXT_COLOR)
screen.blit(text, text.get_rect(center=rect.center))
elif self.revealed[i]:
pygame.draw.rect(screen, CARD_FRONT_COLOR, rect)
pygame.draw.rect(screen, (0, 0, 0), rect, 2)
text = self.font.render(self.cards[i], True, TEXT_COLOR)
screen.blit(text, text.get_rect(center=rect.center))
else:
# Dein Logo als Rückseite
screen.blit(self.card_back, rect.topleft)
pygame.draw.rect(screen, (0, 0, 0), rect, 2)
pygame.display.flip()
# -------------------------------
# Klicks & Logik
# -------------------------------
def handle_click(self, pos):
if self.state in ["continent", "americas", "difficulty", "pairs"]:
for rect, option in self.buttons:
if rect.collidepoint(pos):
if self.state == "continent":
if option == "Americas":
self.state = "americas"
elif option == "All Continents":
self.selected_continents = ["Europe", "Asia", "Africa", "Oceania", "North-America", "South-America"]
self.state = "difficulty"
else:
self.selected_continents = [option]
self.state = "difficulty"
elif self.state == "americas":
if option == "North-America":
self.selected_continents = ["North-America"]
elif option == "South-America":
self.selected_continents = ["South-America"]
elif option == "Americas":
self.selected_continents = ["North-America", "South-America"]
self.state = "difficulty"
elif self.state == "difficulty":
self.level = option
self.state = "pairs"
elif self.state == "pairs":
self.pair_count = int(option)
self.prepare_deck()
self.setup_game()
self.state = "game"
return
elif self.state == "game":
for i, rect in enumerate(self.card_rects):
if rect.collidepoint(pos) and not self.revealed[i] and not self.matched[i]:
self.revealed[i] = True
self.selected.append(i)
return
def check_selected(self):
if self.state != "game":
return
if len(self.selected) == 2:
a, b = self.selected
if self.pair_map.get(self.cards[a]) == self.cards[b]:
self.matched[a] = self.matched[b] = True
self.scores[self.current_player] += 1
self.found_pairs += 1
else:
pygame.time.wait(600)
self.revealed[a] = self.revealed[b] = False
self.current_player = 1 - self.current_player
self.selected = []
# -------------------------------
# Hauptschleife
# -------------------------------
def run(self):
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Global Match Memory")
clock = pygame.time.Clock()
self.font = pygame.font.SysFont(None, 32)
print("Erwarteter Bildpfad:", BACKGROUND_FILE)
if not os.path.exists(BACKGROUND_FILE):
print("⚠️ Logo nicht gefunden! Lege GlobalMatch.png in denselben Ordner.")
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
self.handle_click(event.pos)
if self.state == "continent":
self.draw_menu(screen, "Select Continent", ["Europe", "Americas", "Asia", "Africa", "Oceania", "All Continents"])
elif self.state == "americas":
self.draw_menu(screen, "Select Region", ["North-America", "South-America", "Americas"])
elif self.state == "difficulty":
self.draw_menu(screen, "Select Difficulty", ["Easy", "Normal", "Hard"])
elif self.state == "pairs":
self.draw_menu(screen, "Select Number of Pairs", ["4", "6", "8", "10", "12"])
elif self.state == "game":
self.draw_game(screen)
self.check_selected()
if self.found_pairs == self.total_pairs:
self.display_winner(screen)
pygame.display.flip()
pygame.time.wait(2000)
self.running = False
clock.tick(FPS)
pygame.quit()
sys.exit()
def display_winner(self, screen):
if self.scores[0] > self.scores[1]:
text = "🏆 Player 1 Wins!"
elif self.scores[1] > self.scores[0]:
text = "🏆 Player 2 Wins!"
else:
text = "🤝 Draw!"
win_text = self.font.render(text, True, (255, 255, 0))
rect = win_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
screen.blit(win_text, rect)
if __name__ == "__main__":
game = MemoryGame()
game.run()