Repo isinya tubes catur IF2111. Direktori dibagi jadi 2 di src ada engine sama adt. Adt isinya adt yang dibuat di kelas, kalau engine code yang mau kita buat di engine chessnya.
Karena ukuran projek ini lumayan dan kita ada berempat sangat disarankan agar saat kita ngoding untuk membuat branch. Caranya gimana?? Tutorial Branch. Yang perlu diperhatikan:
- Buat nama branch sesuai nama kalian. Contoh bikin branch namanya Abbel
git checkout -b Abbel
- Push ke githubnya ke branch kalian aja ya nanti kalau mau dimerge bilang bilang dulu
- Update
README.md
di branchmaster
- Baru beresin definisi board
- Baru beresin definisi bidak
- ADT minus mesinkata
- Board di file
board.h
: Abbel- Beresin definisi board sama kondisi
- Bidak di file
bidak.h
: Abbel- Beresin definisi bidak buat di linked-list
- Buat algoritma move-generation tiap bidak
- Cara bergerak bidak di board :
- Move : Abbel
- Implement algoritma move-generation
- Special Move : Vito
- Implement algoritma move-generation
- Move : Abbel
- Linked list buat info bidak : Abbel
- Bikin konstruktor listnya
- Stack buat undo : Yumna
- Fixin data struct nya
- Buat konstruktor stack buat implementasi undo
- Queue buat giliran : Shafa
- Fixin data struct nya
- Buat konstruktor queue
- Parsing file sama state game : Vito
- Pikirin state game isinya apa aja
- Algoritma parsing file ke state-game
- Tambahin adt mesin kata kesini
Aslinya board tuh gini:
Ya jadi kita akan pakai representasi board dengan array ukuran 10*12. Jadi arraynya ada 120 tapi yang dipake cuman 64 biji, kira kira kaya gini:
Ya bisa diliat ya itu jadi kita mulainya dari 21 makanya kita buat enum dari 21 yaitu A1 untuk nandain si papannya. Kira kira gini bray:
Gunanya buat apa itu teh? Sebenernya mah buat penanda aja biar algoritma kita bisa nemu kalau ternyata papannya off-board gitu.
Nah nanti setiap tile tuh bakal diisi sama integer yang merepresentasikan si kondisi benerannya di papan catur.
Belum fix ya sangat mungkin ditambah lagi terutama mengenai kondisi kondisi spesial contohnya skak dan special moves
typedef struct {
TabInt Tabel; //Table of int[120]
boolean is_checkmate; //special for the king
boolean is_en_passant; //special for the pawn
boolean is_castling;
booolean is_promosi;
}BOARD;
Belum fix juga bisa ditambahin apa aja terutama saat udah implement linked-list
typedef struct{
PAWN_TYPE tipe;
BOARD_SQUARES posisi;
//bisa diisi apa aja
}BIDAK;
Ini sebenernya move tuh buat hasil generate biasa tapi juga bisa dijadiin elemen stack tinggal di typedef aja sih
typedef struct{
BOARD_SQUARE prev_position;
BOARD_SQUARE now_position;
boolean is_makan;
}MOVE;
Kerjaan shafa
Nah ini kerjaan vito buat mikirin state tuh isinya apa aja
Ya karena kita memakai board 12*10 ada beberapa peraturan yang harus ditaati. Kira kira board nya kaya gini nanti:
Ya kan pas sliding bidaknya tuh ada yang :
- Up
- Down
- Left
- Right
- Serong Kanan Atas
- Serong Kiri Atas
- Serong Kanan Bawah
- Serong Kiri Bawah
Oiya kita definisiin atas,bawah, dkk nya itu dari perspektif si pemain putih ya. Pemain hitam menyesuaikan. Nah jadi, bisa keliatan dari pola di board bahwa bergeraknya tuh:
1. Up = Posisi Awal + 10
2. Down = Posisi Awal - 10
3. Left = Posisi Awal - 1
4. Right = Posisi Awal + 1
5. Serong Kanan Atas = Posisi Awal + 11
6. Serong Kiri Atas = Posisi Awal + 9
7. Serong Kanan Bawah = Posisi Awal - 9
8. Serong Kiri Bawah = Posisi Awal - 11
Nah ada lagi yang unik yaitu untuk kuda sebenernya turunan dari yang atas juga sih, jadi gini gambarnya:
Kuda tuh kan punya 8 kemungkinan:
1. Knight1 = Posisi awal + 21
2. Knight2 = Posisi awal + 12
3. Knight3 = Posisi awal - 8
4. Knight4 = Posisi awal - 19
5. Knight5 = Posisi awal - 21
6. Knight6 = Posisi awal - 12
7. Knight7 = Posisi awal + 8
8. Knight8 = Posisi awal + 19
-
Jadi kita punya board yang direpresentasikan sebagai array[120] of elemen.
-
Nah setiap array ini isinya integer yang merepresentasikan objek yang sebenarnya yang ada di setiap tile catur.
-
Kita juga punya linked-list yang isinya adalah setiap bidak yang ada di papan catur which is jumlahnya adalah 16 node yang artinya total ada 2 list.
-
State awalnya adalah setiap giliran tuh memiliki kondisi yang spesifik di arraynya untuk representing kondisi aktual tentang posisi, nah linked list tuh merepresentasikan setiap bidak yang isinya ada jenis bidak dan posisi:
typedef struct{ PAWN_TYPE tipe; BOARD_SQUARES posisi; }BIDAK;
Nah isi dari linked-list ini kita akan pakai untuk meng-generate possible move dari setiap bidak (node linked-list)
-
Ide umum generate move:
- Kita generate semua move dari setiap bidak spesifik sesuai aturan catur kita panggil aja Illegal-move dengan cara mengiterasi setiap node nanti akan dihasilkan sekumpulan opsi, termasuk makan memakan juga.
- Setelah itu akan difiliter move itu dengan melihat kondisi aktual yang ada di array, seperti apakah tile yang akan dituju legal atau engga (ga masuk bad_square) apakah di tile yang dituju ada isinya atau engga, apakah mungkin juga di tile yang dituju ada yang bisa dimakan atau engga. Intinya kita akan saring dari illegal-move buat nyampe pada tile yang isinya '0' atau lawan. Kita sebut saja setelah disaring namanya Legal-move
-
Nah algoritma umum untuk move-generation:
- Iterasi awal (pre_move) setiap node di linked-list
- Generate Illegal move dari setiap node, dengan ketentuan:
- Posisi yang mungkin untuk berpindah
- atau posisi yang mungkin untuk makan (terutama buat pion karena makan sama geraknya beda)
- Filter Illegal move dengan ketentuan:
- Eliminasi Kalau tile tujuan bad_square
- Eliminasi kalau tile tujuan isinya kawan
- Eliminasi kalau tile tujuan terpotong (kecuali kuda) oleh apapun
- Didapatlah Legal move dengan ketentuan:
- Aksi berpindah
- Aksi makan (spesifik sesuai ketentuan tiap bidak)
- User prompt input
- Eksekusi aksi dengan ketentuan:
- Posisi yang digerakan berubah (kondisi array berubah)
- Kalau makan lawan, artinya ada kondisi satu elemen array yang ditimpa jadi nanti akan dicheck setelah ini
- Setelah aksi dilakukan kita push ke stack untuk ngisi mengenai info move baru aja dilakukan dengan isi stack
typedef struct{ BOARD_SQUARE prev_position; BOARD_SQUARE now_position; boolean is_makan; }ELEMEN_STACK;
- Iterasi akhir post_move, dengan ketentuan:
- Check di setiap posisi bidak (BIDAK.POSISI yang belum dialter) yang ada di linked-list apakah sesuai dengan kondisi yang ada di elemen array atau engga
- Kalau ga sesuai, ada dua kemungkinan: kosong atau ditimpa oleh lawannya
- Nanti info yang masuk ke stack, dipake buat nge-update node bidak yang di linked-list
- Kalau dia dimakan, node yang berkesesuaian di dealokasi dan score pemain lawan ditambah
- Algoritma bakal menghasilkan list of move yang diperuntukkan untuk setiap list of bidak yang ada. Jadi fungsi move ini argumennya itu list of bidak yang bakal diiterasi satu-satu