Kode Untuk Serangan Checkmate Pada Raja

KODE UNTUK SERANGAN CHECKMATE PADA RAJA


Cara Mengatasi Error Kode Ketika Raja Dalam Keadaan Checkmate:

1. error ini: 

pygame 2.5.0 (SDL 2.28.0, Python 3.11.4) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 529, in File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 501, in main File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 124, in is_checkmate if is_valid_move(king_position, (new_x, new_y), pieces, color): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 208, in is_valid_move color, p_type = piece.split(' ') ^^^^^^^^^^^ AttributeError: 'tuple' object has no attribute 'split'

 

πŸ”Ή Penyebab Error:

Error terjadi di fungsi is_valid_move(), tepatnya pada baris:

color, p_type = piece.split(' ')

Masalahnya:

  • piece seharusnya berisi string, tetapi dalam kasus ini berisi tuple (x, y).
  • Hal ini terjadi karena is_valid_move() dipanggil dengan king_position, yang merupakan tuple koordinat, bukan nama bidak.

πŸ”Ή Solusi:

Ubah pemanggilan is_valid_move() dalam fungsi is_checkmate().

πŸ”Έ Perbaikan di is_checkmate()

Ubah:

if is_valid_move(king_position, (new_x, new_y), pieces, color):

Menjadi:

king_piece = get_piece_at(king_position[0], king_position[1])  # Ambil nama bidak raja
if king_piece and is_valid_move(king_piece, king_position, (new_x, new_y), pieces, color):

Penjelasan Perbaikan:

  • Ambil nama bidak raja dengan get_piece_at(), sehingga is_valid_move() mendapat nama bidak yang benar, bukan tuple (x, y).

πŸ”Ή Perbaikan Tambahan di is_valid_move()

Tambahkan pengecekan agar piece adalah string sebelum .split(' '):

def is_valid_move(piece, start, end, pieces, turn, last_move, castling_rights):
    if not isinstance(piece, str):  # Pastikan piece adalah string
        return False  

    color, p_type = piece.split(' ')
    x1, y1 = start
    x2, y2 = end

Mencegah error jika piece bukan string.


πŸš€ Kesimpulan

πŸ”Ή Error disebabkan karena piece berupa tuple (x, y), bukan string nama bidak.
πŸ”Ή Solusi: Ambil nama bidak dengan get_piece_at() sebelum memanggil is_valid_move() di is_checkmate().
πŸ”Ή Tambahan perlindungan: Tambahkan pengecekan isinstance(piece, str) di is_valid_move().

Sekarang, raja bisa menangani skak dengan benar tanpa error! 🎯♟️


2. error ini:

pygame 2.5.0 (SDL 2.28.0, Python 3.11.4) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 533, in File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 505, in main else: ^^ File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 124, in is_checkmate if is_valid_move(king_position, (new_x, new_y), pieces, color): ^^^^^^^^^^^^ NameError: name 'get_piece_at' is not defined 


πŸ”Ή Penyebab Error:

Error terjadi karena fungsi get_piece_at() belum didefinisikan atau tidak diimpor dalam file catur_nine_2kuda_1garuda.py.

Ketika kita memanggil:

king_piece = get_piece_at(king_position[0], king_position[1])

Python tidak mengenali fungsi get_piece_at(), karena:

  • Fungsi belum ada dalam file ini, atau
  • Belum diimpor dari file lain (catur_nine_move.py atau yang lain).

πŸ”Ή Solusi 1: Tambahkan Fungsi get_piece_at()

Jika fungsi ini belum ada, tambahkan ke dalam kode:

def get_piece_at(x, y):
    """ Mengembalikan nama bidak di posisi (x, y), atau None jika kosong """
    for piece, positions in pieces.items():
        if (x, y) in positions:
            return piece
    return None

πŸ“Œ Letakkan fungsi ini di awal atau sebelum is_checkmate().


πŸ”Ή Solusi 2: Impor get_piece_at() dari Modul Lain

Jika fungsi ini ada di file lain (catur_nine_move.py), pastikan sudah diimpor di bagian awal:

from catur_nine_move import get_piece_at

πŸ“Œ Tambahkan ini di bagian atas file catur_nine_2kuda_1garuda.py.


πŸš€ Kesimpulan

1️⃣ Jika get_piece_at() belum ada → Tambahkan fungsinya ke dalam kode.
2️⃣ Jika get_piece_at() ada di file lain → Pastikan sudah diimpor dengan from catur_nine_move import get_piece_at.

✅ Setelah perbaikan ini, error "NameError: name 'get_piece_at' is not defined" akan hilang.


3. error ini: 

pygame 2.5.0 (SDL 2.28.0, Python 3.11.4) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 540, in main() File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 512, in main if is_checkmate(turn, pieces, turn): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 131, in is_checkmate king_piece = get_piece_at(king_position[0], king_position[1]) # Ambil nama bidak raja ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 107, in get_piece_at for piece, positions in pieces.items(): ^^^^^^ NameError: name 'pieces' is not defined. Did you mean: 'piece'?


