Tải bản đầy đủ (.docx) (28 trang)

Báo cáo cuối kỳ project i nguyễn mạnh dũng cao văn thiện

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.83 MB, 28 trang )

ĐẠI HỌC BÁCH KHOA HÀ NỘI
Trường Công nghệ thông tin và Truyền thông

BÁO CÁO PROJECT I
Đề tài: Xây dựng game Caro

Sinh viên thực hiện:

1. Nguyễn Mạnh Dũng - 2020473- Lớp kỹ thuật
máy tính 02 - k65
2. Cao Văn Thiện - 20204853 - Lớp kỹ thuật máy
tính 02 - k65

Giảng viên hướng dẫn: GV. Đinh Thị Hà Ly

Hà Nội, tháng 3 năm 2023


Mục lục
LỜI MỞ ĐẦU..................................................................................................................................................2
PHÂN CÔNG CÔNG VIỆC...........................................................................................................................3
CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI..............................................................................................................4
1.1. Tổng quan

4

1.2. Lý do lựa chọn đề tài

4

1.3. Mục tiêu của đồ án



5

1.4. Giải pháp lựa chọn

5

CHƯƠNG II: GIẢI PHÁP XÂY DỰNG.......................................................................................................6
2.1 Tông quan về các công nghệ và các thuật toán đã sử dụng

6

2.1.1 Các thuật toán trí tuệ nhân tạo đã sử dụng..........................................................................6
2.2.2 Lập trình mạng với socket...................................................................................................9
9

2.2 Thiết kế chi tiết

2.2.1 Thiết kế chi tiết hàm lượng giá............................................................................................9
2.2.2 Thiết kế chi tiết thuật toán xét thắng thua.........................................................................11
2.2.3 Các lần chơi thử với hệ thống............................................................................................12
CHƯƠNG III: KẾT QUẢ THỰC HIỆN.....................................................................................................15
3.1 Kết quả chương trình

15

3.2 Giao diện chương trình

16


CHƯƠNG IV: KẾT LUẬN..........................................................................................................................24
4.1. Ưu điểm và nhược điểm của chương trình

24

4.2. Giải pháp

24

4.3. Hướng phát triển trong tương lai

24

Danh sách tham khảo....................................................................................................................................26

LỜI MỞ ĐẦU


Hiện nay, công nghệ thông tin đã được sử dụng rộng rãi trong mọi lĩnh vực đời
sống xã hội, lập trình game từ lâu đã là một lĩnh vực thu hút nhiều lập trình viên. Hiện
nay, việc ứng dụng trí tuệ nhân tạo vào việc phát triển game đã trở nên vô cùng phổ
biến, đặc biệt là những game mang tính trí tuệ cao. Ngồi ra việc tạo game online
cũng là một lĩnh vực vô cùng phổ biến hiện nay.
Do đó, nhờ các kiến thức đã học trong các học phần trước đó và những kiến
thức tự tìm hiểu trong thời gian chúng em đã chọn đề tài xây dựng nên chương trình
game cờ Caro trên ngơn ngữ Java. Đây là một ngôn ngữ phù hợp trong phát triển phần
mềm, trang web, game hay ứng dụng trên các thiết bị di động.
Do thời gian có hạn, nên chương trình của chúng em vẫn cịn nhiều hạn chế và
có thể có nhiều sai sót. Do đó chúng em rất mong nhân được góp ý từ các thầy cơ. Em
xin trân thành cảm ơn.


PHÂN CÔNG CÔNG VIỆC

1. Nguyễn Mạnh Dũng

- Xây dựng chương trình phần đánh cờ


với máy theo các thuật tốn trí tuệ nhân
tạo.
- Thiết kế lại giao diện tổng quan cho
tồn thể chương trình

2. Cao Văn Thiện

- Xây dựng chương trình phần đánh cờ
online
- Thiết kế các lớp đối tượng và xây dựng
một số giao diện cho chương trình.

CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI
1.1. Tổng quan
Trò chơi cờ Caro là một trò chơi khá quen thuộc và là một trị chơi trí tuệ địi
hỏi người chơi phải có tư duy cao và khả năng phán đốn tính huống tốt. Đây là một
trị chơi đối kháng với hai người chơi. Trong không gian bàn cờ có kích thước là
15x15, hai người chơi sẽ lần lượt thay phiên nhau đi nước đi cảu mình vào các ô trống


trên bàn cờ bằng các ký tự X và O. Cuộc chơi sẽ kết thúc khi mà bên nào đánh được 5
ô liên tiếp nhau theo hàng, cột hoặc đường chéo.

Trong hệ thống game đánh cờ Caro sẽ bao gồm hai phần là offline đánh cờ với
máy và hệ thống đánh cờ online đánh cờ trong mạng với các máy tính khác.

1.2. Lý do lựa chọn đề tài
Từ lâu con người đã có suy nghĩ muốn tạo ra một cỗ máy có thể tự suy nghĩ và
hành động. Chính vì thế, trí tuệ nhân tạo (AI) trở thành một một lĩnh vực mới trong
thời đại công nghệ thông tin ngày nay. Việc ứng dụng trí tuê nhân tạo vào xây dựng
các chương trình game là một việc mà rất nhiều người đang hướng đến. Do đó chúng
em đã suy nghĩa và lựa chọn đề tài xây dựng game đánh cờ Caro giữa người và máy
dựa trên các thuật toán cơ bản hay dùng trong trí tuệ nhân tạo.
Hiện nay, Internet toàn cầu đã phát triển rất mạnh, về bản chất internet là một
hệ thống mạng, liên kết các máy tính trên thế giới. Về phạm vi nhỏ hơn cũng có các
mạng tương tự khác như mạng WAN, LAN,... mỗi mô hình cũng được đáp ứng với
các tiện ích khác nhau. Do đó chúng em cũng đã ứng dụng các kiến thức về lập trình
mạng để xây dựng hệ thống game đánh cờ Caro theo mơ hình Client-Server.

1.3. Mục tiêu của đồ án
Xây dựng thành công hệ thống game đánh cờ Caro với hai phần:
- Hệ thống đánh cờ offline
+ Đánh cờ với máy nhờ các thuật tốn của trí tuệ nhân tạo
+ Đánh cờ hai người chơi trên cùng một máy
- Hệ thống đánh cờ online với mơ hình Client-Server


1.4. Giải pháp lựa chọn
Nhóm chúng em lựa chọn xây dựng game cờ Caro trên nền tảng app trên
desktop với ngôn ngữ Java và sử dụng thư viện Java Swing để tạo giao diện cho hệ
thống.
Để tạo tạo chương trình đánh cờ Caro giữa người và máy, chúng em đã ứng
dụng các thuật tốn của của trí tuệ nhân tạo. Trong đó có thuật tốn Mini-Max để tìm

nước đi tốt nhất cho máy và thuật toán cắt tỉa Alpha-Beta để giảm số lượng tìm kiếm
kiếm nước đi cho máy mà không ảnh hưởng đến sự đánh giá của bàn cờ đang xét.
Ngoài ra cần các hàm ước lượng để đánh giá trạng thái bàn cờ.
Để tạo nên hệ thống đánh cờ online giữa nhiều máy tính, chúng em cũng đã
ứng dụng các kiến thức về lập trình mạng với việc ứng dụng lập trình Socker trên họ
giao thức TCP/IP và giao thức UDP. Xây dựng mơ hình Client-Server kết hợp với kỹ
thuật lập trình đa luồng trên ngơn ngữ Java.

CHƯƠNG II: GIẢI PHÁP XÂY DỰNG
2.1 Tông quan về các công nghệ và các thuật toán đã sử dụng
2.1.1 Các thuật tốn trí tuệ nhân tạo đã sử dụng
2.1.1.1 Thuật tốn MiniMax
Cây trò chơi:
- Gốc của câu ứng với trạng thái u. Với trạng thái u, chúng ta có thể tìm ra các nước
đi hợp lệ để tạo ra các trạng thái con của nó. Từ một trạng thái con ta lại tìm tiếp các
trạng thái con tiếp của nó.


