You are on page 1of 32

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN




BÁO CÁO BÀI TẬP LỚN


MÔN: PHÁT TRIỂN PHẦN MỀM THEO CẤU PHẦN

ĐỀ TÀI: XÂY DỰNG GAME CARO THEO CẤU PHẦN

GVHD : Th.s Nguyễn Thái Cường

Lớp : KTPM3_K9

Nhóm thực thiện : 13

Thành viên : Nguyễn Thị Quyên

Trần Thị Quyên

Nguyễn Thị Thu Hương


Hà Nội 13/11/2017

1
LỜI NÓI ĐẦU
Trong quá trình thực hiện và hoàn thành bài tập lớn này chúng em đã gặp rất
nhiều khó khăn, vướng mắc, nhưng với sự giúp đỡ tận tình và rất nhiều kiến thức
của môn “Phát triể n phầ n mề m theo cấ u phầ n” mà thầy giáo Nguyễn Thái Cường
đã giảng dạy, chúng em đã hoàn thành đề tài phát triển game caro theo cấu phần.
Chúng em xin chân thành cảm ơn thầy Nguyễn Thái Cường đã giúp đỡ
chúng em hoàn thành được bài tâ ̣p lớn, qua đây chúng em mong được sự góp ý của
thầy giáo và các bạn góp ý để bài tâ ̣p lớn của nhóm chúng em có thể hoàn thiện tốt
hơn.

Chúng em xin chân thành cảm ơn thầy!

2
TÓM TẮT NỘI DUNG

Nội dung chính của báo cáo gồm 3 chương:

Chương 1. Tổ ng quan về phầ n mề m hướng cấ u phầ n

 Nêu loại ứng dụng trong bài tập lớn, ngôn ngữ sử dụng, đặc điểm của kiểu
ứng dụng đó trong ngôn ngữ lập trình.
 Kiến thức tổng quát về cấu phần, cách xây dựng kiểu ứng dụng đó theo cấu
phần.
Chương 2. Giới thiệu về giải thuật và thuật toán AI trong Game

2.1. Thuật toán MinMax

 Thuật toán minimax là gì?


 Tại sao phải cần dùng minimax?
 Giải thuật Minimax
 Áp dụng vào code
 Tối ưu thuật toán minimax
2.2. Thuật toán cắt tỉa Alpha Beta

 Tìm hiểu thuật toán cắt tỉ Alpha Beta


 Xét ví dụ
 Cài đặt

2.3. Thuật toán tìm kiếm Hesuristic

 Tìm kiếm leo núi


 Tìm kiếm tốt nhất đầu tiên
 Cài đặt hàm đánh giá Heuristic
 Các tính chất của giải thuật Heuristic
Chương 3: Ứng du ̣ng

 Giao diện game

3
MỤC LỤC
CHƯƠNG I TỔNG QUAN VỀ PHÁT TRIỂN PHẦN MỀM THEO CẤU PHẦN.......................................8
I Kiến thức tổng quan về cấu phần ...........................................................................................8
1 Khái niệm lập trình hướng cấu phần...................................................................................8
2 Nguyên tắc của hướng cấu phần ........................................................................................9
3 Tại sao COP quan trọng .................................................................................................... 10
II Tổng quan về .NET Framework ............................................................................................ 10
CHƯƠNG II GIỚI THIỆU VỀ THUẬT TOÁN AI TRONG GAME CARO .............................................. 13
I Thuật toán MinMax.............................................................................................................. 13
1 Thuật toán minimax là gì? ................................................................................................ 13
2 Tại sao cần dùng thuật toán minimax? ............................................................................ 13
3 Giải thuật minimax ........................................................................................................... 13
4 Áp dụng thuật toán vào chương trình ............................................................................. 15
5 Tối ưu thuật toán minimax .............................................................................................. 16
II Thuật toán cắt tỉa Alpha Beta .............................................................................................. 16
1 Tìm hiểu về thuật toán cắt tỉa Alpha Beta ....................................................................... 16
2 Ví dụ ................................................................................................................................. 17
3 Cách cài đặt ...................................................................................................................... 18
III Thuật toán tìm kiếm Heuristic ............................................................................................. 18
1 Tìm kiếm leo núi (Hill climbing- Pearl 1984) .................................................................... 18
2 Tìm kiếm tốt nhất đầu tiên (Best – first - search) ............................................................ 19
3 Cài đặt hàm đánh giá heuristic (heuristic evaluation funciton) ....................................... 20
CHƯƠNG III ỨNG DỤNG ............................................................................................................... 24
I Sơ lược về trí tuệ nhân tạo .................................................................................................. 24
1 Trí tuệ nhân tạo trong đánh cờ ........................................................................................ 24
2 Ý tưởng về lập trình trí tuệ nhân tạo trong trò chơi cờ caro ........................................... 24
II Thiết kế các vấn đề cần xử lý ............................................................................................... 25
III Giao diện game .................................................................................................................... 26
CHƯƠNG IV KẾT LUẬN.................................................................................................................. 31
I Kết luận ................................................................................................................................ 31
II Hướng phát triển ................................................................................................................. 31
III Bảng đối chiếu thuật ngữ ..................................................................................................... 31
IV Tài liệu tham khảo ................................................................................................................ 32

4
DANH SÁCH HÌNH VẼ

Hình 1.Toàn bộ thư viện của C# ...................................................................................................... 12


