aW1wb3J0IHB5Z2FtZQppbXBvcnQgc3lzCgojIEluaXRpYWxpc2llcnVuZyB2b24gUHlnYW1lCnB5Z2FtZS5pbml0KCkKCiMgRmVuc3RlcmdyJm91bWw7JnN6bGlnO2UKV0lEVEggPSA3MDAKSEVJR0hUID0gNjAwCgojIEZhcmJlbgpCTFVFID0gKDAsIDAsIDI1NSkKQkxBQ0sgPSAoMCwgMCwgMCkKUkVEID0gKDI1NSwgMCwgMCkKWUVMTE9XID0gKDI1NSwgMjU1LCAwKQoKIyBTcGllbGJyZXR0Z3Imb3VtbDsmc3psaWc7ZQpST1dTID0gNgpDT0xTID0gNwoKIyBTcGllbGJyZXR0IGVyc3RlbGxlbgpkZWYgY3JlYXRlX2JvYXJkKCk6CiAgICByZXR1cm4gW1swIGZvciBfIGluIHJhbmdlKENPTFMpXSBmb3IgXyBpbiByYW5nZShST1dTKV0KCiMgU3BpZWxzdGVpbiBlaW5mJnV1bWw7Z2VuCmRlZiBkcm9wX3BpZWNlKGJvYXJkLCByb3csIGNvbCwgcGllY2UpOgogICAgYm9hcmRbcm93XVtjb2xdID0gcGllY2UKCiMgRyZ1dW1sO2x0aWdlciBadWc/CmRlZiBpc192YWxpZF9sb2NhdGlvbihib2FyZCwgY29sKToKICAgIHJldHVybiBib2FyZFtST1dTLTFdW2NvbF0gPT0gMAoKIyBOJmF1bWw7Y2hzdGUgZnJlaWUgWmVpbGUKZGVmIGdldF9uZXh0X29wZW5fcm93KGJvYXJkLCBjb2wpOgogICAgZm9yIHIgaW4gcmFuZ2UoUk9XUyk6CiAgICAgICAgaWYgYm9hcmRbcl1bY29sXSA9PSAwOgogICAgICAgICAgICByZXR1cm4gcgoKIyBHZXdpbm5lciAmdXVtbDtiZXJwciZ1dW1sO2ZlbgpkZWYgd2lubmluZ19tb3ZlKGJvYXJkLCBwaWVjZSk6CiAgICAjIEhvcml6b250YWwKICAgIGZvciBjIGluIHJhbmdlKENPTFMtMyk6CiAgICAgICAgZm9yIHIgaW4gcmFuZ2UoUk9XUyk6CiAgICAgICAgICAgIGlmIGJvYXJkW3JdW2NdID09IHBpZWNlIGFuZCBib2FyZFtyXVtjKzFdID09IHBpZWNlIGFuZCBib2FyZFtyXVtjKzJdID09IHBpZWNlIGFuZCBib2FyZFtyXVtjKzNdID09IHBpZWNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFZlcnRpa2FsCiAgICBmb3IgYyBpbiByYW5nZShDT0xTKToKICAgICAgICBmb3IgciBpbiByYW5nZShST1dTLTMpOgogICAgICAgICAgICBpZiBib2FyZFtyXVtjXSA9PSBwaWVjZSBhbmQgYm9hcmRbcisxXVtjXSA9PSBwaWVjZSBhbmQgYm9hcmRbcisyXVtjXSA9PSBwaWVjZSBhbmQgYm9hcmRbciszXVtjXSA9PSBwaWVjZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgIyBEaWFnb25hbCAocG9zaXRpdikKICAgIGZvciBjIGluIHJhbmdlKENPTFMtMyk6CiAgICAgICAgZm9yIHIgaW4gcmFuZ2UoUk9XUy0zKToKICAgICAgICAgICAgaWYgYm9hcmRbcl1bY10gPT0gcGllY2UgYW5kIGJvYXJkW3IrMV1bYysxXSA9PSBwaWVjZSBhbmQgYm9hcmRbcisyXVtjKzJdID09IHBpZWNlIGFuZCBib2FyZFtyKzNdW2MrM10gPT0gcGllY2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgRGlhZ29uYWwgKG5lZ2F0aXYpCiAgICBmb3IgYyBpbiByYW5nZShDT0xTLTMpOgogICAgICAgIGZvciByIGluIHJhbmdlKDMsIFJPV1MpOgogICAgICAgICAgICBpZiBib2FyZFtyXVtjXSA9PSBwaWVjZSBhbmQgYm9hcmRbci0xXVtjKzFdID09IHBpZWNlIGFuZCBib2FyZFtyLTJdW2MrMl0gPT0gcGllY2UgYW5kIGJvYXJkW3ItM11bYyszXSA9PSBwaWVjZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIEZhbHNlCgojIFNwaWVsYnJldHQgemVpY2huZW4KZGVmIGRyYXdfYm9hcmQoYm9hcmQpOgogICAgZm9yIGMgaW4gcmFuZ2UoQ09MUyk6CiAgICAgICAgZm9yIHIgaW4gcmFuZ2UoUk9XUyk6CiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBCTFVFLCAoYypTUVVBUkVTSVpFLCByKlNRVUFSRVNJWkUrU1FVQVJFU0laRSwgU1FVQVJFU0laRSwgU1FVQVJFU0laRSkpCiAgICAgICAgICAgIHB5Z2FtZS5kcmF3LmNpcmNsZShzY3JlZW4sIEJMQUNLLCAoaW50KGMqU1FVQVJFU0laRStTUVVBUkVTSVpFLzIpLCBpbnQocipTUVVBUkVTSVpFK1NRVUFSRVNJWkUrU1FVQVJFU0laRS8yKSksIFJBRElVUykKICAgIAogICAgZm9yIGMgaW4gcmFuZ2UoQ09MUyk6CiAgICAgICAgZm9yIHIgaW4gcmFuZ2UoUk9XUyk6ICAgICAgICAKICAgICAgICAgICAgaWYgYm9hcmRbcl1bY10gPT0gMToKICAgICAgICAgICAgICAgIHB5Z2FtZS5kcmF3LmNpcmNsZShzY3JlZW4sIFJFRCwgKGludChjKlNRVUFSRVNJWkUrU1FVQVJFU0laRS8yKSwgSEVJR0hULWludChyKlNRVUFSRVNJWkUrU1FVQVJFU0laRS8yKSksIFJBRElVUykKICAgICAgICAgICAgZWxpZiBib2FyZFtyXVtjXSA9PSAyOiAKICAgICAgICAgICAgICAgIHB5Z2FtZS5kcmF3LmNpcmNsZShzY3JlZW4sIFlFTExPVywgKGludChjKlNRVUFSRVNJWkUrU1FVQVJFU0laRS8yKSwgSEVJR0hULWludChyKlNRVUFSRVNJWkUrU1FVQVJFU0laRS8yKSksIFJBRElVUykKICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCgojIE11c2lrIGxhZGVuIHVuZCBhYnNwaWVsZW4KZGVmIHBsYXlfbXVzaWMoKToKICAgIHB5Z2FtZS5taXhlci5tdXNpYy5sb2FkKCZxdW90O2Z1bm55X211c2ljLm1wMyZxdW90OykgICMgTGFkZSBkZWluZSBhbGJlcm5lIE11c2lrZGF0ZWkKICAgIHB5Z2FtZS5taXhlci5tdXNpYy5wbGF5KC0xKSAgIyAtMSBiZWRldXRldCwgZGllIE11c2lrIGluIGVpbmVyIEVuZGxvc3NjaGxlaWZlIGFienVzcGllbGVuCgojIEhhdXB0cHJvZ3JhbW0KYm9hcmQgPSBjcmVhdGVfYm9hcmQoKQpnYW1lX292ZXIgPSBGYWxzZQp0dXJuID0gMAoKU1FVQVJFU0laRSA9IDEwMApSQURJVVMgPSBpbnQoU1FVQVJFU0laRS8yIC0gNSkKCnNpemUgPSAoV0lEVEgsIEhFSUdIVCkKc2NyZWVuID0gcHlnYW1lLmRpc3BsYXkuc2V0X21vZGUoc2l6ZSkKZHJhd19ib2FyZChib2FyZCkKcHlnYW1lLmRpc3BsYXkuc2V0X2NhcHRpb24oJnF1b3Q7VmllciBnZXdpbm50OiBEZXIgSyZhdW1sO3Nla3JpZWcg8J+ngCZxdW90OykKCiMgU2NocmlmdGFydCBmJnV1bWw7ciBkZW4gR2V3aW5uZXJ0ZXh0Cm15Zm9udCA9IHB5Z2FtZS5mb250LlN5c0ZvbnQoJnF1b3Q7Y29taWNzYW5zJnF1b3Q7LCA3NSkKCiMgQWxiZXJuZSBNdXNpayBhYnNwaWVsZW4KcGxheV9tdXNpYygpCgp3aGlsZSBub3QgZ2FtZV9vdmVyOgogICAgZm9yIGV2ZW50IGluIHB5Z2FtZS5ldmVudC5nZXQoKToKICAgICAgICBpZiBldmVudC50eXBlID09IHB5Z2FtZS5RVUlUOgogICAgICAgICAgICBzeXMuZXhpdCgpCgogICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLk1PVVNFTU9USU9OOgogICAgICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgQkxBQ0ssICgwLDAsIFdJRFRILCBTUVVBUkVTSVpFKSkKICAgICAgICAgICAgcG9zeCA9IGV2ZW50LnBvc1swXQogICAgICAgICAgICBpZiB0dXJuID09IDA6CiAgICAgICAgICAgICAgICBweWdhbWUuZHJhdy5jaXJjbGUoc2NyZWVuLCBSRUQsIChwb3N4LCBpbnQoU1FVQVJFU0laRS8yKSksIFJBRElVUykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHB5Z2FtZS5kcmF3LmNpcmNsZShzY3JlZW4sIFlFTExPVywgKHBvc3gsIGludChTUVVBUkVTSVpFLzIpKSwgUkFESVVTKQogICAgICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCgogICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLk1PVVNFQlVUVE9ORE9XTjoKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIEJMQUNLLCAoMCwwLCBXSURUSCwgU1FVQVJFU0laRSkpCiAgICAgICAgICAgICMgU3BpZWxlciAxCiAgICAgICAgICAgIGlmIHR1cm4gPT0gMDoKICAgICAgICAgICAgICAgIHBvc3ggPSBldmVudC5wb3NbMF0KICAgICAgICAgICAgICAgIGNvbCA9IGludChwb3N4IC8vIFNRVUFSRVNJWkUpCgogICAgICAgICAgICAgICAgaWYgaXNfdmFsaWRfbG9jYXRpb24oYm9hcmQsIGNvbCk6CiAgICAgICAgICAgICAgICAgICAgcm93ID0gZ2V0X25leHRfb3Blbl9yb3coYm9hcmQsIGNvbCkKICAgICAgICAgICAgICAgICAgICBkcm9wX3BpZWNlKGJvYXJkLCByb3csIGNvbCwgMSkKCiAgICAgICAgICAgICAgICAgICAgaWYgd2lubmluZ19tb3ZlKGJvYXJkLCAxKToKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBteWZvbnQucmVuZGVyKCZxdW90O0smYXVtbDtzZS1LJm91bWw7bmlnIGdld2lubnQhISDwn6eA8J+RkSZxdW90OywgMSwgUkVEKQogICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4uYmxpdChsYWJlbCwgKDQwLDEwKSkKICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZV9vdmVyID0gVHJ1ZQoKICAgICAgICAgICAgIyBTcGllbGVyIDIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBvc3ggPSBldmVudC5wb3NbMF0KICAgICAgICAgICAgICAgIGNvbCA9IGludChwb3N4IC8vIFNRVUFSRVNJWkUpCgogICAgICAgICAgICAgICAgaWYgaXNfdmFsaWRfbG9jYXRpb24oYm9hcmQsIGNvbCk6CiAgICAgICAgICAgICAgICAgICAgcm93ID0gZ2V0X25leHRfb3Blbl9yb3coYm9hcmQsIGNvbCkKICAgICAgICAgICAgICAgICAgICBkcm9wX3BpZWNlKGJvYXJkLCByb3csIGNvbCwgMikKCiAgICAgICAgICAgICAgICAgICAgaWYgd2lubmluZ19tb3ZlKGJvYXJkLCAyKToKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBteWZvbnQucmVuZGVyKCZxdW90O0smYXVtbDtzZS1SZWJlbGwgZ2V3aW5udCEhIPCfp4Dwn46JJnF1b3Q7LCAxLCBZRUxMT1cpCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5ibGl0KGxhYmVsLCAoNDAsMTApKQogICAgICAgICAgICAgICAgICAgICAgICBnYW1lX292ZXIgPSBUcnVlCgogICAgICAgICAgICBkcmF3X2JvYXJkKGJvYXJkKQogICAgICAgICAgICB0dXJuICs9IDEKICAgICAgICAgICAgdHVybiA9IHR1cm4gJSAyCgogICAgICAgICAgICBpZiBnYW1lX292ZXI6CiAgICAgICAgICAgICAgICBweWdhbWUudGltZS53YWl0KDMwMDAp
import pygame
import sys
# Initialisierung von Pygame
pygame.init()
# Fenstergröße
WIDTH = 700
HEIGHT = 600
# Farben
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
# Spielbrettgröße
ROWS = 6
COLS = 7
# Spielbrett erstellen
def create_board():
return [[0 for _ in range(COLS)] for _ in range(ROWS)]
# Spielstein einfügen
def drop_piece(board, row, col, piece):
board[row][col] = piece
# Gültiger Zug?
def is_valid_location(board, col):
return board[ROWS-1][col] == 0
# Nächste freie Zeile
def get_next_open_row(board, col):
for r in range(ROWS):
if board[r][col] == 0:
return r
# Gewinner überprüfen
def winning_move(board, piece):
# Horizontal
for c in range(COLS-3):
for r in range(ROWS):
if board[r][c] == piece and board[r][c+1] == piece and board[r][c+2] == piece and board[r][c+3] == piece:
return True
# Vertikal
for c in range(COLS):
for r in range(ROWS-3):
if board[r][c] == piece and board[r+1][c] == piece and board[r+2][c] == piece and board[r+3][c] == piece:
return True
# Diagonal (positiv)
for c in range(COLS-3):
for r in range(ROWS-3):
if board[r][c] == piece and board[r+1][c+1] == piece and board[r+2][c+2] == piece and board[r+3][c+3] == piece:
return True
# Diagonal (negativ)
for c in range(COLS-3):
for r in range(3, ROWS):
if board[r][c] == piece and board[r-1][c+1] == piece and board[r-2][c+2] == piece and board[r-3][c+3] == piece:
return True
return False
# Spielbrett zeichnen
def draw_board(board):
for c in range(COLS):
for r in range(ROWS):
pygame.draw.rect(screen, BLUE, (c*SQUARESIZE, r*SQUARESIZE+SQUARESIZE, SQUARESIZE, SQUARESIZE))
pygame.draw.circle(screen, BLACK, (int(c*SQUARESIZE+SQUARESIZE/2), int(r*SQUARESIZE+SQUARESIZE+SQUARESIZE/2)), RADIUS)
for c in range(COLS):
for r in range(ROWS):
if board[r][c] == 1:
pygame.draw.circle(screen, RED, (int(c*SQUARESIZE+SQUARESIZE/2), HEIGHT-int(r*SQUARESIZE+SQUARESIZE/2)), RADIUS)
elif board[r][c] == 2:
pygame.draw.circle(screen, YELLOW, (int(c*SQUARESIZE+SQUARESIZE/2), HEIGHT-int(r*SQUARESIZE+SQUARESIZE/2)), RADIUS)
pygame.display.update()
# Musik laden und abspielen
def play_music():
pygame.mixer.music.load("funny_music.mp3") # Lade deine alberne Musikdatei
pygame.mixer.music.play(-1) # -1 bedeutet, die Musik in einer Endlosschleife abzuspielen
# Hauptprogramm
board = create_board()
game_over = False
turn = 0
SQUARESIZE = 100
RADIUS = int(SQUARESIZE/2 - 5)
size = (WIDTH, HEIGHT)
screen = pygame.display.set_mode(size)
draw_board(board)
pygame.display.set_caption("Vier gewinnt: Der Käsekrieg 🧀")
# Schriftart für den Gewinnertext
myfont = pygame.font.SysFont("comicsans", 75)
# Alberne Musik abspielen
play_music()
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEMOTION:
pygame.draw.rect(screen, BLACK, (0,0, WIDTH, SQUARESIZE))
posx = event.pos[0]
if turn == 0:
pygame.draw.circle(screen, RED, (posx, int(SQUARESIZE/2)), RADIUS)
else:
pygame.draw.circle(screen, YELLOW, (posx, int(SQUARESIZE/2)), RADIUS)
pygame.display.update()
if event.type == pygame.MOUSEBUTTONDOWN:
pygame.draw.rect(screen, BLACK, (0,0, WIDTH, SQUARESIZE))
# Spieler 1
if turn == 0:
posx = event.pos[0]
col = int(posx // SQUARESIZE)
if is_valid_location(board, col):
row = get_next_open_row(board, col)
drop_piece(board, row, col, 1)
if winning_move(board, 1):
label = myfont.render("Käse-König gewinnt!! 🧀👑", 1, RED)
screen.blit(label, (40,10))
game_over = True
# Spieler 2
else:
posx = event.pos[0]
col = int(posx // SQUARESIZE)
if is_valid_location(board, col):
row = get_next_open_row(board, col)
drop_piece(board, row, col, 2)
if winning_move(board, 2):
label = myfont.render("Käse-Rebell gewinnt!! 🧀🎉", 1, YELLOW)
screen.blit(label, (40,10))
game_over = True
draw_board(board)
turn += 1
turn = turn % 2
if game_over:
pygame.time.wait(3000)