- Hai người chơi tìm nước đi tốt nhất lần lượt là giá trị Min và Max trong các nước
đi của cây trò chơi. Nước đi của MAX phụ thuộc vào nước đi của MIN và ngược lai.
- Độ cao của cây là tổng số nước đi của cả hai người. Các nút lá của cây tương ứng
với các trạng thái kết thúc.
Nhận định:
- Giả sử tại một thời điểm đường đi đã dẫn tới trạng thái u. Nước đi tối ưu cho
trạng thái u là nước đi dẫn tới đỉnh con v so với tất cả các đỉnh con khác của u.
- Để chọn nước đi tốt nhất cho trạng thái u, ta cần xác định giá trị tại tất cả các đỉnh
của cây trị chơi có gốc là u.
- Để xác định giá trị có đỉnh là gốc u, ta sẽ đi từ mức thấp nhất:
+ Tại nước đi của Max, ta sẽ lấy giá trị max trong các giá trị nút con của nó.
+ Tại nước đi của Min, ta sẽ lấy giá trị min trong các giá trị nút con của nó.

Hạn chế:
- Thuật tốn bắt buộc phải xét tồn bộ khơng gian trạng thái, số lượng trạng thái trị
chơi mà nó phải kiểm tra là cấp số nhân theo chiều sâu của cây, việc này sẽ khơng khả
thi với các bài tốn có khơng gian trạng thái lớn.
Max (tìm đường cho X)

Min (tìm đường cho O)

Max (tìm đường cho X)

Mã giả:
function minimax(node, depth, maximizingPlayer) is
if (depth ==0 || node is a terminal node) value(node);


if (MaximizingPlayer) { // for Maximizer Player
maxValue= - 10e6;
for (each child of node) {
maxValue= max(maxValue, minimax(child, depth-1, false));
}
return maxValue;
}
else {
// for Minimizer player
maxValue = 10e6;
for (each child of node) {
minValue = min(minValue, minimax(child, depth-1, true));
}
return minValue;
}


2.1.1.2 Thuật toán cắt tỉa Alpha-Beta
Nhận định:
- Alpha-Beta Pruning là một phiên bản sửa đổi tối ưu hóa cho thuật tốn
minimax. Thuật tốn này làm giảm số lượng các node cây được đánh giá bởi thuật
tốn minimax trong cây tìm kiếm, mà k làm ảnh hưởng đến sự đánh giá của đỉnh đang
xét.
- Hai tham số Alpha và Beta được định nghĩa là
+ Alpha: lựa chọn tốt nhất (giá trị cao nhất) đã tìm thấy cho đến nay tại bất kỳ
điểm nào trên con đường của Maximizer. Giá trị ban đầu của alpha là -∞.

+Beta: lựa chọn tốt nhất (giá trị thấp nhất) đã tìm thấy cho đến nay tại bất kỳ
điểm nào dọc theo đường dẫn của Minimizer. Giá trị ban đầu của beta là + ∞.
- Điều kiện chính cần thiết của thuật toán Alpha-Beta là α > = β
- Max player sẽ chỉ cập nhật giá trị của Alpha. Min player sẽ chỉ cập nhật giá trị
của phiên bản Beta.
- Ta sẽ chỉ chuyển các giá trị alpha, beta cho các nút con.
- Trong khi backtracking lại cây, các giá trị của nút sẽ được chuyển đến các nút
phía trên thay vì các giá trị của alpha và beta.
Mã giải