Hình 2: Mô tả thuật toán MinMax ................................................................................................... 14
Hình 3. Cờ carô có 9 ô biểu diễn bằng cây ....................................................................................... 17
Hình 4. Đồ thị cho giải thuật tìm kiếm tốt nhất đầu tiên ................................................................. 19
Hình 5.Trạng thái bắt đầu và kết thúc trong trò đố 8 ô ................................................................... 21
Hình 6. Cấu trúc cây ......................................................................................................................... 24
Hình 7. Các hướng đi ........................................................................................................................ 25
Hình 8: Giao diện game caro .......................................................................................................... 26
Hình 9. Giao diện game caro chơi người với người ........................................................................ 27
Hình 10. Giao diện chơi người với người ......................................................................................... 28
Hình 11. Giao diện chơi người với máy tính..................................................................................... 29
Hình 12: Computer chiến thắng ....................................................................................................... 30

5
DANH SÁCH BẢNG BIỂU

Bảng 1: bảng đối chiếu thuật ngữ .............................................................................32

6
DANH SÁCH CÁC TỪ VIẾT TẮT

Từ Từ viết tắt

component object programing COP

Enterprise Java Bean EJB

Component Object Model COM

Distributed Component Object Model DCOM

Common Object Request Broker CORBA


Architecture

eXtensible Markup Language XML

7
CHƯƠNG I TỔNG QUAN VỀ PHÁT TRIỂN PHẦN MỀM THEO
CẤU PHẦN

I Kiến thức tổng quan về cấu phần

1 Khái niệm lập trình hướng cấu phần

Lâ ̣p triǹ h hướng cấ u phầ n (component object programing-COP) là kiểu


lập trình có xu hướng chia hê ̣ thố ng phầ n mề m thành những thành phần giữ
các chức năng khác nhau (mỗi thành phầ n này đươ ̣c go ̣i là mô ̣t bô ̣ phâ ̣n hơ ̣p
thành) mà khi kết hợp lại ta thu đươ ̣c mô ̣t hệ thố ng phầ n mềm hoàn chin ̉ h.
Với lập trình hướng cấu phầ n, chương trình đươ ̣c xây dựng bằ ng cách lắ p ráp
các thành phần phần mề m có thể sử du ̣ng la ̣i, các khố i tự chức mã máy (hay
còn go ̣i là các khố i thành phầ n thực hiê ̣n). Các thành phần này gồ m các thành
phầ n giao diện, các kết nố i. Component object programing nảy sinh xuất
phát từ thực tế rằ ng mo ̣i thứ có cấ u trúc đề u đươ ̣c ta ̣o nên từ các thành phầ n
khác. Điển hình như trong nề n công nghiê ̣p tự động, các hê ̣ thông đươ ̣c cấ u
ta ̣o từ các thành phầ n.
Các ngôn ngữ có thể đươ ̣c sử du ̣ng trong lâ ̣p triǹ h hướng cấ u phần :
Visual Basic, Delphi, C#, Java…
Tóm lại: Kỹ nghê ̣ phầ n mềm dựa trên cấ u phầ n –CBSE (Component
Based Software Engineering) gồ m các hoạt đô ̣ng:
 COA (Component Oriented Analysis): Phân tích hướng cấ u
phầ n
 COD (Component Oriented Design): Thiế t kế hướng cấu phầ n
 COP (Component Oriented Programming): Lâ ̣p triǹ h hướng cấ u
phầ n
 COM (Component Oriented Management): Quản lý hướng cấ u
phầ n
Từ cách nhìn của tiế n trình kỹ nghê ̣, các thành phầ n có thể đươ ̣c phân
làm 5 da ̣ng khác nhau:
 Thành phầ n đă ̣c tả: Biể u diễn các đă ̣c tả của mô ̣t đơn vi ̣ phầ n
mề m, mô tả mô ̣t tập hành vi của các đố i tươ ̣ng phầ n mề m.
 Thành phần giao diê ̣n: Đinh ̣ nghi ̃ mô ̣t tâ ̣p hành vi có thể đươ ̣c
yêu cầ u bởi mô ̣t đối tươ ̣ng thành phầ n.
 Thành phầ n cài đă ̣t: Có thể vâ ̣n hành đô ̣c lập (điề u này không có
nghĩa nó đô ̣c lập với các thành phầ n khác. Nó có thể có nhiề u
phu ̣ thuô ̣c với thành phầ n khác).

8
 Thành phầ n đã cài đă ̣t: Thành phầ n mã thực thi
 Thành phầ n đối tươ ̣ng: Lớp, gói
CBSE hiê ̣n tại là một mô hình cho việc phát triển các hệ thố ng phầ n
mề m lớn như:
 Các ứng du ̣ng phâ tán cho doanh nghiê ̣p
 Các ứng du ̣ng Web-N Tier
 Các dich ̣ vu ̣ web
Có thể dùng công nghê ̣ của Java như:
 EJB: Enterprise Java Bean,
 COM: Component Object Model
 DCOM: Distributed Component Object Model
 CORBA: Common Object Request Broker Architecture
Hoặc công nghệ .NET của Microsoft để phát triể n các hệ thố ng phầ n
mề m theo mô hình này.
Ưu điể m của COP:
 Trinh phu ̣c sự phức ta ̣p
 Quản lý sự thay đổ i
 Tái sử du ̣ng
 Lập trình viên có thể chia sẻ với nhau những thành phầ n mình đã
xây dựng cho nhiề u người khác dùng chung
 Khi cần, lập triǹ h viên có thể lắ p ghép các thành phần có sẵn
khác nhau để ta ̣o thành các chương trình có chức năng khác
nhau. Tất cả chỉ cầ n dựa trên công nghê ̣ lắp ghép thành phầ n, tiết
kiê ̣m đươ ̣c rấ t nhiề u công sức lâ ̣p trình.

