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()
- Mencegah pion di e5 maju ke depan (sesuai aturan F2P).
- Memungkinkan pion di e5 menyerang diagonal ke d atau f.
- 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
Post a Comment