function alphabeta(node, depth, alpha, beta, maximizingPlayer) is
if (depth ==0 || node is a terminal node) value(node);
if (MaximizingPlayer) { // for Maximizer Player
maxValue= - 10e6;
for (each child of node) {
maxValue= max(maxValue, alphabeta (child, depth-1, alpha, beta, false));
alpha= max(alpha, maxValue)
if (alpha >= beta) break;

}
return maxValue;
}
else {
// for Minimizer player
maxValue = 10e6;
for (each child of node) {
minValue = min(minValue, alphabeta (child, depth-1, alpha, beta, true));
beta = min(beta, minValue)
if (alpha >= beta) break;
}
return minValue;
}

2.2.2 Lập trình mạng với socket
Sử dụng lập trình TCP Socket và đa luồng để kết nối Client và Server
Miêu tả ứng:
- Khi Server được bật, nó sẽ chờ các client kết nối tới và chấp nhận.
- Khi client được bật và kết nối tới, Server sẽ tạo 1 luồng mới để chờ nhận tin
nhắn từ luồng client đó.
- Client đọc dịng văn bản nhập từ bàn phím người dùng , gửi tới server qua
Socket
- Server đọc các dòng văn bản gửi từ Socket và xử lí
- Server sẽ chuyển lại dịng văn bản tương ứng tới phía client qua Socket
- Client đọc dịng văn bản từ socket và xử lí dòng văn bản nhận được từ Server
- Sử dụng Java Swing để thiết kế giao diện


2.2 Thiết kế chi tiết
2.2.1 Thiết kế chi tiết hàm lượng giá

- Kỹ thuật lượng giá là một kỹ thuật quan trọng trong việc xây dựng trò chơi cờ
Caro (Gomoku). Kỹ thuật này giúp xây dựng điểm cho trạng thái của bàn cờ để từ đó
xây dựng cây trị chơi. Việc xây dựng hàm lượng giá hợp lý , chính xác sẽ giúp cho hệ
thống có đánh giá chính xác về trạng thái bàn cờ để đưa ra nước đi thơng minh hơn.
- Đối với bài tốn cờ caro, ta có thể đánh giá tính "tốt, xấu" tại một thời điểm
của bàn cờ. Ta sẽ tính điểm cao thấp dựa vào số quân liên tiếp ở bàn cờ, bàn cờ có
bàn nhiều quân liên tiếp (1 loại quân, quân ta hoặc quân địch) thì điểm của trạng thái
bàn cờ đấy càng cao. Tuy nhiên đây chỉ là hàm Heuristic nên ta cần bổ sung thêm các
Heuristic khác nữa.
Hàm tính điểm trạng thái bàn cờ:
- Đầu tiên ta cần tính điểm cho cả 2 loại quân là: Máy và Người. Ta sẽ xem với
trạng thái hiện tại thì lượt đánh tiếp theo là của quân nào và xem các quân đó có bị
chặn ở hai đầu bới qn địch khơng để cho điểm cho hợp lý. Ví dụ nếu ta tính điểm
cho loại quân mà lượt sau là lượt của loại qn đó thì ta sẽ cho điểm cao hơn.
- Ta sẽ duyệt lần lượt theo 4 phương: ngang, dọc, và 2 đường chéo. Các
phương duyệt sẽ đươc đánh giá như nhau và sau đó ta sẽ cộng điểm của cả 4 phương
duyệt lại thành điểm tổng cho loại quân đó trong trạng thái đang xét.
- Ta sẽ tính điểm cụ thể cho trạng thái bàn cờ theo từng phương và từng loại
quân như bên dưới đây. Nếu dãy quân đó bị chặn 2 đầu thì sẽ được 0 điểm. Các
trường hợp khác ta sẽ tính cụ thể như sau:
Số
Bị quân địch
qn
chặn mấy đầu
liên
tiếp
1 qn
liên tiếp
2 qn Khơng bị chặn
liên tiếp


Tính điểm cho loại
Tính điểm cho loại quân
quân mà lượt sau mà lượt sau là lượt của
không phải là lượt quân đó:
của quân đó:
1 điểm
1 điểm
7 điểm

5 điểm


Bị chặn 1 đầu

3 điểm

3 điểm