2 Nguyên tắc của hướng cấu phần

Các nguyên tắ c cơ bản trong công nghê ̣ phầ n mề m hướng cấ u phầ n nói
chung và lâ ̣p trình hướng cấ u phầ n nói riêng.
 Nguyên tắc 1: Cách phân tić h các thành phầ n đa ̣i diê ̣n và trừu
tươ ̣ng
 Nguyên tắc 2: Có thể dùng la ̣i nên đa ̣t đươ ̣c ở các triǹ h đô ̣ khác
nhau
 Nguyên tắ c 3: Phát triề n phầ n mềm hướng cấ u phần tăng đô ̣ tin
câ ̣y của phầ n mề m
 Nguyên tắc 4: Phát triển phần mề m hướng cấ u phầ n có thể tăng
năng suấ t phầ n mề m

9
 Nguyên tắc 5: Phát triển phần mề m hướng cấ u phầ n thúc đẩ y
tiêu chuẩ n phầ n mề m

3 Tại sao COP quan trọng

Trải qua nhiều thăng trầm, sóng gió, các ngành công nghiệp đã áp dụng
các tiêu chuẩn thành phần và các công cụ lắp ráp hợp lý để tăng tốc độ phát
triển của các sản phẩm rất phức tạp.
Tuy nhiên trong ngành công nghệ phần mềm, các sản phầm chủ yếu
vẫn là các sản phẩm thủ công, năng xuất làm việc thấp, chất lượng không
đảm bảo và các dự án chủ yếu bị dừng lại. Hiện tượng đó được gọi là “cuộc
khủng hoảng phần mềm”.Cũng như việc phát triển công nghệ phần cứng, chi
phí phát tiển một ứng dụng cho máy tính hay các đồ dùng điện tử khác chủ
yếu là ở phần mềm. Vấn đề quan trọng của ngành công nghệ phần mềm là
làm thế nào để tạo ra những phần mềm chất lượng hiệu quả.Xây dựng thành
các thành phần được các kỹ sư phần mềm nhìn nhận như là một giải pháp
công nghệ quan trọng nhằm giải quyết “cuộc khủng hoảng phần mềm”.
Cuộc cách mạng công nghiệp của phần mềm sẽ xuất hiện dựa trên công nghệ
phần mềm theo cấu phần. Có một số lý do chính để giải thích tại sao COP lại
quan trọng đó là: COP cung cấp một mức độ trừu tượng cao hơn. Hiện nay
có một số lượng lớn các thành phần, các thư viện hộ trợ được tái sử dụng
trong việc phát triển ứng dụng cho các lịch vực khác nhau, và 3 mục tiêu
chính của COP là : giải quyết phức tạp, quản lý thay đổi và tái sử dụng.

II Tổng quan về .NET Framework

.NET framework Là một trong những công nghệ mới nhất được giới
thiệu bởi Tập đoàn Microsoft.
Phiên bản Beta đầu tiên của nó đã được phát hành vào năm 2000. .NET
framework là một nền tảng xây dựng nhanh chóng và dễ dàng hơn , triển
khai và bảo đảm chạy. Thành phần phần mềm .NET được tích hợp trong các
ứng dụng cũng như để phát triển nhanh XML Web Service và các ứng dụng.
Nó cung cấp một năng suất cao, dựa trên thành phần, đa ngôn ngữ môi
trường cho việc tích hợp các ứng dụng hiện có với Internet để đáp ứng những
thách thức của các ứng dụng mới cho việc triển khai và hoạt động của các
ứng dụng Internet quy mô.
Đầu tiên .NET đơn giản hoá cấu thành đặc biệt là cho Component
Object Model (COM), phân phối công nghệ COM (DCOM). Mặc dù các
thành phần COM có thể tái sử dụng như thành phần phần mềm plug- and-

10
play trong phần mềm thành phần và ứng dụng công trình xây dựng, quá trình
phát triển là quá phức tạp và COM không hỗ trợ phiên bản hiê ̣n ta ̣i (thực hiện
side-by-side), mà có thể gây ra xung đột phiên bản (vấn đề DLL).
Công nghệ .NET hỗ trợ triển khai lắp ráp thành phần cho phép nhiều
phiên bản của các thành phần cùng tên để cùng tồn tại mà không có xung
đột. Công nghệ .NET đơn giản hoá việc tạo ra và triển khai các thành phần
bổ sung để đảm bảo đáng tin cậy và khả năng mở rộng các dịch vụ được
cung cấp bởi các thành phần.
Thứ hai, .NET tạo điều kiện cho sự phát triển của các thành phần được
phân phối bởi Remoting. Công nghệ kênh .NET framework hỗ trợ khả năng
tương tác giữa COM và thành phần NET. XML Web Service là một loại
thành phần. Một thành phần .NET có thể làm việc với bất kỳ thành phần
COM hiện tại . Nói cách khác,.NET có thể cung cấp dịch vụ cho các thành
phần COM, và các thành phần COM cũng có thể được sử dụng bởi bất kỳ
thành phần .NET . Nó là dễ dàng hơn nhiều để phát triển các thành phần
trong .NET hơn trong COM. Web dịch vụ là một sự thay thế của công nghệ
MS DCOM cho các ứng dụng Internet được hỗ trợ bởi các giao thức XML,
SOAP và HTTP .NET giải phóng mã hóa phát triển từ chương trình doanh
nghiệp như quản lý giao dịch thông qua doanh nghiệp dịch vụ .NET Dịch vụ
Web vượt qua thiếu sự hỗ trợ cho DCOM tường lửa và làm cho dịch vụ sẵn
trên nền tảng thông qua giao thức XML và SOAP.

