2024. október 17., csütörtök

Sakk pythonban

Neve; python chess.py

Forrás1;

class Piece:
    def __init__(self, color):
        self.color = color

class Pawn(Piece):
    def valid_moves(self, position):
        # Itt egyszerűsítjük a bábuk mozgását
        direction = 1 if self.color == "white" else -1
        return [(position[0] + direction, position[1])]

class Rook(Piece):
    def valid_moves(self, position):
        return [(position[0] + i, position[1]) for i in range(-7, 8) if i != 0] + \
               [(position[0], position[1] + i) for i in range(-7, 8) if i != 0]

class Board:
    def __init__(self):
        self.board = self.initialize_board()

    def initialize_board(self):
        board = [[None for _ in range(8)] for _ in range(8)]
        # Helyezzük el a bábukat (csak példaként az első sorban)
        board[0][0] = Rook("white")
        board[0][1] = Pawn("white")
        # További bábuk elhelyezése...
        return board

    def display(self):
        for row in self.board:
            row_display = []
            for piece in row:
                if piece is None:
                    row_display.append(".")
                else:
                    row_display.append("P" if isinstance(piece, Pawn) else "R")
            print(" ".join(row_display))

def main():
    board = Board()
    board.display()

    while True:
        move = input("Add meg a bábú mozgását (formátum: 'x y'): ")
        x, y = map(int, move.split())
        # Itt a bábuk mozgatásának logikáját implementálhatjuk
        # Ellenőrizzük, hogy a mozgás érvényes-e, stb.

if __name__ == "__main__":
    main()

vagy grafikusan

Készíthetünk egy alapvető grafikus sakkprogramot Python-ban a Pygame könyvtár segítségével. A program tartalmazza a sakktábla kirajzolását, a bábuk kezdeti elhelyezését, valamint a bábuk mozgatásának alapvető logikáját. Itt egy egyszerű példa:

Először is, győződj meg róla, hogy a Pygame telepítve van. 
Ezt a következő paranccsal teheted meg: pip install pygame


Forrás2;

import pygame
import sys

# Alap konfigurációk
WIDTH, HEIGHT = 800, 800
SQUARE_SIZE = HEIGHT // 8
FPS = 60

# Színek
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Bábuk
PIECES = {
    'b': '♟', 'w': '♙',
    'r': '♖', 'n': '♘', 'b': '♗', 'q': '♕', 'k': '♔',
}

# Sakktábla inicializálása
class Chessboard:
    def __init__(self):
        self.board = self.create_board()

    def create_board(self):
        # 8x8-as tábla létrehozása
        board = [['' for _ in range(8)] for _ in range(8)]
        # A bábuk elhelyezése
        board[0] = ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r']
        board[1] = ['p'] * 8
        board[6] = ['P'] * 8
        board[7] = ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
        return board

    def draw(self, screen):
        for y in range(8):
            for x in range(8):
                color = WHITE if (x + y) % 2 == 0 else BLACK
                pygame.draw.rect(screen, color, (x * SQUARE_SIZE, y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE))

                piece = self.board[y][x]
                if piece:
                    font = pygame.font.Font(None, 74)
                    text = font.render(PIECES[piece.lower()], True, WHITE if piece.isupper() else BLACK)
                    screen.blit(text, (x * SQUARE_SIZE + 15, y * SQUARE_SIZE + 5))

# Főfuggetlen program
def main():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption('Sakk')
    clock = pygame.time.Clock()

    chessboard = Chessboard()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        screen.fill(BLACK)
        chessboard.draw(screen)
        pygame.display.flip()
        clock.tick(FPS)

if __name__ == '__main__':
    main()

Hogyan fut le;
Könyvtárak: A program importálja a pygame és sys könyvtárakat.
Beállítások: A sakktábla méretét, a négyzetek méretét és a frames per second (FPS) beállítást definiáltuk.
Színek: Definiáltuk a fekete és fehér szín értékeit.
Bábuk: A bábukat Unicode karakterek segítségével reprezentáljuk.
Sakktábla osztály: Az osztály létrehozza a sakktáblát, elhelyezi a bábukat, és rajzolja a táblát.
Fő program: Inicializálja a Pygame könyvtárat, létrehozza a sakktáblát, és megkezdi az eseménykezelést és a frissítést.
Futtatás
A fenti kódot egy .py kiterjesztésű fájlba (pl. chess.py) másolva, majd a terminálban futtatva indíthatod a sakkprogramot:

 


2 megjegyzés:

  1. A Forrás2-nek a kódja biztosan hibás!

    Olyan PIECES objektum kulcsra hivatkozik, ami nem is létezik. Továbbá szükséges felvenni kisbetűvel az összes bábút (a fehéreket) és nagybetűvel a feketéket. Aztán meg a kijelzéssel is baj van, mert az alap fontkészlet nem tudja a speciális UTF8 karaktereket megjeleníteni. Fontkészletet kell cserélni, pl. "segoeuisymbol"-ra. És További kijelzési hiba, hogy a fekete betűk/karakterek nem fognak látszódni a fekete mezőn ill. a fehérek a fehéren. Kijelzéskor ellenőrizni kell, hogy milyen karakter színe és milyen a mező színe és ha egyezik, akkor cserélni kell a karakter színét. A javítások így néznek ki:

    # Bábuk : (p)awn/(P)AWN, (r)ook/(R)OOK, k(n)ight/K(N)IGHT, (b)ishop/(B)ISHOP, (q)ueen/(Q)UEEN, (k)ing/(K)ING
    PIECES = {
    'p': '♙', 'r': '♖', 'n': '♘', 'b': '♗', 'q': '♕', 'k': '♔',
    'P': '♟', 'R': '♜', 'N': '♞', 'B': '♝', 'Q': '♛', 'K': '♚',
    }

    # A bábuk elhelyezése
    board[0] = ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r']
    board[1] = ['p'] * 8
    board[6] = ['P'] * 8
    board[7] = ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']

    if piece:
    #font = pygame.font.Font(None, 74)
    font = pygame.font.SysFont("segoeuisymbol", 74)
    if(color == WHITE and piece.isupper()):
    piece = piece.lower()
    if(color == BLACK and piece.islower()):
    piece = piece.upper()
    text = font.render(PIECES[piece.lower()], True, WHITE if piece.isupper() else BLACK)
    screen.blit(text, (x * SQUARE_SIZE + 15, y * SQUARE_SIZE + 5))

    Formázott forrás megosztva itt: https://www.pythonmorsels.com/p/38pgc/


    VálaszTörlés
  2. Ha esetleg a fenti kód lejárna 6 nap után, akkor itt továbbra is elérhető: https://files.catbox.moe/xx8wsy.py

    VálaszTörlés