Kode Untuk Gerakan Langkah Pion (Khususnya Pion Di Petak e5) Yang Benar

KODE UNTUK GERAKAN LANGKAH PION (KHUSUSNYA PION di PETAK e5) YANG BENAR



Langkah pion bisa bergerak maju  satu langkah ke depan, dan dari posisi awal bisa bergerak maju dua langkah ke depan, bisa bergerak melakukan serangan diagonal terhadap bidak lawan (memakan bidak lawan), bisa bergerak en passant (memakan bidak lawan yang melewati posisi Pion yang telah berada di daerah lawan) di jalur sebelahnya. 

Khusus pion di petak e5 tidak bisa bergerak maju lagi (pion mentok di e5), dan pion e5 bisa melakukan setangan diagonal terhadap bidak lawan (memakan bidak lawan) di lajur d atau f.

Berikut kode untuk fungsi yang mengatur gerakan langkah Pion:

    # Gerakan Pion (Pawn)

    if p_type == "pawn":

        direction = -1 if color == "white" else 1  # White (-1) maju ke atas, Black (1) maju ke bawah

        start_row = 6 if color == "white" else 1

        e5_position = (4, 4)  # Petak e5 dalam indeks array (0-based)


# **Serangan diagonal untuk pion di e5**

        if abs(x1 - x2) == 1 and y2 - y1 == direction and x2 == 3 or x2 == 5:

            if is_occupied_by_enemy(end, color, pieces):  # Hanya bisa menyerang musuh

                return True                    

        if (x1, y1) == e5_position:

            if abs(x1 - x2) == 1 and y2 - y1 == direction and x2 == 4:  # **Serangan diagonal untuk pion e5l ke lajur d atau f

                if is_occupied_by_enemy(end, color, pieces):  # Hanya bisa menyerang musuh

                    return True

            elif start == e5_position and x1 == 4:  # Aturan F2P: Pion di e5 tidak bisa maju ke depan

            return False


        # Gerakan maju satu langkah

        if x1 == x2 and y2 - y1 == direction and not is_occupied(end, pieces):

            return True


        # Gerakan maju dua langkah dari posisi awal

        if x1 == x2 and y2 - y1 == 2 * direction and not is_occupied(end, pieces):

            start_row = 7 if color == "white" else 1

            mid_position = (x1, y1 + direction)

            if y1 == start_row and not is_occupied(mid_position, pieces):

                return True


        # Serangan diagonal

        if abs(x1 - x2) == 1 and y2 - y1 == direction:

            if is_occupied_by_enemy(end, color, pieces):  # Menyerang bidak lawan

                return True

                

        # Serangan diagonal ke lajur d atau f

        if x1 == 4 and ((y1 == 4 and color == "white" and y2 < 4) or (y1 == 4 and color == "black" and y2 > 4)):        

            if abs(x1 - x2) == 1 and y2 - y1 == direction:

                if is_occupied_by_enemy(end, color, pieces):  # Jika ada bidak lawan di d atau f

                    return True                

                        

       # Gerakan en passant

        if last_move:

            ((last_start_x, last_start_y), (last_end_x, last_end_y), last_piece) = last_move

            if last_piece.endswith("pawn"):

                if last_start_y == (y1 + 2 * direction) and last_end_y == y1 and last_end_x == x2:

                    return True                       

                             

Intinya, logika gerakan pion di fungsi main() pada file Python adalah mencakup:

✅ Pion bisa melangkah sesuai aturan normal

✅ Pion dapat bergerak maju satu langkah

✅ Pion dapat bergerak dua langkah dari posisi awal

✅ Pion dapat menyerang secara diagonal

✅ Pion tidak bisa melewati petak e5 (aturan F2P - Forboden For Pawn)

✅ Pion di lajur d/f bisa menyerang ke petak e5 dan berlanjut di jalur e

✅ Mendukung gerakan en passant jika diterapkan.


Perbaikan pada fungsi terkait dengan getakan langkah Pion:

1. Memperbaiki is_valid_move()

- Pion bisa bergerak maju satu langkah atau dua langkah jika di posisi awal.

- Pion bisa menyerang secara diagonal ke kiri atau kanan jika ada bidak lawan.

- Menambahkan aturan khusus untuk petak e5.

2. Memperbaiki move_piece()

- Memeriksa apakah langkah valid sebelum memindahkan bidak.