πŸ”Ή Penyebab Error:

Error terjadi pada fungsi get_piece_at() di baris:

for piece, positions in pieces.items():

Pesan error:

NameError: name 'pieces' is not defined. Did you mean: 'piece'?

Artinya:

  • Variabel pieces belum dideklarasikan atau tidak dikirim sebagai parameter ke fungsi get_piece_at().
  • Fungsi ini mencoba mengakses pieces.items(), tetapi pieces tidak dikenali.

πŸ”Ή Solusi 1: Tambahkan Parameter pieces di get_piece_at()

Jika pieces adalah dictionary yang menyimpan posisi bidak, kita harus meneruskannya sebagai parameter:

def get_piece_at(x, y, pieces):
    """ Mengembalikan nama bidak di posisi (x, y), atau None jika kosong """
    for piece, positions in pieces.items():
        if (x, y) in positions:
            return piece
    return None

πŸ“Œ Pastikan semua pemanggilan get_piece_at() di kode Anda diperbarui menjadi:

king_piece = get_piece_at(king_position[0], king_position[1], pieces)

πŸ”Ή Solusi 2: Pastikan pieces Sudah Dideklarasikan

Jika pieces seharusnya global, pastikan sudah dideklarasikan sebelum digunakan dalam get_piece_at():

pieces = {
    "white_king": [(4, 8)],
    "black_king": [(4, 0)],
    # Tambahkan bidak lain...
}

πŸ“Œ Tambahkan ini di bagian awal kode sebelum fungsi get_piece_at().


πŸš€ Kesimpulan

Solusi 1Tambahkan pieces sebagai parameter di get_piece_at().
Solusi 2Pastikan pieces sudah ada sebelum digunakan.

Setelah perbaikan ini, error "NameError: name 'pieces' is not defined" akan hilang!


4. error ini: 

pygame 2.5.0 (SDL 2.28.0, Python 3.11.4) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 546, in main() File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 518, in main if is_checkmate(turn, pieces, turn): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/storage/emulated/0/AppJadi/Catur/Catur_9x9/catur_nine_2kuda_1garuda.py", line 138, in is_checkmate if king_piece and is_valid_move(king_piece, king_position, (new_x, new_y), pieces, color): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: is_valid_move() missing 2 required positional arguments: 'last_move' and 'castling_rights'


πŸ”Ή Penyebab Error:

Error terjadi karena pemanggilan fungsi is_valid_move() tidak sesuai dengan jumlah parameter yang diperlukan.

Pesan error:

TypeError: is_valid_move() missing 2 required positional arguments: 'last_move' and 'castling_rights'

Artinya:

  • Fungsi is_valid_move() membutuhkan 5 parameter, tetapi Anda hanya memberikan 3 parameter.
  • Parameter last_move dan castling_rights tidak diberikan, sehingga Python menganggapnya sebagai error.

πŸ”Ή Solusi 1: Tambahkan Parameter yang Hilang

Perbaiki pemanggilan is_valid_move() dalam fungsi is_checkmate():

if king_piece and is_valid_move(king_piece, king_position, (new_x, new_y), pieces, color, last_move, castling_rights):

πŸ“Œ Tambahkan last_move dan castling_rights agar sesuai dengan definisi fungsi.


πŸ”Ή Solusi 2: Pastikan last_move dan castling_rights Tersedia

Sebelum memanggil is_valid_move(), pastikan variabel last_move dan castling_rights sudah ada:

last_move = None  # Menyimpan langkah terakhir pemain
castling_rights = {
    "white": {"king_side": True, "queen_side": True},
    "black": {"king_side": True, "queen_side": True},
}

Tambahkan kode ini di awal program sebelum fungsi is_checkmate().


πŸš€ Kesimpulan

Solusi 1Tambahkan last_move dan castling_rights saat memanggil is_valid_move().
Solusi 2Pastikan last_move dan castling_rights sudah ada sebelum digunakan.

Setelah perbaikan ini, error "is_valid_move() missing 2 required positional arguments" akan hilang!


5. Error ketika keadaan raja dalam checkmate, tapi  raja seharusnya idak bisa digerakkan lagi, dan ditampilkan pesan "Putih menang dengan skakmat" bila raja hitam kena skakmat, dan tampilkan pesan "Hitam menang dengan skakmat" bila raja putih kena skakmat,

Perbaikan:

Kode diperiksa untuk memastikan bahwa raja tidak bisa digerakkan lagi jika skakmat dan menampilkan pesan pemenang, kita perlu memperbaiki logika pada fungsi is_checkmate() dan memodifikasi bagian utama game loop (main()).

Perbaikan yang Akan Dilakukan

  1. Mencegah Raja Bergerak Saat Skakmat
    • Jika raja dalam kondisi skakmat, pemain tidak bisa melakukan langkah lain.
  2. Menampilkan Pesan Pemenang
    • Jika putih menang: tampilkan "Putih menang dengan skakmat"
    • Jika hitam menang: tampilkan "Hitam menang dengan skakmat"
  3. Memastikan is_valid_move() Dapat Menangani Skakmat dengan Benar
    • Jangan izinkan pergerakan jika skakmat sudah terjadi.