11
Hình 1.Toàn bộ thư viện của C#

12
CHƯƠNG II GIỚI THIỆU VỀ THUẬT TOÁN AI TRONG GAME
CARO

I Thuật toán MinMax

1 Thuật toán minimax là gì?

Minimax là giải thuật là một thuật toán đệ quy lựa chọn bước đi kế
tiếp trong một trò chơi có hai người bằng cách định 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.

2 Tại sao cần dùng thuật toán minimax?

Như các bạn đã biết thì có rất nhiều thuật toán tìm kiếm để làm AI
trong game như A, Heuristic... Mỗi thuật toán thì sẽ phù hợp với từng loại
game cho nó. Những game đối kháng trong đối người chơi luân phiên đánh
như cờ vua, cờ tường, caro... Khi chơi bạn có thể khai triển hết không gian
trạng thái nhưng khó khăn chủ yếu là bạn phải tính toán được phản ứng và
nước đi của đối thủ mình như thế nào? Cách xử lý đơn giản là bạn giả sử đối
thủ của bạn cũng sử dụng kiến thức về không gian trạng thái giống bạn. Giải
thuật Minimax áp dụng giả thuyết này để tìm kiếm không gian trạng thái của
trò chơi. Trường hợp này thuật toán minimax sẽ đáp ứng những gì mình
cần.Mỗi node biểu diễn 1 trạng thái của trò chơi hiện tại trên cây trò chơi.
Node được gọi nút lá là tại đó trò chơi kết thúc (trạng thái trò chơi lúc đó có
thể thắng, thua hoặc hòa).

3 Giải thuật minimax

Hai người chơi trong game được đại diện là MAX và MIN. MAX đại
diện cho người chơi luôn muốn chiến thắng và cố gắng tối ưu hóa ưu thế của
mình còn MIN đại diện cho người chơi cố gắng cho người MAX giành số
điểm càng thấp càng tốt. 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

13
Hình 2: Mô tả thuật toán MinMax
Hình 1.1: Mô tả thuật toán Min max

Như hình trên ta thấy là trạng thái hiện tại của game đang đến lượt đánh
của người chơi X đại diện cho MAX. Ta tạm quy định giá trị MAX lúc game
thắng cho X = +10 và MIN lúc game thua cho X = -10 và lúc game hòa = 0.
Lúc này ở lượt 1, MAX có thể đi được 1 trong 3 nước như hình. Vậy làm sao
để chọn 1 trong 3 nước đó nước nào là tốt nhất để đi. Chúng ta dựa vào giá
trị của từng nước để chọn nước tốt nhất, như ở đây 3 node đó thuộc lớp
MAX nên chọn giá trị lớn nhất. Chúng ta bắt đầu tìm giá trị của từng node
đó. Ở lớp MAX trong lượt 1, thì ta có node 1,2,3 được đánh số từ trái sáng
phải như hình. Node 3 chúng ta đã là node lá (X win game) và có giá trị là
+10. Còn 2 node 1,2 thì chưa biết ở đây là như node 3 có giá trị lớn nhất là
+10.

14
4 Áp dụng thuật toán vào chương trình

Đầu tiên chúng ta cần 1 hàm để biết trạng thái game hiện tại đã
thắng, thua hay hòa. CheckStateGame(Move) Tiếp theo là cần tìm nước tốt
nhất cần đi.

Và tiếp đến là hàm tính giá trị minimax của các nước đó

Như ở hình này ta cần tìm giá trị lớn nhất của các node con. Mà ta tính
được giá trị node 1,2,3 tương ứng là -10, +10, +10. Vậy giá trị ở node 2,3 là
bằng nhau = +10. Nên ta đang phân vân giữa 2 node 2,3

15
Áp dụng nâng cấp trên thì ta sẽ có giá trị mới của node 1,2,3 tương ứng
là -9,+8,+10 => Max = +10 giá trị của node 3. Vậy node 3 là node cần tìm.

5 Tối ưu thuật toán minimax

Đánh giá thuật toán: Giả sử số nhánh của cây game là a. Xét độ sâu
depth b thì số nút cần phải tính là a^b. Đây là con số khá lớn. Nên sinh ra
thuật toán để tối ưu thuật toán minimax là cắt tỉa Alpha Beta.

II Thuật toán cắt tỉa Alpha Beta

1 Tìm hiểu về thuật toán cắt tỉa Alpha Beta

Xét một trò chơi trong đó hai người thay phiên nhau đi nước của mình
như cờ vua, cờ tướng, carô,… Trò chơi có một trạng thái bắt đầu và mỗi
nước đi sẽ biến đổi trạng thái hiện hành thành một trạng thái mới. Trò chơi sẽ
kết thúc theo một quy định nào đó, theo đó thì cuộc chơi sẽ dẫn đến một
trạng thái phản ánh có một người thắng cuộc hoặc một trạng thái mà cả hai
đấu thủ không thể phát triển được nước đi của mình, ta gọi nó là trạng thái
hòa cờ. Ta tìm cách phân tích xem từ một trạng thái nào đó sẽ dẫn đến đấu
thủ nào sẽ thắng với điều kiện cả hai đấu thủ đều có trình độ như nhau
Một trò chơi như vậy có thể được biểu diễn bởi một cây, gọi là cây trò
chơi. Mỗi một nút của cây biểu diễn cho một trạng thái. Nút gốc biểu diễn
cho trạng thái bắt đầu của cuộc chơi. Mỗi nút lá biểu diễn cho một trạng thái
kết thúc của trò chơi (trạng thái thắng thua hoặc hòa). Nếu trạng thái x được
biểu diễn bởi nút n thì các con của n biểu diễn cho tất cả các trạng thái kết
quả của các nước đi có thể xuất phát từ trạng thái x.

