III.1. Xây dựng kiến trúc chƣơng trình
Kiến trúc của hệ thống menu trong ứng dụng game
Main Menu About Help Options New game Exit
Choose difficulty Game
Options Game Help Game About In Game
Hình 19: Kiến trúc menu trong game
MIN MAX 2 3 3 3 0 0 2 2 3 5 0 2 1 MAX MIN A D E B C
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Khi bắt Khi bắt đầu vào ứng dụng game sau trạng thái Splash là trạng thái MainMenu. Tại đây User có thể chọn New game, Options, Help, About, Exit.
New game: Bắt đầu vào chơi game, người chơi sẽ chọn mức độ khó để chơi với máy.
Options: Là một menu con bao gồm các lựa chọn như: Sound Options.
Help: Cung cấp thông tin về luật chơi, cách chơi của game, thông tin về cách sử dụng, chức năng của các phím.
About: Cung cấp thông tin về bản quyền (thời gian sản xuất ra ứng dụng, tên tác giả…).
Exit: Cho phép User thoát khỏi game.
Kiến trúc của Game Loop (Vòng lặp game)
Input Handling
A.I. Decisions
Sounds
Update
Draw
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Draw: vẽ lên màn hình giá trị của các biến trạng thái. Việc vẽ phụ thuộc vào vị trí, sự định hướng, trạng thái. Draw sẽ được vẽ lại khi validate() được gọi.
Update: có nhiệm vụ thay đổi toàn trạng thái của game, không liên quan đến việc draw. Nó bao gồm A.I, Input, và Sound.
A.I. Decisions: A.I tạo ra những quyết định của máy như: di chuyển tới đâu, đánh giá vị trí của quân cờ.
Input Handling: Các hành động của User sẽ được phân tích và xử lý. Nếu lệnh hợp lệ sẽ được thực hiện ngay lập tức, ngược lại chương trình sẽ đưa ra thông tin phản hồi cho User.
Sounds: hiệu ứng âm thanh bao gồm nhạc nền, sound lúc di chuyển 1 quân cờ sẽ được cập nhật mỗi khi cần.
Kiến trúc thuộc tính đối tƣợng
CurrentPos Index PreviousPos Item CurSelectedPos CurTouchPos movedPos isSelected isLoad isPreviousLoad .... indexYou depthInit isPlay Chessboard
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
ChessBoard được tạo nên từ các thuộc tính và đối tượng Item. Đối tượng Item mô tả quân cờ, vị trí hiện tại và vị trí trước đó của quân cờ.
Item
Index: Biểu diễn quân cờ của bên xanh hay đỏ.
CurrentPos: Vị trí hiện tại của quân cờ.
PreviousPos: Vị trí trước đó của quân cở.
ChessBoard
CurSelectedPos: Vị trí hiện tại đang chọn.
CurTouchPos: Vị trí trỏ (touch) lên màn hình.
movedPos: Vị trí quân cờ vừa di chuyển.
isSelected: Kiểm tra quân cờ nào đang chọn không.
isLoad: Kiểm tra nước mới đi mở gánh hay không.
isPreviousLoad: Trạng thái mở gánh trước đó.
indexYou: Màu quân cờ của bạn xanh hay đỏ.
depthInit: Độ sâu (độ khó) của thuật toán tìm kiếm Minimax.
isPlay: Kiểm tra có phải đến lượt bạn đi hay không.
III.2. Xây dựng cấu trúc dữ liệu và thuật toán
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Bắt đầu
Kết thúc
Khởi tạo độ sâu cần tìm kiếm
nước đi
Thực hiện nước đi tốt nhất cho máy Tăng độ sâu 1 đơn vị Chọn nước đi tốt nhất cho người Đánh giá các nước đi Đánh giá các nước đi Đánh giá các nước đi Thực hiện nước đi
tốt nhất cho máy Tăng độ sâu 1 đơn vị Độ sâu = độ sâu ban đầu Lần lượt thực hiện từng nước đi trong tập các nước đi của máy. Giảm
độ sâu đi 1 đơn vị
Lần lượt thực hiện các nước đi tiếp
theo. Tiếp tục giảm độ sâu 1 đơn
vị
Lần lượt thực hiện các nước đi tiếp
theo. Tiếp tục giảm độ sâu 1 đơn
vị Độ sâu = 0 hoặc ở trạng thái máy chiến thắng Độ sâu = 0 hoặc ở trạng thái người chiến thắng Độ sâu = 0 hoặc ở trạng thái máy chiến thắng Đúng Sai Đúng Đúng Đúng Sai Sai Sai
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Thiết kế dữ liệu
Mỗi quân cờ item sẽ có các thuộc tính (indexBitmap, currentCol, currentRow, previousCol, previousRow) chi tiết như sau:
- indexBitmap: Biễu diễn giá trị quân xanh là 1, quân đỏ là 2. - currentCol: Vị trí cột hiện tại của quân cờ.
- CurrentRow: vị trí hàng hiện tại của quân cờ. - previousCol: Vị trí cột trước đó quân cờ vừa rời đi. - previousRow: Vị trí dòng trước đó quân cờ vừa rời đi.
Khởi tạo bàn cờ
Bàn cờ ChessBoard là một tập hợp Items gồm 16 quân cờ. Ta sẽ khởi tạo Items là mảng gồm 16 phẩn tử kiểu Item tương ứng với 16 quân cờ trên bàn cờ.
Ta khởi tạo giá trị ban đầu cho bàn cờ như sau:
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Ta tạo được mảng như sau:
Item[] = { item1(1, 0, 0, x, x), item2(1, 1, 0, x, x), item3(1, 2, 0, x, x), item4(1, 3, 0, x, x), item5(1, 4, 0, x, x), item6(1, 0, 1, x, x), item7(1, 4, 1, x, x), item8(1, 0, 2, x, x), item9(2, 4, 2, x, x), item10(2, 0, 3, x, x), item11(2, 4, 3, x, x), item12(2, 0, 4, x, x), item13(2, 1, 4, x, x), item14(2, 2, 4, x, x), item15(2, 3, 4, x, x), item16(2, 4, 4, x, x) } Nƣớc đi hợp lệ
Để xác định những nước mà quân cờ có thể đi ta dựa vào vị trí hiện tại của quân cờ. Nước đi hợp lệ là nước đi từ 1 quân cờ đến 1 vị trí kề nó, phải đi theo đường kẻ trên bàn cờ và không được đè lên quân cờ khác.
Nhìn vào bàn cờ ta thấy nếu quân cờ đang đứng ở vị trí dòng currentRow và vị trí cột currentCol thì:
Nếu tổng số dòng và số cột (currentCol+currentRow) là một số lẻ thì quân cờ đó chỉ có thể đi theo hàng ngang hoặc cột dọc.
Nếu tổng số dòng và số cột (currentCol+currentRow) là một số chẵn thì ngoài đi ngang, đi dọc thì quân cờ đó còn có thể đi theo đường chéo.
Chỉ đi trong phạm vi bàn cờ nên vị trí đi tới phải thỏa mãn số dòng và số cột nằm trong khoảng từ 0 đến 4.
Ví dụ 2: Quân cờ sau đang nằm ở vị trí (2,1) có tổng số dòng và cột là 3 (số lẻ) nên chỉ có thể đi ngang hoặc dọc
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Hình 24: Ví dụ quân cờ chỉ di chuyển theo hàng ngang, cột dọc
Ví dụ 3: Quân cờ sau lại có thể di chuyển theo hàng ngang cột dọc và đường chéo vì nằm ở vị trí (3,1) có tổng số dòng và cột là 4 (số chẵn).
Hình 25:Nước đi hợp lệ của quân cờ
Sau mỗi nước đi ta thay đổi vị trí của quân cờ đó. Giả sử di chuyển quân cờ item1 đến vị trí mới (i, j) ta sẽ thay đổi giá trị của item1 như sau:
item1.previousCol = item1.currentCol; item1.previousRow = item1.currentRow;
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Tương tự như việc di chuyển các quân cờ, việc ăn các gánh cũng phụ thuộc vào vị trí mà quân cờ di chuyển đến.
Mở gánh
Để kiểm tra nước vừa đi có phải là nước mở gánh hay không, ta cần kiểm tra các điều kiện sau:
- Có ít nhất 1 quân cờ của đối phương có thể di chuyển đến vị trí cũ mà quân cờ vừa rời khỏi
- Nếu quân cờ của đối phương di chuyển tới vị trí đó thì phải gánh được ít nhất 1 gánh
Nếu thỏa mãn cả 2 điều kiện trên thì quân cờ vừa đi sẽ là nước mở gánh tại điểm đó (vị trí mà quân cờ vừa rời khỏi), bắt buộc đối phương phải di chuyển vào vị trí mở gánh để ăn gánh.
Vi dụ 4: Trường hợp sau đây là mở gánh: Khi quân xanh ở vị trí (1,1) đi lên vị trí (1,0) thì mở gánh tại vị trí (1,1) để quân đỏ đi vào vị trí (1,1) này sẽ ăn gánh. Nên bắt buộc quân đỏ phải đi vào ăn gánh, không được đi vào ô khác khi đang mở gánh.
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Bóp chết
Để kiểm tra nước vừa đi có bóp chết được quân cờ nào của đối phương hay không, ta lần lượt thực hiện:
- Ăn các gánh có thể của đối phương (chuyển các quân cờ bị gánh thành quân cờ của mình).
- Tạo một mảng tạm ItemsTemp[] để thực hiện việc kiểm tra các quân cờ bị kẹt. Ban đầu ta gán mảng tạm ItemsTemp[] bằng giá trị mảng Items[] chứa trạng thái hiện tại của các quân cờ.
- Thực hiện việc loại bỏ các quân cờ có thể di chuyển của đối phương ra khỏi mảng tạm ItemsTemp[] cho đến khi nào không còn quân cờ nào của đối phương có thể di chuyển được nữa thì dừng lại.
- Kiểm tra mảng tạm ItemsTemp[] xem còn tồn tại quân cờ nào của đối phương hay không. Tất cả những quân cờ của đối phương còn tồn tại trong mảng tạm ItemsTemp[] chính là những quân cờ bị bóp chết, sẽ trở thành quân cờ của mình.
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến
III.3. Biểu đồ trạng thái
Biểu đồ trạng thái của Ingame
Trạng thái InGame sẽ tồn tại cho đến khi ván chơi kết thúc hoặc User nhấn nút Exit. Sau khi ván chơi kết thúc nếu User chọn Continue thì trạng InGame sẽ được khởi động lại, ngược lại User chọn Exit lập tức sẽ chuyển đến trạng thái MainMenu (kết thúc trạng thái InGame).
Hình 28: Biểu đồ trạng thái InGame
Biểu đồ trạng thái cho cả hệ thống
Bắt đầu ứng dụng là trạng thái Splash, sau đó sẽ đến trạng thái MainMenu. Ở trạng thái MainMenu sẽ phân nhánh ra thành nhiều trạng thái con: New game, Options, Help, About. Từ các trạng thái con đó có thể quay trở về MainMenu. Từ MainMenu chọn Exit sẽ chuyển sang trạng thái kết thúc.
Xây dựng game cờ Gánh dân gian GVHD: PGS.TSKH Trần Quốc Chiến