- Memastikan bidak yang diambil adalah bidak yang benar.

- Menangani promosi pion jika mencapai baris terakhir.

3. Perbaikan pada main ()

- Memastikan pemilihan bidak bekerja dengan benar.

- Menjalankan logika is_valid_move() sebelum memindahkan bidak.

- Mengatur agar giliran berpindah setelah langkah yang valid.

Pada kode, penambahan gerakan pion di petak e5 (pion yang sudah mentok di e5) bisa digerakan melakukan serangan diagonal memakan bidak lawan di lajur d atau f, menyerang secara diagonal ke d6 atau f6 (putih) / d4 atau f4 (hitam), perlu beberapa perbaikan dalam fungsi is_valid_move().

Berikut perbaikannya:

Tambahan di is_valid_move()

  1. Mencegah pion di e5 maju ke depan (sesuai aturan F2P).
  2. Memungkinkan pion di e5 menyerang diagonal ke d atau f.
  3. Memungkinkan pion dari d atau f menyerang ke e5 lalu melanjutkan perjalanan di jalur e.

Modifikasi Kode:

Tambahkan bagian ini dalam is_valid_move():

# Aturan F2P: Pion di e5 tidak bisa maju ke depan
if start == e5_position and x1 == 4:
    return False

Lalu tambahkan aturan serangan diagonal:

# **Serangan diagonal untuk pion di e5**
if (x1, y1) == e5_position:
    if abs(x1 - x2) == 1 and y2 - y1 == direction:
        if is_occupied_by_enemy(end, color, pieces):
            return True  # Bisa menyerang pion/bidak lawan di lajur d atau f

Bila dibuat sendiri-sendiri secara terpisah antara kode untuk aturan F2P dan kode untuk setangan diagonal Pion di e5 seperti hal di atas, maka hanya akan menghasilkan Pion mentok di petak e5, tapi pion tidak bisa melakukan serangan diagonal (memakan bidak lawan) di lajur d atau f.

Oleh katena itu maka kedua kode harus disatukan (2 in 1) seperti berikut ini:

# **Serangan diagonal untuk pion di e5**

        if abs(x1 - x2) == 1 and y2 - y1 == direction and x2 == 3 or x2 == 5:

            if is_occupied_by_enemy(end, color, pieces):  # Hanya bisa menyerang musuh

                return True                    

        if (x1, y1) == e5_position:

            if abs(x1 - x2) == 1 and y2 - y1 == direction and x2 == 4:  # **Serangan diagonal untuk pion e5l ke lajur d atau f

                if is_occupied_by_enemy(end, color, pieces):  # Hanya bisa menyerang musuh

                    return True

            elif start == e5_position and x1 == 4:  # Aturan F2P: Pion di e5 tidak bisa maju ke depan

             return False


Kemudian tambahkan kode untuk aturan serangan Pion dari d atau f ke e5:

# **Pion dari lajur d atau f bisa menyerang ke e5 lalu berpindah ke lajur e**
if abs(x1 - x2) == 1 and y2 - y1 == direction and x2 == 4:
    if is_occupied_by_enemy(end, color, pieces):
        return True  # Bisa menyerang bidak lawan di e5

Hasil Perbaikan:

  • Pion di e5 tidak bisa maju lurus ke depan.
  • Pion di e5 bisa menyerang secara diagonal ke d6 atau f6 (putih) / d4 atau f4 (hitam).
  • Pion dari d atau f bisa menyerang ke e5 dan kemudian bergerak di jalur e.

Silakan tambahkan kode ini ke dalam file Python, lalu coba jalankan kembali game untuk melihat apakah pion di e5 sudah bisa menyerang secara diagonal.

Jika ditambahkan gerakan langkah promosi Pion di baris akhir petak lawan, maka kodenya dalam fungsi promote_pawn() adalah seperti berikut ini:

# Fungsi untuk mempromosikan pion

def promote_pawn(pawn_position, color, pieces):

    pieces[f"{color} queen"].append(pawn_position)

    pieces[f"{color} pawn"].remove(pawn_position)


Lalu tambahkan kode berikut pada fungsi main() untuk memanggil promote_pawn:

                      # Promosi pion

                        if selected_piece.endswith("pawn") and (row == 0 or row == 8):

                            promote_pawn((col, row), turn, pieces)                       

 


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)