Muc dich nghién cuu Trong bài tiêu luận này, chúng ta sẽ nghiên cứu cách thiết kê và xây dựng trò chơi cờ tướng dựa trên nền tảng Java thông qua thư viện JavaFX nhằm tạo giao điện cho t
Trang 1
TRUONG DAI HOC DA LAT KHOA CONG NGHE THONG TIN
Trang 2CHƯƠNG 1 TỔNG QUAN NGHIÊN CỨU
1 Tổng quan về tình hình nghiên cứu
3.2 JaVaFX ch nh nh nn nh nhe nhe He Ho kh kh khe 8
4.1 Giải thuật minimax cece eee eeeeeeeee errr 9
4.2 Cắt tỉa Alpha-Beta Lee 10
CHUONG 2 GiAO DIEN UNG DUNG
1.1 Tạo bàn cờ thông qua vòng lặp 26
1.2 Quy định cách di chuyển của các quân cờ 26
1.3 Kết thúc ván cờ - ch nh se 29
2 Trang chơi với máy
29
Trang 33 Trang choi online
Trong suốt quá trình học tập và hoàn thành đồ án này, nhóm chúng em đã nhận được
rất nhiều sự hướng dẫn tận tình quý báu của thay cô, của anh chị cùng khoa Với lòng
biết ơn sâu sắc, nhóm em xin được bảy tỏ lời cảm ơn đên:
Ban piám hiệu trường Đại Học Đà Lạt, khoa Công Nghệ Thông Tin đã tạo điều kiện
dé nhóm em hoàn thành được đồ án chuyên nganh cua minh
Đặc biệt, nhóm chúng em xin gửi lời cảm ơn chân thành đến người thầy Đoàn Minh
Khuê đã hướng dẫn, siúp đỡ, động viên và tạo mọi điều kiện để nhóm chúng em hoàn
thành tốt được đồ án chuyên ngành này Cảm ơn các anh chị khóa trên đã hỗ trợ, giúp
đỡ nhóm chúng em trong quá trình thực hiện đồ án chuyên ngành
Tuy nhiên trong quá trình làm đồ án, do kiến thức nhóm chúng em vẫn còn nhiều hạn
chế nên không thê tránh khỏi thiếu sót khi trình bài và đánh giá vấn đề Nhóm chúng
em rất mong nhận được sự góp ý, đánh giá của thầy cô để đồ án chuyên ngành của
nhóm sẽ thêm phân hoàn thiện hơn
Kính chúc thầy cô sức khỏe, thành công trong con đường sự nghiệp
Sinh viên
Trang 4Bùi Quốc Dũng
Bùi Phúc Thịnh
Trang 5MO DAU
1 Muc dich nghién cuu
Trong bài tiêu luận này, chúng ta sẽ nghiên cứu cách thiết kê và xây dựng trò
chơi cờ tướng dựa trên nền tảng Java thông qua thư viện JavaFX nhằm tạo giao điện
cho trò chơi, cách lập trình các hướng đi của quân cờ, các tính năng bao gồm hai
người chơi, chơi với máy đơn, chơi trực tuyến Từ đó có thê giúp nắm vững về xây
dựng giao diện trone JavaEX, cách triển khai các thuật toán quy định cách di chuyên
của từng quân cờ, nghiên cứu và triển khai hệ thống trí tuệ nhân tạo để chơi cờ tướng,
quản lý dự án trong Java
2 Mục tiêu
Tìm hiểu được ngôn ngữ lập trình hướng đối tượng Java và thư viện JavaFX
Tìm hiểu được cách xây dựng giao diện ứng dụng và lập trình cho các chức năng của
trò chơi thông qua ngôn ngữ Java Tìm hiểu về cơ sở dữ liệu My§QL Nắm kiến thức
về lập trình, tìm hiểu được cách vận dụng API, Component có sẵn
3 Các chức năng dự kiến
- Hiển thị các quân cờ và bản cờ trực quan, sinh động
- Dễ dàng theo dõi vị trí và quy tắc di chuyên của các quân cờ
- Hién thị thông báo chiến thắng, thua cuộc hoặc hòa
- Chơi cờ tướng với 2 người chơi, chơi với máy đơn, chơi trực tuyến
- Bảng xếp hạng trong chế độ chơi trực tuyến
- Lưu lại vị trí bàn cờ trong chế độ 2 người chơi để tiếp tục sau này
4 Đối tượng hướng đến
Những người chơi bộ môn cờ tướng muôn chơi với bạn bè, máy tính và trực
tuyến
Cộng đồng chơi cờ tướng trực tuyến, nơi có thể giao lưu và bảng xếp hạng
Trang 6Những người muốn học cách lập trình bằng ngôn ngữ Java va thu vién JavaFX,
nghiên cứu và phát triển trí tuệ nhân tạo
5 Phương pháp thực hiện
- Tìm hiểu và học cách lập trình bằng ngôn ngữ Java, thư viện JavaFX
- Tìm hiểu và học cách lập trình trí tuệ nhân tạo
- Thiết kế cơ sở dữ liệu với MySQL
- Thiết kế trò chơi
- Vận dụng Component và API có san tir Java
- Triên khai và kiêm thử
Trang 7CHUONG 1 TONG QUAN NGHIEN CUU
1 Tổng quan về tình hình nghiên cứu
Trong nghiên cứu này xây dựng một giao diện game về cờ tướng thông qua
ngôn noữ JavaFX Việc xây dựng một game giúp cho người dùng có thê giải trí thông
qua việc khám phá các thế cờ, chơi cùng máy tính và có thể chơi cùng với người khác
thông qua Internet đã được phát triển nhiều trong thời thế hiện nay
2 Tổng quan về Cờ tướng
Cờ tướng là một trò chơi trí tuệ truyền thống bắt nguồn từ Trung Quốc Trò
chơi này được chơi rộng rãi trong nhiều quốc gia Châu Á và có nhiều biến thể khác
nhau Về bàn cờ trong cờ tướng được chơi trên bản cờ hình vuông với kích thước
9x10, bàn cờ sẽ được chia làm hai phần bằng nhau với ở giữa là một phần trống hay
còn gọi là “Sông” Môi đội có 16 quân cờ, bao g6m tướng, sỹ, tượng, mã, xe và tốt
- Quân Tướng: Đây là quân quan trọng nhất khi một trong hai người chơi bắt
được Tướng, trò chơi sẽ kết thúc với chiến thắng thuộc về người bắt được Tướng chỉ
di chuyên 1 bước theo đường ngang hoặc dọc trong phạm vi 6 2x2
Trang 8
Hình 2 Khu vực giới hạn của quân Tướng
- Quân Sỹ: Di chuyên một bước theo đường chéo trong phạm vi ô giới hạn của
- Quân Xe: Di chuyển theo đường ngang hoặc đọc theo nhiều ô nhưng không
thê nhảy qua quân cờ
- Quân Pháo: Di chuyên như quân Xe tuy nhiên có thể bắt quân cờ địch bang
cách nhảy qua một quân cờ bắt kỳ
- Quân Tốt: Di chuyên một bước theo đường dọc, khi di qua “Sông” có thé di
ngang
Trò chơi có thê kết thúc Hòa nêu hai người chơi chỉ còn lại Tướng và không có
cách nào đề chiêu tướng
3 Tổng quan về Java
Java là một ngôn ngữ lập trình phô biến được thiết kế dùng cho việc phát triển
ứng dụng chạy trên nhiều nên tảng khác nhau Java hỗ trợ lập trình đa nhiệm thông
qua việc sử dụng luồng (thread), đồng thời Java là ngôn ngữ lập trình hướng đối tượng
thúc đây sử dụng OPP với cú pháp rõ ràng, dễ đọc và dễ bảo trì Với hệ sinh thái
framework réng lon nhu Spring, Java FX giup ngwoi dung linh hoạt trong việc lựa
chon
Trang 9<=_
Java
Hinh 3 Java
Đề có thể thuận tiện cho lập trình, xây dựng ứng dụng việc cài đặt JDK (Java
Development Kít) cung cấp môi trường phát triển ứng dụng nhằm hỗ trợ cho việc
cung cấp các thư viện, các framework phát triển ứng dụng đồ họa và giao diện người
dùng như JavaFX
3.1 HashMap
HashMap là một trong nhiều cách để tô chức đữ liệu trong chương trình Thông
qua thuat toan Hashing, đối tượng sẽ trả về một giá trị đại diện nào đó nhằm lưu trữ
giá trị khi cần thiết
- Su dung ham bam (hash function): HashMap su dung mot ham bam (hash
function) dé gán khóa (key) với một chỉ số trong một mảng (array) Điều này cho phép
tìm kiếm các giá trị nhanh chóng dựa trên key
-Cặp key-value: Mỗi phần tử trong HashMap được lưu trữ đưới dạng một cặp
key-value Các khóa (key) được sử dụng để truy xuất giá tri trong tng
-Cho phép giá trị trùng lặp: HashMap cho phép giá trị trùng lặp, nhưng
không cho phép key trùng lặp Trường hợp xuất hiện key trùng lặp, giá trị trước đó có
key sẽ bị phi đè
-Cho phép null: HashMap cho phép sử dụng key và value null Điều nảy có
nehĩa là có thể lưu trữ một giá trị null bằng key null và ngược lại
-Không thứ tự: Các phần tử trone HashMap không được sắp xếp theo bất kỳ
thứ tự nào mà có thể thay đổi khi thêm hoặc xóa Nếu bạn muốn s1ữ thứ tự chèn, có
thé str dung LinkedHashMap
Trang 10- Không đồng bộ: HashMap không đồng bộ, tức là nó không an toàn cho môi trường đa luồng Nếu bạn cần sử dụng HashMap trong môi trường đa luỗng, có thể sử dụng ConcurrentHashMap
- Tự động điều chỉnh kích thước: Khi số lượng phần tử trong HashMap vượt quá ngưỡng tải trọng (load factor) của nó, HashMap sẽ tự động điều chỉnh kích thước
Jo |+ |2 |3 4 [5 le |7 |s [9 [10] 41] 12] 13
115 118 {“sachin”} {‘vishal”}
JavaFX là một thư viện sử dụng trong ngôn ngữ lập trình Java, bao gồm các
201 dé hoa, công cụ hé tro đề tạo, kiếm tra và triển khai ứng dụng trên nhiều loại thiết
bị JavaFX ra đời nhằm mục đích phát triển ứng đụng như một khung giao diện đỗ họa người dùng JavaFX có dung lượng nhẹ, tốc độ phần cứng được gia tăng
JavaFX cung cấp bộ API đa dạng để phát triển giao diện đồ họa người như:
- javafx.base: Gồm các lớp cơ bản đề xây dựng ứng dụng
- javafx.controls: Chứa các thành phần điều khiến giao điện người dùng như nút,
- javafx.fxml: chứa các lớp làm việc với ngôn ngữ đánh dấu FXML năng cấp GUI
Trang 11- javafx.graphics: Chứa các lớp và gói về đồ họa
- Javafx.media: Chứa các lớp làm việc với âm thành và video
- javafx.swing: Tich hop JavaFX va thu vién Swing
- javafx.web: Tich hợp trình duyệt web vào ứng dụng JavaFX
4 Tổng quan về trí tuệ nhân tạo AI
4.1 Giải thuật minimax
Thuật toán minimax là một thuật toán đánh giá giá trị của các Node trong Game Tree nhằm tìm ra nước đi tối ưu nhất Thuật toán nảy được sử dụng rộng rãi trong trò chơi có hai người như TIc- Tac-Toe, cờ tướng, cờ vua
Thuật toán minimax duyệt qua cây trò chơi và đánh giá giá trị của các nút Mỗi nút lá đại diện cho việc kết thúc trò chơi, gia tri cua nut được tính bang viéc xem al thang hoặc thua Thuật toán minimax thường vận dụng vảo trò chơi có hai người chơi, hữu hạn số lượng nước đi và không có yếu tố ngẫu nhiên như cờ tướng Thuật toán
minimax thường dùng để giải quyết các trò chơi nhằm tìm ra con đường tôi ưu nhất
Thuật toán minimax có nhược điểm là thời gian tính toán và do số lượng nước đi nhiều như cờ tướng số lượng nút có thê tăng lớn dẫn đến không gian lưu trữ phát triển nhanh chóng Thuật toán minimax có thể sử dụng các kỹ thuật để giảm bớt số lượng nút trong cây trò chơi nhằm giảm số lượng nút và tối ưu thời gian tính toán như kỹ thuật cắt tỉa Alpha-Beta
Hình 5 Mô tả v`êthuật toán minimax qua trò Tic Tac Toe
Trang 124.2 Cat tia Alpha-Beta
Thuật toán Alpha-Beta là một thuật toán tìm kiếm nang cao cua minimax, lam giảm số lượng các node của cây trong cây trò chơi bằng cách giảm số lượng các nút thuật toán sẽ nhanh chóng đưa ra kết quả Trong đó Alpha là lựa chọn tốt nhất của bat
kỳ điểm nào trên Max, Beta là lựa chọn tốt nhất của bất kì điểm nào trên Min
Trang 13CHUONG 2 GiAO DIEN UNG DUNG
1 Trang chinh cua chuong trinh
- Câu lệnh gọi thư viện JavaFX để sử dụng trong mã nguồn:
import Piece.*; //Tai hinh falnh cho giao diện trò
import javafx.scene.layout.Pane; /Lớp chứa đối
tượng và giao diện
import javafx.scene.image.Image; Lop làm việc
import javax.swing.JFrame; //Lớp JFrame
import controllers.main.*; //Lớp đi`§ khi đaị
Khi người dùng thực hiện việc truy cập vào trò choi, giao dién được hiển thị ở
hình Trang được hiển thị với hình nền trực quan dễ nhìn đồng thời hiến thị 4 nút với
các chức năng khác nhau Môi nút có chức năng như sau:
- Start: Tạo màn chơi mới hai người
Trang 14- Load: Thực hiện việc quay lại màn chơi cũ với màn chơi hai người
- Quit: Thực hiện chức năng thoát khỏi chương trình
- PVE: Thực hiện chức năng tạo màn chơi mới với máy
Mã nguồn tạo giao diện nút trong trang chính của trò chơi như sau:
// Phương thức tạo nút với hình ảnh đặt trưng
public Button createButton(String image_location) {
return new Button("", createImageView(image_location, false));
//Phương thức thiết lập giao diện người dùng cho màn hình chính
public void setupStartMenu(Stage primaryStage) {
ImageView background = createImageView("/Images/main_menu.png", true);
pve_button.setOnMouseClicked(e -> { }):
Button pvp_button = createButton("/Images/pvp.png");
pvp_button.setOnMouseClicked(e -> { });
Trang 15createButton("/Images/load.png");
load_button.setOnMouseClicked(e -> { });
Button quit_button = createButton("/Images/quit.pne");
quit_button.setOnMouseClicked(e -> { System.exit(0); });
Pane pane = new Pane();
pane getChildren().addAll(background,
start_button, load_button, quit_button,
pve_button,pvp_button);
start_button.relocate(300 * RATIO, 720 * RATIO);
pve_button.relocate(800 * RATIO, 890 * RATIO);
pvp_button.relocate(1200 * RATIO, 890 * RATIO);
load_button.relocate(800 * RATIO, 720 * RATIO);
quit_button.relocate(1300 * RATIO, 720 * RATIO);
start_screen = new Scene(pane);
start_screen.getStylesheets().add("/css/start_menu.css");
primaryStage.setScene(start_screen);}}
Trang 16+9 |
Hình 6 Trang chủ của trò chơi
2 Trang chơi với máy tính
Sau khi người nhấp vào button “PVE” giao diện chơi với máy được khởi động, trang chơi với máy được hiến thị ở góc trên bên trái của màn hình Ở đây người chơi được hiển thị với quân đỏ là quân của bản thân Máy tính được mặc định là quân đen
ở phía đối diện Người chơi có thể thực hiện việc quay lại nước đi của bản thân bằng nút “BackSpace” Khi người chơi thực hiện xong nước ổi của bản thân, máy tính sẽ thực hiện tính toán các trường hợp bằng cách tính các nước đi có thể kết thúc ván cờ
mà máy thăng nhanh nhất
Khi trò chơi kết thúc, giao diện hiển thị thông báo “Bạn thắng” hoặc “Máy thắng” Sau đây là mã nguồn ví dụ về việc xây đựng cơ chế của trang chơi với máy tính:
public static void main(String[] args){
//Tao déi tượng chứa trò chơi
final JFrame mainFrame = new JFrame("Chinese
Chess");
Trang 17//Tạo đối tượng quản ly trang thai game va giao dién ban co final MainUI gameboard = new MainUIQ;
// Phương thức khi người dùng nhấp chuột trái
public void mousePressed(MouseEvent e) {
// Kiém tra xem hiện có phải lượt của người dùng không
if(gameboard.gameS tate getCurrSide()!
Trang 18Point p = gameboard.posOnGrid(e.getPoint());
// Néu ngwoi ding dang chon quan co thi kiém tra xem nuéc di co hop
lệ không
if(gameboard.waitForSelection){
// Doi ngwoi dung chon quân cờ
if(gameboard.gameState.is ValidSelection((int) p.getYQ,
(int) gameboard.selectedPos.getX(), (int)
p.getY(), (int) p.getX())){
/⁄/ Thực hiện nước đi
Trang 19gameboard.gameState.makeMove((int)
gameboard.selectedPos.getY (),
(int) gameboard.selectedPos.getX(),
(int) p.getY(), (int)p.getX());
/Lưu lại thông tin quân cờ di chuyên của người dùng System.out.printIn("player move =
// Néu may thang thi in thong bao
elseif(over==gameboard.gameState MIN_PLAYER) message
Trang 20int input = JOptionPane.show OptionDialog(mainFrame,
message ,"Message" JOptionPane.OK_OPTION JOptionPane.INFOR
MATION_MESSAGE., null null null);
gameboard.gameState.isGameOver();
// Kiém tra xem ván cờ đã kết thúc chưa if(over!=-1){
Trang 21gameboard.repaint();}
@Override // Tao ban sao của trạng thái các quân cờ và thực hiện thuật toán tính toán nước
gameState.setS tate(gameboard.gameS tate getGameState());
gameState.setCurrSide(gameboard gameS tate getCurrSide());
GameTree agent = new GameTree(gameState, gameboard.SEARCH_TIME);
‘ido work
long start = System.currentTimeMillis(); /⁄
Bắt đầu tính toán nước đi của AI
Move nextBestMove = agent.nextMove(); // Goi
thuật toán tính toán
long end = System.currentTimeMillis();//Két thúc tính toán nước di
Trang 22System.out.println("ai move =
"+(end-start)/1000.0+" s"); // Xuất thông tin nước đi
public void keyPressed(KeyEvent e) {
// nêu người dùng nhắn nut “Backspace
if(e.getKeyCodeQ==KeyEvent VK_BACK_SPACE){
System.out.println("revert move");
Trang 23gameboard.gameState.revertOneMove();// Quay về nước đi
trước đó của người dùng
if(gameboard.gameS tate getCurrSide()!
mainFrame.add(gameboard); // Thêm bàn cờ vào cửa sô
mainFrame.setVisible(true); // Hiền thị cửa số trò chơi
}
Trang 24Hinh 7 Giao dién choi voi may
3 Trang 2 người chơi
Câu lệnh gọi thư viện JavaFX để sử dụng trong chương trình:
import Piece.*;
import javafx.scene.image.Image;
Trang 25import java.util ArrayList;
Sau khi người chơi thực hiện nhấp vao button “Start”, giao dign trò chơi sẽ chuyên sang giao dién co tuéng với hai n8ười
Tại đây ta tạo phuong thire Board dé hién thị được giao diện trò chơi, trong day
ta sẽ khởi tạo hình ảnh bàn cờ hiển thị đè lên trên các ô cờ trong bản cờ (được nói đến tại chương 3 mục l1) nhằm tạo giao dién tre quan
public ImageView createImageView(String
image_location, boolean background) {
// Goi hinh ảnh từ đường dẫn
Image image = new Image(image_location);
/ Tạo đối tượng chứa hình ảnh ImageView image_view = new ImageView(image);
Trang 26// Néu là hình nền thì thiết lập chiều rộng của hình ảnh
if (background) { image_view.setFitWidth(1920 * RATIO);
// Néu khéng phai la hình nền thì thiết lập tý lệ hình ảnh gốc nhân với tỷ
lệ RATIO
} else { Image_ view.setFIWIidthqmage.getWidthQ * RATIO);
t // Thiét lap thuộc tính tý lệ khung hình
Trong đoạn mã mô tả trên ta sử dụng đặc điểm của JavaFX để hiển thị hình ảnh một
cách chính xác và hiệu quả hơn vì trong giao diện phải sử dụng nhiều hình ảnh hiển
thị khác ngoài ảnh bản cờ như hình ảnh quân cờ Tận dụng “setPreserveRatio”,
“setSmooth” và “setCache” ta đảm bảo được hình ảnh bàn cờ không bị thay đôi đồng
thoi giup xu ly hình ảnh hiệu quả và mượt mà hơn, không bị thay đổi khi cài đặt các
hình ảnh khác
Trang 27
Hinh 8 Giao dién ban co 2 người chơi Trong đó người chơi sẽ tự quy định ai sẽ là quân đỏ đồng nghĩa với việc di trước Trong trò chơi cũng sẽ hiển thị thông báo đề giúp người chơi nắm bắt được hiện tại đang đến lượt quân mảu nào Trong đoạn mã sau đây sẽ xây dựng cách thức chuyên đổi giữa hai lượt chơi: