You are on page 1of 7

Đây là một đoạn mã Python cho trò chơi Caro (Gomoku) sử dụng thư viện Turtle

để tạo giao diện đồ họa. Dưới đây là một giải thích chi tiết về từng phần của mã:

1. Import các thư viện:


- `import turtle`: Thư viện đồ họa để tạo giao diện trò chơi.
- `import random`: Thư viện để tạo số ngẫu nhiên.
- `import time`: Thư viện để đồng bộ hóa thời gian.

2. Khai báo biến toàn cục:


- `move_history`: Lưu trữ lịch sử các nước đi đã được thực hiện.

3. Hàm `make_empty_board(sz)`: Tạo một bàn cờ trống với kích thước `sz`x`sz`.

4. Hàm `is_empty(board)`: Kiểm tra xem bàn cờ có trống hay không.

5. Hàm `is_in(board, y, x)`: Kiểm tra xem tọa độ (y, x) có nằm trong phạm vi của
bàn cờ hay không.

6. Hàm `is_win(board)`: Kiểm tra xem trò chơi đã kết thúc chưa và trả về kết quả
của trò chơi ("Black won", "White won", "Draw", "Continue playing").

7. Hàm `march(board, y, x, dy, dx, length)`: Tìm vị trí xa nhất trong hướng (dy, dx)
trong khoảng length từ vị trí (y, x).

8. Hàm `score_ready(scorecol)`: Khởi tạo hệ thống điểm từ điểm số của mỗi cột.

9. Hàm `sum_sumcol_values(sumcol)`: Tính tổng điểm của mỗi hướng.


10. Hàm `score_of_list(lis, col)`: Tính điểm của một dãy con trong dãy `lis` với
màu `col`.

11. Hàm `row_to_list(board, y, x, dy, dx, yf, xf)`: Trả về một dãy con của bàn cờ
từ vị trí (y, x) đến (yf, xf) theo hướng (dy, dx).

12. Hàm `score_of_row(board, cordi, dy, dx, cordf, col)`: Tính điểm của mỗi dãy
con trong hàng theo hướng (dy, dx) từ vị trí `cordi` đến `cordf` với màu `col`.

13. Hàm `score_of_col(board, col)`: Tính điểm của mỗi hướng trong cột dùng cho
hàm `is_win`.

14. Hàm `score_of_col_one(board, col, y, x)`: Trả lại điểm số của cột tại vị trí (y,
x) theo 4 hướng.

15. Hàm `possible_moves(board)`: Tạo danh sách các tọa độ có thể đi dựa trên các
nước đã đánh trong phạm vi 3 đơn vị.

16. Hàm `TF34score(score3, score4)`: Kiểm tra xem có trường hợp chắc chắn có
thể thắng (4 ô liên tiếp) hay không.

17. Hàm `stupid_score(board, col, anticol, y, x)`: Tính điểm tượng trưng cho lợi
thế của một nước đi.

18. Hàm `winning_situation(sumcol)`: Trả lại tình huống chiến thắng dựa trên
điểm số của các hướng.
19. Hàm `best_move(board, col)`: Trả lại nước đi tốt nhất cho một màu.

20. Hàm `click(x, y)`: Xử lý sự kiện click chuột để thực hiện nước đi.

21. Hàm `initialize(size)`: Khởi tạo trò chơi với kích thước bàn cờ là `size`.

22. Hàm `getindexposition(x, y)`: Lấy chỉ số của tọa độ (x, y).

26. Hàm `draw_stone(x, y, colturtle)`: Vẽ quân cờ tại tọa độ (x, y) với màu
`colturtle`.

27. Hàm `main()`: Khởi tạo trò chơi với kích thước bàn cờ là 20.

Đây là một trò chơi Caro đơn giản với giao diện đồ họa sử dụng thư viện Turtle.
Người chơi và máy tính sẽ thay phiên nhau đánh quân cờ trên bàn cờ. Mục tiêu của
trò chơi là tạo thành một hàng ngang, hàng dọc hoặc hàng chéo gồm 5 quân cờ
cùng màu trước đối thủ.

Hàm score_of_colđược sử dụng để tính điểm của mỗi hướng trong cột của bảng
chơi. Dưới đây là giải thích chi tiết của hàm này:
def score_of_col(board,col):
'''
tính toán điểm số mỗi hướng của column dùng cho is_win;
'''