16
2 Ví dụ

Xét trò chơi carô có 9 ô. Hai người thay phiên nhau đi X hoặc O. Người
nào đi được 3 ô thẳng hàng (ngang, dọc, xiên) thì thắng cuộc. Nếu đã hết ô đi
mà chưa phân thắng bại thì hai đấu thủ hòa nhau. Một phần của trò chơi này
được biểu diễn bởi cây sau:

Hình 3. Cờ carô có 9 ô biểu diễn bằng cây

Trong cây trò chơi trên, các nút lá được tô nền và viền khung đôi để dễ
phân biệt với các nút khác. Ta có thể gán cho mỗi nút lá một giá trị để phản
ánh trạng thái thắng thua hay hòa của các đấu thủ. Chẳng hạn ta gán cho nút
lá các giá trị như sau:
1 nếu tại đó người đi X đã thắng
1 nếu tại đó người đi X đã thua
0 nếu hai đấu thủ đã hòa nhau.
Như vậy từ một trạng thái bất kỳ, đến lượt mình, người đi X sẽ chọn
cho mình một nước đi sao cho dẫn đến trạng thái có giá trị lớn nhất (trong
17
trường hợp này là 1). Ta nói X chọn nước đi MAX, nút mà từ đó X chọn
nước đi của mình được gọi là nút MAX. Người đi O đến lượt mình sẽ chọn
một nước đi sao cho dẫn đến trạng thái có giá trị nhỏ nhất (trong trường hợp
này là -1, khi đó X sẽ thua và do đó O sẽ thắng). Ta nói O chọn nước đi
MIN, nút mà từ đó O chọn nước đi của mình được gọi là nút MIN. Do hai
đấu thủ luân phiên nhau đi nước của mình nên các mức trên cây trò chơi
cũng luânphiên nhau là MAX và MIN. Cây trò chơi vì thế còn có tên là cây
MIN-MAX. Ta có thể đưa ra một quy tắc định trị cho các nút trên cây để
phản ánh tình trạng thắng thua hay hòa và khả năng thắng cuộc của hai đấu
thủ.
Nếu một nút là nút lá thì trị của nó là giá trị đã được gán cho nút đó.
Ngược lại, nếu nút là nút MAX thì trị của nó bằng giá trị lớn nhất của tất cả
các trị của các con của nó. Nếu nút là nút MIN thì trị của nó là giá trị nhỏ
nhất của tất cả các trị của các con của nó.
Quy tắc định trị này cũng gần giống với quy tắc định trị cho cây biểu
thức số học, điểm khác biệt ở đây là các toán tử là các hàm lấy max hoặc min
và mỗi nút có thể có nhiều con. Do vậy ta có thể dùng kỹ thuật quay lui để
định trị cho các nút của cây trò chơi.

3 Cách cài đặt

Để cài đặt ta có một số giả thiết sau:


 Ta có trường info cho ta giá trị của.
 Các hằng 2 và -2 tương ứng là các trị lớn nhất và nhỏ nhất của
từng nút.
 Một biến c kiểu char để xác định định trị cho nút là X hay O đi.
 Một kiểu pointer được khai báo một cách thích hợp để biểu diễn
cho một nút trên cây phản ánh một trạng thái của cuộc chơi.
 Ta có một hàm nutLa() để xác định xem một nút có phải là nút lá
hay không?
 Hàm max và min tương ứng lấy giá trị lớn nhất và giá trị nhỏ nhất
của hai giá trị

III Thuật toán tìm kiếm Heuristic

1 Tìm kiếm leo núi (Hill climbing- Pearl 1984)

Cách đơn giản nhất để thực hiện tìm kiếm heuristic là tìm kiếm “leo
núi”. Chiến lược leo núi phát triển trạng thái con tốt nhất sẽ được chọn cho
bước tiếp theo, không lưu giữ lại bất kỳ thông tin nào về các nút anh em lẫn

18
cha mẹ của nó. Quá trình tìm kiếm sẽ dừng lại khi tiếp cận trạng thái tốt hơn
so với mọi trạng thái con của nó. Hình dung một người leo núi hăm hở
nhưng mù quáng luôn luôn chọn leo lên đỉnh theo con đường dốc nhất có thể
có cho đến khi không còn leo tiếp được nữa. Vì không ghi lại thông tin của
quá trình đã xảy ra nên thuật toán này không thể phục hồi lại từ những thất
bại trong chiến lược của nó.
Hạn chế chủ yếu của chiến lược leo núi là có xu hướng rơi vào “một
cực đại cục bộ”. Khi đến được một trạng thái tốt hơn so với mọi trạng thái
con của nó, thuật toán dừng lại. Nếu trạng thái này không phải là đích mà chỉ
là một điểm cực đại cục bộ, thuật toán sẽ thất bại trong việc tìm lời giải. Như
vậy hiệu quả hoạt động chỉ có thể được cải thiện trong một phạm vi giới hạn
nào đó, nhưng trong toàn bộ không gian có thể không bao giờ đạt được sự tối
ưu tổng thể.

2 Tìm kiếm tốt nhất đầu tiên (Best – first - search)