Kode Perbaikan

Silakan perbarui bagian kode Anda dengan modifikasi berikut:

1. Perbaikan di is_checkmate()

def is_checkmate(color, pieces):
    """
    Memeriksa apakah raja dalam kondisi skakmat.
    Jika semua langkah raja tidak bisa menghindari skak, maka raja skakmat.
    """
    king_position = None
    for piece, positions in pieces.items():
        if piece == f"{color} king" and positions:
            king_position = positions[0]
            break

    if not king_position:
        return False  # Jika raja tidak ditemukan, tidak mungkin skakmat

    # Periksa apakah ada langkah sah untuk raja
    for dx, dy in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]:
        new_x = king_position[0] + dx
        new_y = king_position[1] + dy
        if 0 <= new_x < 9 and 0 <= new_y < 9:  # Pastikan dalam batas papan
            if not is_occupied((new_x, new_y), pieces) or is_occupied_by_enemy((new_x, new_y), color, pieces):
                # Jika raja bisa bergerak ke tempat yang tidak skak, tidak skakmat
                return False

    return True  # Tidak ada langkah sah → skakmat

2. Perbaikan di main()

def main():
    global last_move, turn  # Gunakan variabel global untuk giliran pemain
    clock = pygame.time.Clock()
    pieces = initialize_pieces()
    selected_piece = None
    selected_position = None
    running = True

    while running:
        screen.fill(GRAY)
        draw_board(pieces, turn)
        draw_pieces(pieces)

        if is_checkmate(turn, pieces):  # Cek apakah ada skakmat
            print(f"{turn.capitalize()} dalam keadaan skakmat!")
            print(f"{'Putih' if turn == 'black' else 'Hitam'} menang dengan skakmat.")
            running = False  # Akhiri permainan

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

            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                col, row = mouse_x // TILE_SIZE, mouse_y // TILE_SIZE

                if selected_piece:
                    if is_valid_move(selected_piece, selected_position, (col, row), pieces, turn, last_move, castling_rights):
                        # Pindahkan bidak
                        pieces[selected_piece].remove(selected_position)
                        pieces[selected_piece].append((col, row))

                        # Periksa apakah raja dalam skakmat setelah langkah ini
                        if is_checkmate(turn, pieces):
                            print(f"{turn.capitalize()} dalam keadaan skakmat!")
                            print(f"{'Putih' if turn == 'black' else 'Hitam'} menang dengan skakmat.")
                            running = False  # Akhiri permainan

                        # Ganti giliran
                        turn = "black" if turn == "white" else "white"
                        selected_piece = None
                else:
                    for piece, positions in pieces.items():
                        if piece.startswith(turn) and (col, row) in positions:
                            selected_piece = piece
                            selected_position = (col, row)
                            break

        pygame.display.flip()
        clock.tick(60)

# Jalankan permainan
if __name__ == "__main__":
    main()
pygame.quit()
sys.exit()

Penjelasan Perbaikan

  1. Mencegah Langkah Raja Saat Skakmat

    • is_checkmate(turn, pieces) akan memeriksa apakah raja masih memiliki langkah yang sah.
    • Jika tidak ada langkah yang sah, permainan dihentikan, dan pemenang diumumkan.
  2. Menampilkan Pemenang Saat Skakmat

    • Jika putih menang, akan muncul pesan "Putih menang dengan skakmat"
    • Jika hitam menang, akan muncul pesan "Hitam menang dengan skakmat"
  3. Mencegah Kesalahan dalam is_valid_move()

    • Jika raja sudah skakmat, pemain tidak bisa lagi menggerakkan bidak.

Kesimpulan

Dengan perbaikan ini:

  • Raja tidak bisa bergerak setelah skakmat.
  • Pesan pemenang akan tampil dengan benar.
  • Permainan berhenti jika ada skakmat.

Coba jalankan ulang kode setelah pembaruan ini! Jika masih ada error, beritahu saya.


Demikian, semoga bermanfaat.



 


 




Comments

Popular posts from this blog

MOVE (LANGKAH) CATUR TERBAIK SAYA DI TURNAMEN KEJUARAAN CATUR HARIAN CHESS.COM 2025

π”»π•š π•‹π”Έβ„π•Œβ„• π•Šπ•€π•Šπ”Έ 9, β„‚β„π”Όπ•Šπ•Š.ℂ𝕆𝕄 𝕄𝔼ℕ𝔾𝔸𝔻𝔸𝕂𝔸ℕℕ π•‹π•Œβ„β„•π”Έπ•„π”Όβ„• π•‚π”Όπ•π•Œπ”Έβ„π”Έπ”Έβ„• β„‚π”Έπ•‹π•Œβ„ ℍ𝔸ℝ𝕀𝔸ℕ β„‚β„π”Όπ•Šπ•Š.ℂ𝕆𝕄 2025

Kecerdasan Manusia Dan Kecerdasan Buatan/Ai (Artificial Intelligence)