f = len(board)
#scores của 4 hướng đi
scores = {(0,1):[],(-1,1):[],(1,0):[],(1,1):[]}
for start in range(len(board)):
scores[(0,1)].extend(score_of_row(board,(start, 0), 0, 1,
(start,f-1), col))
scores[(1,0)].extend(score_of_row(board,(0, start), 1, 0,
(f-1,start), col))
scores[(1,1)].extend(score_of_row(board,(start, 0), 1,1,
(f-1,f-1-start), col))
scores[(-1,1)].extend(score_of_row(board,(start,0), -1,
1,(0,start), col))

if start + 1 < len(board):


scores[(1,1)].extend(score_of_row(board,(0, start+1),
1, 1,(f-2-start,f-1), col))
scores[(-1,1)].extend(score_of_row(board,(f -1 ,
start + 1), -1,1,(start+1,f-1), col))

return score_ready(scores)
Hàm này nhận đầu vào là board(bảng chơi) và col(màu sắc của quân cờ). Nó trả về
một từ điển scoreschứa điểm của mỗi hướng trong cột.
Đầu tiên, hàm này khởi tạo một biến fđể lưu trữ kích thước của bảng chơi. Sau đó, nó
khởi tạo một từ điển scoresvới 4 hướng đi khác nhau: (0,1) (ngang), (-1,1) (chéo trái),
(1,0) (dọc), và (1,1 ) (chéo phải).
Tiếp theo, vòng lặp forđược sử dụng để duyệt qua từng hàng trong cột. Đối với mỗi
hàng, hàm gọi hàm score_of_rowđể tính điểm của từng hướng đi trong hàng đó. Kết
quả được thêm vào từ điển scorestương ứng với hướng đi của hàng.
Ngoài ra, trong vòng lặp for, hàm cũng kiểm tra nếu start + 1kích thước nhỏ hơn
của bảng chơi thì không gọi hàm score_of_rowđể tính điểm của các hướng đi phụ và
chéo chính từ các hàng khác. Kết quả được thêm vào từ điển scorestương ứng với
hướng đi của hàng.

Cuối cùng, gọi hàm score_ready để khởi động hệ thống từ điển scoresvà trả về kết
quả.
Lưu ý: Hàm score_of_rowvà score_readyđược sử dụng bên trong hàm
score_of_colđể tính điểm của từng hàng và khởi tạo điểm hệ thống.

Import các thư viện và module cần thiết

 import os: Được sử dụng để thao tác với các hệ thống tệp tin và thư mục.
 import warnings: Được sử dụng để bỏ qua các cảnh báo không cần thiết.
 import uuid: Được sử dụng để tạo ra các chuỗi ngẫu nhiên.
 from utils import resource_path: Được sử dụng để lấy đường dẫn tuyệt
đối của tệp tin tài nguyên.
 from PyQt5 import QtCore, QtWidgets: Được sử dụng để tạo giao diện
người dùng sử dụng PyQt5.
 from PyQt5.QtWidgets import QMessageBox, QFileDialog: Được sử
dụng để hiển thị hộp thoại thông báo và hộp thoại chọn thư mục.
 from PyQt5.QtCore import QThread, pyqtSignal: Được sử dụng để
tạo luồng riêng biệt và tín hiệu để giao tiếp giữa các luồng.
 from PyQt5.QtGui import QIcon: Được sử dụng để đặt biểu tượng cho
cửa sổ ứng dụng.
 from pytube import YouTube: Được sử dụng để tải xuống video từ
YouTube.

Gomoku

Chươnng trình game caro sử dụng Turtle trong python và engine AI dựa trên thuật toán
minimax, cắt tỉa alpha-beta cùng với heuristic điểm số 4 hướng.

Thuật toán

 Phân tích: +Trò chơi có thể biếu diễn như một cây gốc, những nút, những lá và
nhánh:

. Gốc là trạng thái ban đầu của trò chơi. Với mỗi trò chơi cụ thể thì trạng thái( ở
mỗi điểm) lại đưuọc đặc trung bởi những thông số riêng

. Các nút(Node) của cây thể hiện tình trạng hiện tại của trò chơi, gồm nút cha và
nút con.

. Các nhánh nối giữa các nút thể hiện nước đi, tức là cho biết từ một tình huống
của trò chơi chuyển sang tình huống khác thông qua chỉ một nước đi nào đó.