Xét đồ thị không gian tìm kiếm như hình dưới đây (con số cạnh mỗi nút
cho biết giá trị ước lượng độ tốt của nút đó trong không gian, giá trị thấp nhất
là tốt nhất). Giả sử nút đích cần tìm kiếm là P.

Hình 4. Đồ thị cho giải thuật tìm kiếm tốt nhất đầu tiên

Câu hỏi: Trình bày danh sách các nút được duyệt dùng thuật toán leo
núi cho đồ thị trong hình 4.4 ?

19
Giống như các thuật toán tìm kiếm sâu và rộng, tìm kiếm tốt nhất cũng
dùng các danh sách để lưu giữ trạng thái: danh sách open chứa các nút được
triển khai trong quá trình tìm kiếm và danh sách closed chứa các nút đã xét.
Một bước mới được bổ sung vào thuật toán là sắp xếp các trạng thái trong
danh sách open phù hợp với giá trị heuristic ước lượng “độ tốt” của chúng so
với đích. Như vậy mỗi bước lặp của vòng lặp sẽ xem xét trạng thái “có hứa
hẹn nhất” trong danh sách open và loại bỏ trạng thái này ra khỏi open. Nếu
gặp trạng thái đích, thuật toán này sẽ cung cấp con đường lời giải đã dẫn đến
đích đó. Nếu ngược lại, phần tử đầu tiên của open không phải là đích, thuật
toán sẽ áp dụng các luật phù hợp để phát sinh con cháu. Trường hợp một
trạng thái con nào đó đã có sẵn trong open hoặc closed, thuật toán cũng sẽ
kiểm tra để chắc chắn rằng sẽ chọn được nút cung cấp con đường lời giải
ngắn hơn. Các trạng thái lặp hai lần sẽ không được giữ lại. Nhờ cập nhật kịp
thời nguồn gốc của các nút trong open và closed nên thuật toán này có nhiều
khả năng tìm được đường đi ngắn nhất dẫn đến đích. Khi open được duy trì
dưới dạng một danh sách có sắp xếp, nó thường được tổ chức như là
một hàng ưu tiên (Priority queue). Dưới đây trình bày các bước áp dụng
thuật toán tìm kiếm cho đồ thị trong hình trên.
1. open = [A5]; closed = []2. Đánh giá A5; open = [B4,C4,D6]; closed
= [A5]3. Đánh giá B4; open = [C4,E5,F5,D6]; closed = [B4,A5]4. Đánh giá
C4; open = [H3,G4,E5,F5,D6]; closed = [C4,B4,A5]5. Đánh giá H3; open =
[O2,P3,G4,E5,F5,D6]; closed = [H3,C4,B4,A5]6. Đánh giá O2; open =
[P3,G4,E5,F5,D6]; closed = [O2,H3,C4,B4,A5]7. Đánh giá P3; Tìm được lời
giải!

3 Cài đặt hàm đánh giá heuristic (heuristic evaluation funciton)

Bây giờ ta đánh giá hiệu quả của vài heuristic khác nhau được dùng để
giải trò đố 8 ô. Hình dưới đây trình bày trạng thái xuất phát và trạng thái đích
của trò chơi cùng với ba trạng thái đầu tiên trong quá trình tìm kiếm.
Heuristic đơn giản nhất sẽ đếm số ô sai khác so với trạng thái
đích trong từng trạng thái. Trạng thái có số ô sai khác ít nhất sẽ gần đích hơn
và là trạng thái tốt nhất để kiếm tra kế tiếp.

20
Hình 5.Trạng thái bắt đầu và kết thúc trong trò đố 8 ô

Tuy nhiên heuristic này không sử dụng hết các thông tin trong một cấu
hình bàn cờ vì nó không đưa vào khoảng cách mà các ô sai khác. Một
heuristic “tốt hơn” là sẽ cộng tất cả các khoảng cách đó lại thành tổng số ô
mà một ô phải di chuyển về vị trí đúng của nó trong trạng thái đích (khoảng
cách Manhattan).
Cả hai heuristic này đều có hạn chế là không thể biết rõ những khó
khăn khi đổi chỗ hai ô. Đó là trường hợp hai ô nằm cạnh nhau và vị trí đúng
của chúng là phải đổi chỗ cho nhau, ta phải mất nhiều (chứ không phải hai)
nước đi mới đặt chúng lại được đúng vị trí. Một heuristic muốn tính toán
điều này phải nhân ít nhất là gấp đôi khoảng cách đối với mỗi trường hợp có
hai ô đổi chỗ trực tiếp.
Heuristic “khoảng cách Manhattan” cho chúng ta một dự đoán có vẻ
chính xác hơn so với heuristic số ô sai khác so với trạng thái đích. Mục đích
của chúng ta là dùng những thông tin hạn chế có sẵn trong một mô tả trạng
thái để đưa ra những chọn lựa thông minh. Việc thiết kế các heuristic tốt là
một vấn đề mang tính kinh nghiệm, óc phán đoán và trực giác, nhưng giá trị
cuối cùng của một heuristic phải được đo bằng hiệu quả thực sự của nó trong
từng tình huống bài toán.
Vì heuristic có thể sai lầm nên có khả năng thuật toán tìm kiếm sẽ dẫn
đến một con đường không đưa đến đích. Vấn đề này đã xuất hiện trong tìm
kiếm sâu, ở đó một giới hạn độ sâu đã được sử dụng để phát hiện những con
đường thất bại. Ý tưởng này cũng có thể áp dụng cho tìm kiếm heuristic. Nếu