3 quân Không bị chặn
liên tiếp

200 điểm (đây là nước
đi tốt)

Bị chặn 1 đầu
Không bị chặn

5 điểm
250.000 điểm (đây là

nước cơ sở để chiến
thắng, gần như sẽ
chiến thắng nếu có
nước này)

50.000 điểm (Do lượt sau là
lượt đi của loại quân này,
nên khả năng cao sẽ đi thêm
một quân bên cạnh nữa để
thành 4 quân liên tiếp k bị
chặn 2 đầu, gần như sẽ
chiến thắng nếu có nước
này
10 điểm
1.000.000 điểm (Chắc chắn
chiến thắng vì đã có 4 quân
liên tiếp mà lượt sau là của
quân này)

Bị chặn 1 đầu

200 điểm (đây là nước
đi tốt)
Được điểm cao nhất
100.000.000 điểm

4 quân
liên tiếp

5 quân

liên tiếp

Được điểm cao nhất
100.000.000 điểm.

- Sau khi ta đã tính tổng điểm bốn chiều của cả hai loại qn thì sẽ tính điểm
trạng thái bàn cờ tính bằng cách lấy tỉ số của điểm quân Máy trên điểm của quân
Người (nếu điểm quân người là 0 điểm thì ta sẽ thay thành 1 điểm). Đây sẽ là điểm để
đánh giá bàn cờ khi kết hợp với thuật toán minimax và cắt tỉa alpha-beta để chọn ra
nước đi tốt nhất cho quân máy.
2.2.2 Thiết kế chi tiết thuật toán xét thắng thua
- Thuật toán cho giúp chúng ta xử lí thắng thua của trị chơi, như chúng ta đã
biết, trò chơi cờ caro sẽ xét thắng cho người chơi có nước đi đạt 5 dấu X ( O ) liên
tiếp trên hàng ngang, dọc hoặc 2 đường chéo trái và tréo phải. Giải thích thuật tốn
như sau:
Trị chơi sẽ có dạng M.N ơ, khi người chơi X(O) đánh vào ô ở hàng thứ i, cột thứ j thì
chúng ta sẽ xét:


+Hàng ngang: đưa về ô ở hàng thứ i, ô thứ j = 0, xét từ trái qua phải bằng cách tăng
thứ tự cột j = j +1, xét theo nước vừa đánh, ví dụ: nước vừa đánh là O thì ta sẽ xét
theo O, tạo 1 biến đếm, nếu ô tiếp theo là nước của người chơi đang xét thì tăng biến
đếm lên 1 đơn vị, nếu khác nước của người chơi đang xét thì đưa biến đếm về giá trị
0, khi giá trị biến đếm bằng 5 thì kết luận người đang xét đã thắng.
+Hàng dọc: đưa về ô ở hàng thứ i = 0, cột thứ j = j, xét từ trên xuống phải bằng cách
tăng thứ tự hàng i = i +1, xét theo nước vừa đánh, ví dụ: nước vừa đánh là O thì ta sẽ
xét theo O, tạo 1 biến đếm, nếu ô tiếp theo là nước của người chơi đang xét thì tăng
biến đếm lên 1 đơn vị, nếu khác nước của người chơi đang xét thì đưa biến đếm về
giá trị 0, khi giá trị biến đếm bằng 5 thì kết luận
đang xét đã thắng.


người
X
X

+ Chéo phải:

X

X

Ví dụ như bên trên, ta có i =2, j= 3, Ta sẽ tính chéo lên góc phải và bắt đầu duyệt chéo
xuống với i = i + 1 và j = j – 1 xét theo nước vừa đánh, ví dụ: nước vừa đánh là O thì
ta sẽ xét theo O, tạo 1 biến đếm, nếu ô tiếp theo là nước của người chơi đang xét thì
tăng biến đếm lên 1 đơn vị, nếu khác nước của người chơi đang xét thì đưa biến đếm
về giá trị 0, khi giá trị biến đếm bằng 5 thì kết luận người đang xét đã thắng.
+ Chéo trái:
Ta lấy tương tự như chéo phải nhưng về hướng bên trái (X màu xanh ở hình trên) và
xét xuống với i = i +1 và j = j +1


1 xét theo nước vừa đánh, ví dụ: nước vừa đánh là O thì ta sẽ xét theo O, tạo 1 biến
đếm, nếu ô tiếp theo là nước của người chơi đang xét thì tăng biến đếm lên 1 đơn vị,
nếu khác nước của người chơi đang xét thì đưa biến đếm về giá trị 0, khi giá trị biến
đếm bằng 5 thì kết luận người đang xét đã thắng.

2.2.3 Các lần chơi thử với hệ thống
2.2.3.1 Chơi các cấp độ dễ, trung bình, khó với máy
i, Mức độ dễ



ii, trung bình

iii, khó


2.2.3.1 Chơi cờ online giữa hai người chơi


CHƯƠNG III: KẾT QUẢ THỰC HIỆN
3.1 Kết quả chương trình
- Xây dựng hệ thống đánh cờ Caro gồm hai phần là phần offline và phần
online.
- Phần offline có các phần là đánh cờ với máy hoặc hai người chơi cùng đánh
cờ trên một bàn cờ của một máy tính. Phần đánh cờ với máy, dựa vào độ sâu của thuật
toán tìm kiếm Mini-Max, ta chia được làm các cấp độ chơi khác nhau và người chơi
có thể chọn các mức độ: dễ, trung bình, khó. Phần đánh cờ hai người chơi, người chơi
có thể chọn các thể loại bàn cờ khác nhau như tic-tac-toe (bàn cờ 3x3) hoặc 6x6, 9x9.
- Phần online của hệ thống, người chơi bắt đầu vào sẽ đặt tên cho mình và đặt
avata theo các hình có sẵn. Sau khi vào được hệ thống, người chơi sẽ có 3 lựa chọn.
Một tạo phịng chơi mới để đợi người khác vào chơi cùng. Hai là người chơi có thể
vào phịng bằng cách nhập mã phịng mà một người chơi nào đó đã tạo phịng trước
đó. Nếu phịng đó khơng tồn tại người chơi sẽ được nhận thơng báo phịng khơng tồn
tại. Ba là người chơi có thể chọn chơi ngay, khi chọn chơi ngay, hệ thống sẽ tự động
tìm kiêm phịng nào trống trong các phịng đã được tạo để ghép đôi. Người chơi sẽ
đợi trong 20s nếu khơng có phịng nào trống thì người chơi sẽ trở lại màng hình chính.
- Trong khi hai người chơi online, hệ thống có trang bị chức năng chat giữa hai
người chơi. Ngồi ra người chơi cũng có thể kết thúc ván đấu sơm bằng cách chọn
đầu hàng hoặc xin hịa. Nếu chọn đầu hàng, người chơi đó sẽ thua ln và đối thủ sẽ
nhận được thơng báo rằng mình đã thắng. Nếu chọn xin hòa, người chơi sẽ đợi đối thủ

đồng ý hay không, nếu đối thủ đồng ý ván cờ sẽ hòa và kết thúc, nếu đối thủ khơng
đồng ý thì ván cờ vẫn sẽ tiếp tục.
- Hệ thống trang bị được các phím tắt cơ bản như quay lại trang phía trước,
thốt khỏi hệ thống lập tức. Trong khi đánh cờ offline, người chơi có thể quay lại
bước đi trước của mình, tính thời gian chơi, tạm dừng chơi và chơi lại ván mới.
- Link git: />

- Link youtube demo: />3.2 Giao diện chương trình
3.2.1. Giao diện chính

3.2.2. Giao diện phần offline


3.2.2.1, Giao diện phần đánh với máy

Thông báo nhập tên người chơi


Thông báo quay lại nước đi khi đánh với máy


Bàn cờ sẽ bị che lại khi ấn nút tạm dừng chơi



×