. Các lá hay còn gọi là nút lá, thể hiện thời điểm kết thúc khi mà kết quả của trờ
chơi đã rõ.

. Độ sâu của cây: Số tầng của cây

o Mỗi vị trí kết thúc trò chơi(nút lá) sẽ gán một trọng số. vd: 1 win, 0 hòa, -1
lose. Tại mỗi nút cũng có một trọng số tương ứng được xác định bằng
một cách nào đó. Dựa vào cây trò chơi này, ta có thể tìm nước đi tốt để
giành chiến thắng.

o Cứ sau mỗi nước đi số ô trống sẽ giảm. Vì vậy việc tìm kiếm nước đi tiếp
theo là việc tìm kiếm trong không gian các ô trống còn lại, sau mỗi lượt đi
thì không gian tìm kiếm sẽ giảm dần. Chiến lược tìm kiếm nước đi là chọn
1 nút trên cây sao cho nước đi là tốt. Và để đánh giá được nút đó thì phải
nhìn đến độ sâu của cây. Vì không gian tìm kiếm là quá lớn nên chúng ta
giới hạn cho máy tính chỉ tìm kiếm ở một độ sâu nhất định ==> Chương
trình có độ sâu càng lớn thì càng chơi giỏi nhưng sẽ phải trả giá về mặt
thời gian

1.Thuật toán Minimax

 Minimax là một thuật toán đệ quy lựa chọn bước đi kế tiếp trong một trò chơi 2
người bằng cách tính các giá trị cho các Node trên cây trò chơi sau đó tìm Node
có giá trị phù hợp để đi bước tiếp theo.

 Hai đối thủ trong trò chơi được gọi là MIN và MAX luân phiên thay thế nhau đi.
MAX đại diện cho người quyết dành thắng lợi và cố gắng tối đa hóa ưu thế của
mình, ngược lại người chơi đại diện cho MIN lại cố gắng giảm điểm số của MAX
và cố gắng làm cho điểm số của mình càng âm càng tốt. Giả thiết đưa ra MIN và
MAX có kiến thức như nhau về không gian trạng thái trò chơi và cả hai đối thủ
đều cố gắng như nhau. Mỗi Node biểu diễn cho một trạng thái trên cây trò chơi.
Node lá là Node chứa trạng thái kết thúc của trò chơi.

Giải thuật Minimax thể hiện bằng cách định trị các Node trên cây trò chơi:

 Node thuộc lớp MAX thì gán cho nó giá trị lớn nhất của con Node đó.
 Node thuộc lớp MIN thì gán cho nó giá trị nhỏ nhất của con Node đó. Từ các giá
trị này người chơi sẽ lựa chọn cho mình nước đi tiếp theo hợp lý nhất.

 Nếu như đạt đến giới hạn tìm kiếm (đến tầng dưới cùng của cây tìm kiếm tức là
trạng thái kết thúc của trò chơi).
 Tính giá trị của thế cờ hiện tại ứng với người chơi ở đó. Ghi nhớ kết quả.
 Nếu như mức đang xét là của người chơi cực tiểu (nút MIN), áp dụng thủ tục
Minimax này cho các con của nó. Ghi nhớ kết quả nhỏ nhất.
 Nếu như mức đang xét là của người chơi cực đại (nút MAX), áp dụng thủ tục
Minimax này cho các con của nó. Ghi nhớ kết quả lớn nhất.

2. Thuật toán cắt tỉa alpha-beta.


 Vì sự bùng nổ cây trò chơi trong minimax nên ta sẽ bỏ những nút không tối ưu
bằng cách cắt tỉa alpha-beta.

 Tư tưởng: + Nếu một nhánh tìm kiếm nào đó không thể cải thiện với giá trị mà
chúng ta đã có, thì không cần xét đến hàm đó nữa -> tiết kiệm chi phí thời gian,
bộ nhớ cho cây tìm kiếm + Dùng hai cận Anpha và Beta để so sánh và loại bỏ các
trường hợp sẽ không cần xét đến trong thuật toán minimax.

 Mô tả: + Anpha lưu nướcc đi tốt nhất của máy, Beta lưu giá trị tốt nhất của Người
chơi

o Nếu bất cứ khi nào anpha >= beta, thì người chơi chắc chắn sẽ chọn nước
đi tốt nhất cho họ và cưỡng bức nước đi tồi hơn anpha cho máy, vì vậy mà
không cần xét thêm bước nào nữa.

You might also like