21
hai trạng thái có giá trị heuristic bằng nhau thì nên kiểm tra trạng thái nào
gần trạng thái gốc của đồ thị hơn. Trạng thái gần gốc hơn sẽ có nhiều khả
năng là con đường ngắn nhất dẫn đến đích. Khoảng cách từ trạng thái xuất
phát có thể đo được bằng cách duy trì một số đếm chiều sâu cho từng trạng
thái đếm. Số đếm này bằng 0 đối với trạng thái xuất phát và tăng lên một đơn
vị sau mỗi mức tìm kiếm. Nó ghi lại độ dời thực tế phải thực hiện để đi từ
trạng thái xuất phát đến từng trạng thái. Số đếm này có thể cộng thêm vào
giá trị heuristic của từng trạng thái để hướng việc tìm kiếm theo khuynh
hướng chọn những trạng thái gần trạng thái xuất phát hơn trong đồ thị.
Do đó hàm đánh giá f sẽ bao gồm tổng của hai phần:
f(n) = g(n) + h(n)
trong đó g(n) đo chiều dài thực từ trạng thái n bất kỳ về trạng thái xuất
phát và h(n) là ước lượng heuristic cho khoảng cách từ trạng thái n đến trạng
thái đích.
Chẳng hạn, trong bài toán trò đố 8 ô trên, chúng ta có thể gọi h(n) là số
ô cần phải dời chỗ. Khi hàm đánh giá này được áp dụng cho từng trạng thái
con (A), (B), (C) trong hình 4.5, các giá trị cho hàm f lần lượt là 6, 4 và 6.
Một heuristic dùng hàm đánh giá f(n) như trên kết hợp với thuật toán
tìm kiếm tốt nhất đầu tiên best-first-search, được gọi là thuật toán
A (algorithm A)
Câu hỏi:
Mật mã Caesar là một cách mã hóa đơn giản dựa vào phép hoán vị
vòng tròn các chữ trong bảng chữ cái, với chữ cái thứ i được thay thế bởi chữ
cái thứ (i + 1). Ví dụ, trong mật mã Caesar dịch 4 bậc, từ “Ceasar” sẽ được mã
hóa thành “Geiwev”. Nêu một heuristic mà bạn nghĩ có thể dùng để giải các
mật mã Ceasar?
a) Tính khả chấp, tính đơn nhất và khả năng cung cấp thông
tin của heuristic
Có thể chúng ta phải đánh giá cách hành xử của các heuristic trên một
số phương diện. Ví dụ, có thể chúng ta không chỉ cần một giải pháp mà còn
cần thuật toán để tìm con đường ngắn nhất dẫn đến đích. Một số tính chất
dưới đây là cần xem xét đối với việc đánh giá hiệu quả của một Heuristic:
b) Tính khả chấp:
Một heuristic dùng để tìm ra con đường dẫn đến đích ngắn nhất bất cứ
khi nào nó có tồn tại được gọi là heuristic khả chấp (admissible). Nói cách
khác, tính khả chấp của heuristic là nó sẽ bảo đảm tìm thấy đường đi ngắn
nhất đến trạng thái đích.
Một thuật toán tìm kiếm có thể chấp nhận được nếu nó được đảm bảo
sẽ tìm thấy một đường đi tối thiểu dẫn đến lời giải, bất kỳ lúc nào con đường
22
đó có mặt. Trong việc xác định tính khả chấp của một heuristic, chúng ta
định nghĩa hàm đánh giá f* :
f*(n) = g*(n) + h*(n)
Với g*(n) là giá của đường đi ngắn nhất từ nút bắt đầu đến nút n, còn
h*(n) là giá thực sự của đường đi ngắn nhất từ nút n đến nút mục tiêu. Như
vậy f*(n) là chi phí thực của con đường tối ưu từ nút xuất phát đến nút đích
đi qua nút n.
Nếu thuật toán A dùng hàm đánh giá f, trong đó h(n) ≤ h*(n) thì nó
được gọi là thuật toán A*(algorithm A)
c) Tính đơn nhất
Khi có một trạng thái được phát hiện nhờ sử dụng tìm kiếm heuristic,
liệu có bảo đảm rằng về sau sẽ không tìm được một trạng thái như vậy với
khoảng cách ngắn hơn tính từ trạng thái xuất phát. Đây chính là thuộc tính
của sự đơn nhất (monotocinity). Nói cách khác, tính đơn nhất của một
heuristic là nó sẽ bảo đảm đường đi ngắn nhất đến mỗi trạng thái.
Một heuristic h sẽ là đơn nhất nếu:
Đối với tất cả các trạng thái n và n+1, ta có:
h(n) - h(n+1) ≤ cost (n, n+1),
trong đó cost (n, n+1) là chi phí thực tính của đường đi từ trạng thái n
đến trạng thái n+1.
Giá trị heuristic của trạng thái đích là 0, tức h(goal) = 0.
d) Khả năng cung cấp thông tin:
Chúng ta có thể đặt câu hỏi liệu có một heuristic nào “tốt hơn” những
cái khác hay không? Heuristic này tốt hơn heuristic kia theo ý nghĩa nào?
Đây là khả năng cung cấp thông tin (informedness) của một heuristic.
Đối với hai heuristic h1 và h2, nếu h1(n) ≤ h2(n) ứng với tất cả các trạng
thái n trong không gian tìm kiếm thì heuristic h2 được gọi là có khả năng
cung cấp thông tin nhiều hơn so với h1.

23
CHƯƠNG III ỨNG DỤNG

I Sơ lược về trí tuệ nhân tạo

Trí tuệ nhân tạo hay trí thông minh nhân tạo (Artificial intelligence hay
Machine intelligence, thường được viết tắt là AI) là trí tuệ được biểu diễn bởi
bất cứ một hệ thống nhân tạo nào.Trí tuệ nhân tạo được chia thành 2 trường
phái tư duy: truyền thống và trí tuệ tính toán.

1 Trí tuệ nhân tạo trong đánh cờ

 Trí tuệ nhân tạo trong các loại cờ đa phàn không quá cao siêu,
chỉ cần có kiến thức về cấu trúc cây.
 Trong đánh cờ luôn luôn tồn tại 2 hướng đi song song.
+ Tấn công
+ Phòng ngự
 Các nước phát sinh luôn đòi hỏi trạng thái cuối cùng là phải
giành chiến thắng hoặc đạt được thế cờ tốt nhất.
 Cần tìm được 1 hàm đánh giá sao cho nước đi thứ i nào đó là
tốt nhất.

2 Ý tưởng về lập trình trí tuệ nhân tạo trong trò chơi cờ caro

Hình 6. Cấu trúc cây

Sử dụng cấu trúc cây..


 Tại lượt đi A, tìm kiếm các nước có thể đánh B và C.

24
 Tính trước các nước D,E tương ứng với B và F,G,H tương ứng với
C.
 Tiếp tục tính trước các nước I tương ứng với E và M, N tương ứng
với I.
=> Quá nhiều nước đi và làm sao để biết nước nào nên đi?

Hình 7. Các hướng đi

Tương ứng mỗi nước đi, lần lượt quét các đường:
 Lần lượt duyệt theo các hướng và tính toán cả việc tấn công hay
phòng ngự có lợi ở nước đó.
 Dùng 2 mảng để lưu trữ điểm tấn công và phòng ngự:
+ DiemTanCong: [0 ,10, 100, 1000, 10000]
+DiemPhongNgu:[0,5,50,500,5000]
 Theo hướng đó có bao nhiêu quân ta thì cộng vào bấy nhiêu
điểm tấn công và ngược lại.
 Lặp lại các nước con có thể đánh ở nước sau.

II Thiết kế các vấn đề cần xử lý

 Định lượng 2 mảng điểm tấn công và phòng ngự


 Tiến hành vét cạn các vị trí ô cờ còn trống trên bàn cờ:
+ Với mỗi ô cờ, tiến hành tính điểm tấn công và phòng ngự theo
4 phương 8 hướng.
+ Tùy theo quan niệm lập trình sẽ quy định tấn công hay phòng
ngự quan trọng hơn là chọn nó.
+ tìm ra nước đi có số điểm cao nhất và chọn nước đi đó làm
nước đi cuối cùng cho máy.
 Xử lý một số vấn đề để giả lập như khi đánh với người.

25
III Giao diện game

Hình 8: Giao diện game caro

26
Hình 9. Giao diện game caro chơi người với người

27
Hình 10. Giao diện chơi người với người

28
Hình 11. Giao diện chơi người với máy tính

29
Hình 12: Computer chiến thắng

30
CHƯƠNG IV KẾT LUẬN

I Kết luận

- Đã hoàn thành bài tập lớn game caro

II Hướng phát triển

- Muốn khi người chơi với máy thông minh hơn hiện tại
- Tách nhiều thành phần nhỏ hơn, để có thể sử dụng lại được các
chức năng,
- Clear được bàn cờ bằng graphics

III Bảng đối chiếu thuật ngữ

STT Thuật ngữ Nghĩa của thuật ngữ


1 AI (Artificial Intelligence) Trí tuệ nhân tạo hay trí thông
minh nhân tạo
2 COA (Component Oriented Phân tić h hướng cấ u phầ n
Analysis):

3 COD (Component Oriented Thiế t kế hướng cấ u phầ n


Design):

4 COP (Component Oriented ̀ h hướng cấ u phần


Lâ ̣p trin
Programming):

5 COM (Component Oriented Quản lý hướng cấu phầ n


Management):

6 OOP (Object Oriented ̀ h hướng đố i tượng


Lâ ̣p trin
Programming)
7 XML (eXtensible Markup Ngôn ngữ đánh dấu mở rộng
Language)
8 SOAP (Simple Object Access Một giao thức do W3C định nghĩa
Protocol)
9 HTTP (HyperText Transfer Giao thức truyền tải siêu văn bản
Protocol)

31
10 DCOM (Distributed Một công nghệ độc quyền của
Component Object Model) Microsoft cho thông tin liên lạc
giữa các thành phần phần mềm
được phân phối qua các máy tính
nối mạng.
11 SDK (Software Development Một bộ công cụ phát triển phần
Kit) mềm
12 CLR (Common Language Nó là phần quan trọng của . NET
Runtime) framework. Các ngôn ngữ đều có
bộ phận quản lí đoạn mã khi nó
chạy
13 WFC (Windows Công nghệ mới nhất được thiết kế
Communication Foundation) theo kiến trúc hướng dịch vụ
(Service Oriented Architecture –
SOA)
Bảng 1: bảng đối chiếu thuật ngữ

IV Tài liệu tham khảo

Sách: component-oriented-programming

https://viblo.asia/p/thuat-toan-minimax-ai-trong-game-APqzeaVVzVe

http://www4.hcmut.edu.vn/~huynhqlinh/TinhocDC/THDC13/Bai03_6.htm

https://www.stdio.vn/articles/read/564/giai-thuat-cat-tia-alpha-beta

https://nguyenvanquan7826.com/2013/10/24/thuat-toan-thuat-toan-minmax-cat-tia-
anpha-beta/

32

You might also like