Tải bản đầy đủ (.doc) (26 trang)

Lập trình C sharp xây dựng ứng dụng chơi cờ vua

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.65 MB, 26 trang )

Chương 1: Tổng quan về Csharp........................................................................................................................2
1.1: Tổng quan................................................................................................................................................ 2
1.1.1: Mircosoft .NET Framework................................................................................................................ 2
- Common Language Runtime:................................................................................................................ 2
-Thư viện lớp .NET Framework: là một tập hợp những kiểu dữ liệu được dùng lại và được kết hợp chặt
chẽ với Common Language Runtime. Thư viện lớp là hướng đối tượng cung cấp những kiểu dữ liệu
mà mã nguồn được quản lý của chúng ta có thể dẫn xuất. Điều này không chỉ làm cho những kiểu dữ
liệu của .NET Framework dễ sử dụng mà còn làm giảm thời gian liên quan đến việc học đặc tính mới
của .NET Framework. Thêm vào đó, các thành phần của các hãng thứ ba có thể tích hợp với những
lớp trong .NET Framework....................................................................................................................... 2
-Phát triển ứng dụng Client...................................................................................................................... 3
1.1.2 Ngôn ngữ Csharp............................................................................................................................... 3
Tại sao phải sử dụng ngôn ngữ C#..........................................................................................................4
C# là ngôn ngữ hiện đại........................................................................................................................... 4
C# là ngôn ngữ hướng đối tượng ........................................................................................................... 5
C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo...........................................................................................5
C# là ngôn ngữ ít từ khóa........................................................................................................................ 5
C# là ngôn ngữ hướng module................................................................................................................ 5
C# sẽ là một ngôn ngữ phổ biến.............................................................................................................. 5

1.2: Window Forms ...........................................................................................................................................6
1.2.1: Control.................................................................................................................................................. 6
1.2.2: Picture Box........................................................................................................................................ 6
1.2.3: Panel................................................................................................................................................. 6
1.2.4: Sự kiện (Event) ................................................................................................................................ 7
1.2.5: Message Box ................................................................................................................................... 7
1.2.6: Graphics Graphical Interface (GDI+).................................................................................................7

Chương 2: Trò chơi cờ vua và các thuật toán xử lý ..........................................................................................8
2.1: Giới thiệu trò chơi cờ vua......................................................................................................................... 8
2.1.1: Lịch sử máy tính trò chơi cờ vua.......................................................................................................8


*Sơ lược lịch sử máy tính trong cờ Vua...................................................................................................9
2.1.2: Mô tả trò chơi cờ vua....................................................................................................................... 13
2.2: Các thuật toán xử lý............................................................................................................................... 16
2.2.1: Thuật toán Minimax......................................................................................................................... 16
2.2.2: Thuật toán cắt cụt alpha-beta.......................................................................................................... 17

Chương 3: Ứng dụng CSharp trong lập trình trò chơi cờ vua..........................................................................18
3.1: Phân tích bài toán.................................................................................................................................. 18
3.2: Xây dựng các tính năng trong game......................................................................................................19
3.3: Một số hình ảnh demo............................................................................................................................ 21


Chương 1: Tổng quan về Csharp
1.1: Tổng quan
1.1.1: Mircosoft .NET Framework
Microsoft .NET gồm 2 phần chính : Framework và Integrated Development Environment (IDE)
- Framework cung cấp những gì cần thiết và căn bản, chữ Framework có nghĩa là khung
hay khung cảnh trong đó ta dùng những hạ tầng cơ sở theo một qui ước nhất định để công
việc được trôi chảy.
- IDE thì cung cấp một môi trường giúp chúng ta triển khai dễ dàng, và nhanh chóng các ứng dụng dựa trên
nền tảng .NET. Nếu không có IDE chúng ta cũng có thể dùng một trình soạn thảo ví như Notepad hay bất cứ
trình soạn thảo văn bản nào và sử dụng command line để biên dịch và thực thi, tuy nhiên việc này mất nhiều
thời gian. Tốt nhất là chúng ta dùng IDE phát triển các ứng dụng, và cũng là cách dễ sử dụng nhất.
- Thành phần Framework là quan trọng nhất .NET là cốt lõi và tinh hoa của môi trường,
còn IDE chỉ là công cụ để phát triển dựa trên nền tảng đó thôi. Trong .NET toàn bộ các ngôn
ngữ C#, Visual C++ hay Visual Basic.NET đều dùng cùng một IDE.
- NET Framework là một platform làm đơn giản phát triển ứng dụng trong môi trường phân tán Internet.
NET Framework được thiết kế đầy đủ để đáp ứng theo quanđiểm sau:
+ Để cung cấp một môi trường lập trình hướng đối tượng vững chắc, trong đó mã nguồn đối tượng được lưu
trữ và thực thi một cách cục bộ. Thực thi cục bộ nhưng được phân tán trên Internet, hoặc thực thi từ xa.

+ Để cung cấp một môi trường thực thi mã nguồn mà tối thiểu được việc đóng gói phần mềm và sự tranh chấp
về phiên bản.
+ Để cung cấp một môi trường thực thi mã nguồn mà đảm bảo việc thực thi an toàn mã nguồn, bao gồm cả
việc mã nguồn được tạo bởi hãng thứ ba hay bất cứ hãng nào mà tuân thủ theo kiến trúc .NET.
+ Để cung cấp một môi trường thực thi mã nguồn mà loại bỏ được những lỗi thực hiện các script hay môi
trường thông dịch.
+ Để làm cho những người phát triển có kinh nghiệm vững chắc có thể nắm vững nhiều kiểu ứng dụng khác
nhau. Như là từ những ứng dụng trên nền Windows đến những ứng dụng dựa trên web.
+ Để xây dựng tất cả các thông tin dựa triên tiêu chuẩn công nghiệp để đảm bảo rằng mã nguồn trên .NET có
thể tích hợp với bất cứ mã nguồn khác.
.NET Framework có hai thành phần chính: Common Language Runtime (CLR) và thư viện lớp .NET Framework.
- Common Language Runtime:
+ CLR thực hiện quản lý bộ nhớ, quản lý thực thi tiểu trình, thực thi mã nguồn, xác nhận mã nguồn an toàn,
biên bịch và các dịch vụ hệ thống khác.
+ CLR thúc đẩy việc mã nguồn thực hiện việc truy cập được bảo mật.
+ CLR còn thúc đẩy cho mã nguồn được thực thi mạnh mẽ hơn bằng việc thực thi mã nguồn
chính xác và sự xác nhận mã nguồn.
-Thư viện lớp .NET Framework: là một tập hợp những kiểu dữ liệu được dùng lại và được kết hợp chặt chẽ
với Common Language Runtime. Thư viện lớp là hướng đối tượng cung cấp những kiểu dữ liệu mà
mã nguồn được quản lý của chúng ta có thể dẫn xuất. Điều này không chỉ làm cho những kiểu dữ liệu
của .NET Framework dễ sử dụng mà còn làm giảm thời gian liên quan đến việc học đặc tính mới
của .NET Framework. Thêm vào đó, các thành phần của các hãng thứ ba có thể tích hợp với những
lớp trong .NET Framework.


- Người phát triển có thể sử dụng .NET Framework để phát triển những ứng dụng và dịch vụ như sau:
+ Ứng dụng Console
+ Ứng dụng giao diện GUI trên Windows (Windows Forms)
+ Ứng dụng ASP.NET
+ Dịch vụ XML Web

+ Dịch vụ Windows
Trong đó những lớp Windows Forms cung cấp một tập hợp lớn các kiểu dữ liệu nhằm làm đơn giản việc phát
triển các ứng dụng GUI chạy trên Windows. Còn nếu như viết các ứng dụng ASP.NET thì có thể sử dụng các lớp
Web Forms trong thư viện .NET Framework.
-Phát triển ứng dụng Client
Những ứng dụng client cũng gần với những ứng dụng kiểu truyền thống được lập trình dựa trên Windows.
Đây là những kiểu ứng dụng hiển thị những cửa sổ hay những form trên desktop cho phép người dùng thực
hiện một thao tác hay nhiệm vụ nào đó. Những ứng dụng client bao gồm những ứng dụng như xử lý văn bản,
xử lý bảng tính, những ứng dụng trong lĩnh vực thương mại như công cụ nhập liệu, công cụ tạo báo
cáo...Những ứng dụng client này thường sử dụng những cửa sổ, menu, toolbar, button hay các thành phần
GUI khác, và chúng thường truy cập các tài nguyên cục bộ như là các tập tin hệ thống, các thiết bị ngoại vi như
máy in.
Trong .NET Framework, chương trình không được biên dịch vào các tập tin thực thi mà thay vào đó chúng
được biên dịch vào những tập tin trung gian gọi là Microsoft Intermediate Language (MSIL). Những tập tin
MSIL được tạo ra từ C# cũng tương tự như các tập tin MSIL được tạo ra từ những ngôn ngữ khác của .NET,
platform ở đây không cần biết ngôn ngữ của mã nguồn. Điều quan trọng chính yếu của CLR là chung
(common), cùng một runtime hỗ trợ phát triển trong C# cũng như trong VB.NET.
Mã nguồn C# được biên dịch vào MSIL khi chúng ta build project. Mã MSIL này được lưu vào trong một tập tin
trên đĩa. Khi chúng ta chạy chương trình, thì MSIL được biên dịch một lần nữa, sử dụng trình biên dịch Just-InTime (JIT). Kết quả là mã máy được thực thi bởi bộ xử lý của máy.

1.1.2 Ngôn ngữ Csharp
Ngôn ngữ C# khá đơn giản, chỉ khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu được xây dựng sẵn. Tuy
nhiên, ngôn ngữ C# có ý nghĩa cao khi nó thực thi những khái niệm lập trình hiện đại. C# bao gồm tất cả
những hỗ trợ cho cấu trúc, thành phần component, lập trình hướng đối tượng. Những tính chất đó hiện diện
trong một ngôn ngữ lập trình hiện đại. Và ngôn ngữ C# hội đủ những điều kiện như vậy, hơn nữa nó được xây
dựng trên nền tảng của hai ngôn ngữ mạnh nhất là C++ và Java.
Phần cốt lõi hay còn gọi là trái tim của bất cứ ngôn ngữ lập trình hướng đối tượng là sự hỗ trợ của nó cho việc
định nghĩa và làm việc với những lớp. Những lớp thì định nghĩa những kiểu dữ liệu mới, cho phép người phát
triển mở rộng ngôn ngữ để tạo mô hình tốt hơn để giải quyết vấn đề. Ngôn ngữ C# chứa những từ khóa cho
việc khai báo những kiểu lớp đối tượng mới và những phương thức hay thuộc tính của lớp, và cho việc thực

thi đóng gói, kế thừa, và đa hình, ba thuộc tính cơ bản của bất cứ ngôn ngữ lập trình hướng đối tượng.
Trong ngôn ngữ C# mọi thứ liên quan đến khai báo lớp điều được tìm thấy trong phần khai báo của nó. Định
nghĩa một lớp trong ngôn ngữ C# không đòi hỏi phải chia ra tập tin header và tập tin nguồn giống như trong
ngôn ngữ C++. Hơn thế nữa, ngôn ngữ C# hỗ trợ kiểu XML, cho phép chèn các tag XML để phát sinh tự động
các document cho lớp. C# cũng hỗ trợ giao diện interface, nó được xem như một cam kết với một lớp cho
những dịch vụ mà giao diện quy định. Trong ngôn ngữ C#, một lớp chỉ có thể kế thừa từ duy nhất một lớp cha,
tức là không cho đa kế thừa như trong ngôn ngữ C++, tuy nhiên một lớp có thể thực thi nhiều giao diện. Khi
một lớp thực thi một giao diện thì nó sẽ hứa là nó sẽ cung cấp chức năng thực thi giao diện.


Trong ngôn ngữ C#, những cấu trúc cũng được hỗ trợ, nhưng khái niệm về ngữ nghĩa của nó thay đổi khác với
C++. Trong C#, một cấu trúc được giới hạn, là kiểu dữ liệu nhỏ gọn, và khi tạo thể hiện thì nó yêu cầu ít hơn về
hệ điều hành và bộ nhớ so với một lớp. Một cấu trúc thì không thể kế thừa từ một lớp hay được kế thừa
nhưng một cấu trúc có thể thực thi một giao diện.
Tại sao phải sử dụng ngôn ngữ C#
Nhiều người tin rằng không cần thiết có một ngôn ngữ lập trình mới. Java, C++, Perl, Microsoft Visual Basic, và
những ngôn ngữ khác được nghĩ rằng đã cung cấp tất cả những chức năng cần thiết.
Ngôn ngữ C# là một ngôn ngữ được dẫn xuất từ C và C++, nhưng nó được tạo từ nền tảng phát triển hơn.
Microsoft bắt đầu với công việc trong C và C++ và thêm vào những đặc tính mới để làm cho ngôn ngữ này dễ
sử dụng hơn. Nhiều trong số những đặc tính này khá giống với những đặc tính có trong ngôn ngữ Java. Không
dừng lại ở đó, Microsoft đưa ra một số mục đích khi xây dựng ngôn ngữ này.
Những mục đích này được được tóm tắt như sau:
C# là ngôn ngữ đơn giản
C# là ngôn ngữ hiện đại
C# là ngôn ngữ hướng đối tượng
C# là ngôn ngữ mạnh mẽ và mềm dẻo
C# là ngôn ngữ có ít từ khóa
C# là ngôn ngữ hướng module
C# sẽ trở nên phổ biến
C# là ngôn ngữ đơn giản

C# loại bỏ một vài sự phức tạp và rối rắm của những ngôn ngữ như Java và c++, bao gồm việc loại bỏ những
macro, những template, đa kế thừa, và lớp cơ sở ảo (virtual base class).
Chúng là những nguyên nhân gây ra sự nhầm lẫn hay dẫn đến những vấn đề cho các người phát triển C++.
Nếu chúng ta là người học ngôn ngữ này đầu tiên thì chắc chắn là ta sẽ không trải qua những thời gian để học
nó! Nhưng khi đó ta sẽ không biết được hiệu quả của ngôn ngữ C# khi loại bỏ những vấn đề trên.
Ngôn ngữ C# đơn giản vì nó dựa trên nền tảng C và C++. Nếu chúng ta thân thiện với C và C++ hoậc thậm chí là
Java, chúng ta sẽ thấy C# khá giống về diện mạo, cú pháp, biểu thức, toán tử và những chức năng khác được
lấy trực tiếp từ ngôn ngữ C và C++, nhưng nó đã được cải tiến để làm cho ngôn ngữ đơn giản hơn. Một vài
trong các sự cải tiến là loại bỏ các dư thừa, hay là thêm vào những cú pháp thay đổi. Ví dụ như, trong C++ có
ba toán tử làm việc với các thành viên là ::, . , và ->. Để biết khi nào dùng ba toán tử này cũng phức tạp và
dễ nhầm lẫn. Trong C#, chúng được thay thế với một toán tử duy nhất gọi là . (dot). Đối với người mới học thì
điều này và những việc cải tiến khác làm bớt nhầm lẫn và đơn giản hơn.
Ghi chú: Nếu chúng ta đã sử dụng Java và tin rằng nó đơn giản, thì chúng ta cũng sẽ tìm
thấy rằng C# cũng đơn giản. Hầu hết mọi người đều không tin rằng Java là ngôn ngữ đơn
giản. Tuy nhiên, C# thì dễ hơn là Java và C++.
C# là ngôn ngữ hiện đại
Điều gì làm cho một ngôn ngữ hiện đại? Những đặc tính như là xử lý ngoại lệ, thu gom bộ nhớ tự động, những
kiểu dữ liệu mở rộng, và bảo mật mã nguồn là những đặc tính được mong đợi trong một ngôn ngữ hiện đại.
C# chứa tất cả những đặc tính trên. Nếu là người mới học lập trình có thể chúng ta sẽ cảm thấy những đặc
tính trên phức tạp và khó hiểu.
Ghi chú: Con trỏ được tích hợp vào ngôn ngữ C++. Chúng cũng là nguyên nhân gây ra những rắc rối của ngôn
ngữ này. C# loại bỏ những phức tạp và rắc rối phát sinh bởi con trỏ. Trong C#, bộ thu gom bộ nhớ tự động và
kiểu dữ liệu an toàn được tích hợp vào ngôn ngữ, sẽ loại bỏ những vấn đề rắc rối của C++.


C# là ngôn ngữ hướng đối tượng
Những đặc điểm chính của ngôn ngữ hướng đối tượng (Object-oriented language) là sự đóng gói
(encapsulation), sự kế thừa (inheritance), và đa hình (polymorphism). C# hỗ trợ tất Ngôn Ngữ C# cả những
đặc tính trên. Phần hướng đối tượng của C# sẽ được trình bày chi tiết trong một chương riêng ở phần sau.
C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo

Như đã đề cập trước, với ngôn ngữ C# chúng ta chỉ bị giới hạn ở chính bởi bản thân hay là trí tưởng tượng của
chúng ta. Ngôn ngữ này không đặt những ràng buộc lên những việc có thể làm. C# được sử dụng cho nhiều
các dự án khác nhau như là tạo ra ứng dụng xử lý văn bản, ứng dụng đồ họa, bản tính, hay thậm chí những
trình biên dịch cho các ngôn ngữ khác.
C# là ngôn ngữ ít từ khóa
C# là ngôn ngữ sử dụng giới hạn những từ khóa. Phần lớn các từ khóa được sử dụng để mô tả thông tin.
Chúng ta có thể nghĩ rằng một ngôn ngữ có nhiều từ khóa thì sẽ mạnh hơn. Điều này không phải sự thật, ít
nhất là trong trường hợp ngôn ngữ C#, chúng ta có thể tìm thấy rằng ngôn ngữ này có thể được sử dụng để
làm bất cứ nhiệm vụ nào.
C# là ngôn ngữ hướng module
Mã nguồn C# có thể được viết trong những phần được gọi là những lớp, những lớp này chứa các phương thức
thành viên của nó. Những lớp và những phương thức có thể được sử dụng lại trong ứng dụng hay các chương
trình khác. Bằng cách truyền các mẫu thông tin đến những lớp hay phương thức chúng ta có thể tạo ra những
mã nguồn dùng lại có hiệu quả.
C# sẽ là một ngôn ngữ phổ biến
Một trong những lý do chính là Microsoft và sự cam kết của .NET Microsoft
Nhiều sản phẩm của công ty này đã chuyển đổi và viết lại bằng C#. Bằng cách sử dụng ngôn ngữ này Microsoft
đã xác nhận khả năng của C# cần thiết cho những người lập trình.
Micorosoft .NET là một lý do khác để đem đến sự thành công của C#. .NET là một sự thay đổi trong cách tạo
và thực thi những ứng dụng.
Ngoài hai lý do trên ngôn ngữ C# cũng sẽ trở nên phổ biến do những đặc tính của ngôn ngữ này được đề cập
trong mục trước như: đơn giản, hướng đối tượng, mạnh mẽ... Ngôn ngữ C# và những ngôn ngữ .NET khác
Microsoft nói rằng C# mang đến sức mạnh của ngôn ngữ C++ với sự dễ dàng của ngôn ngữ Visual Basic. Có thể
nó không dễ như Visual Basic, nhưng với phiên bản Visual Basic.NET (Version 7) thì ngang nhau. Bởi vì chúng
được viết lại từ một nền tảng. Chúng ta có thể viết nhiều chương trình với ít mã nguồn hơn nếu dùng C#. Mặc
dù C# loại bỏ một vài các đặc tính của C++, nhưng bù lại nó tránh được những lỗi mà thường gặp trong ngôn
ngữ C++. Điều này có thể tiết kiệm được hàng giờ hay thậm chí hàng ngày trong việc hoàn tất một chương
trình. Chúng ta sẽ hiểu nhiều về điều này trong các chương của giáo trình.
Một điều quan trọng khác với C++ là mã nguồn C# không đòi hỏi phải có tập tin header. Tất cả mã nguồn được
viết trong khai báo một lớp.

Như đã nói ở bên trên .NET runtime trong C# thực hiện việc thu gom bộ nhớ tự động. Do điều này nên việc sử
dụng con trỏ trong C# ít quan trọng hơn trong C++. Những con trỏ cũng có thể được sử dụng trong C#, khi đó
những đoạn mã nguồn này sẽ được đánh dấu là không an toàn (unsafe code).


1.2: Window Forms
1.2.1: Control
- Control là lớp (class) các thành phần được thêm vào Windows Forms dùng để tương tác giữa người sử dụng
với Windows.
- Có rất nhiều loại control trong Windows Forms như: Label, TextBox, ListBox, ComboBox, Button, …
- Các control sử dụng trên Windows Forms dùng namespace System.Windows.Forms.

1.2.2: Picture Box
PictureBox là một control khá hữu dụng của C# .NET. Nó cung cấp một vùng hình chữ nhật để chèn ảnh bất
kỳ và kích cỡ có thể tùy chỉnh bằng nhiều cách khác nhau.
Picturebox hỗ trợ nhiều định dạng ảnh: BMP, GIF, JPEG, EXIF, PNG và TIFF, ICO... (các định dạng được GDI+ hỗ
trợ)
Thuộc tính:
+ Mage: Cho phép thiết lập ảnh lúc thiết kế hoặc runtime
+ BorderStyle: quy định kiểu khung
None: không có border.
FixedSingle: Một khung đơn.
Fixed3D: Một dung dạng 3D
+ SizeMode:
Normal: hiển thị ảnh như lúc thiết kế.
StretchImage: tự động giãn ảnh cho vừa với không gian hiển thị của khung.
AutoSize: kích thước tự động.
CenterImage: Ảnh được canh giữ
+ Enable: Nếu chọn False thì vô hiệu hóa mọi điều khiển bên trong
+ Visible: ẩn/hiện ảnh

+ Location: tọa độ ảnh
+ Size: kích thước
+ BackColor: ảnh nền
+ PictureBack

1.2.3: Panel
Một phần mềm khi có quá nhiều control thì làm sao để quản lý nhanh các control đó. Hoặc khi có những
"nhóm" các control phục vụ các chức năng liên quan đến nhau, khi cần show, hide chúng đồng loại lại phải gọi
từng control??? Panel đã ra đời để giải quyết vấn đề đó
Panel dùng để tạo nhóm các control. Là một container với dạng một khung đơn giản để chưa các sub-control
(button, textbox, ...) ở trong nó.
Cho phép chứa đựng các điều khiển khác như: Button, RadioButton, Checkbox…
Thuộc tính:
AutoSizeMode: GroupOnly cho phép tự động mở lớn kích thước phù hợp với điều khiển bên trong
Dock: Vị trí của điều khiển trên form
Enable: Nếu chọn False thì vô hiệu hóa mọi điều khiển bên trong
BackColor: màu nền
BorderStyle: Hình thức trình bày của điều khiển
- Các sub-control nằm trong panel sẽ bị ảnh hưởng bởi thuộc tính enable, visible của panel


1.2.4: Sự kiện (Event)
Là các hành động của người dùng, ví dụ như nhấn phím, click, di chuyển chuột, … Các Application cần phản hồi
các sự kiện này khi chúng xuất hiện. Ví dụ, các ngắt (interrupt). Các sự kiện (Event) được sử dụng để giao tiếp
bên trong tiến trình.

Tham số event:
- Sender mang kiểu dữ liệu object dùng chung, tổng quát.
+ Sender chứa một tham chiếu tới control/object đã gây ra event. Chúng ta có thể ép kiểu sender lại trở thành
control/object để xử lý

- MouseEventArgs: Tham số này là nơi hành động thực sự xảy ra, tham số e cũng chứa một đối tượng, nhưng
là kiểu cụ thể của một loại các tham số của mouse event, chứa các dữ liệu của event
- MouseEventArgs sẽ chứa:
+ Clicks: trả về số lần người dùng đã click chuột vào control
+ Button: trả về nút được nhấp (trái, giữa, phải)
+ X, Y: trả về tọa độ con trỏ chuột khi thực thi sự kiện

1.2.5: Message Box
MessageBox Dùng để đưa ra thông báo thông qua phương thức Show: MessageBox.Show("text")
- Thiết lập tiêu đều: MessageBox.Show("text", "title")
- Các button trên MessageBox hỗ trợ sẵn: MessageBoxButtons.<Button_Type>
+ Button Type: AbortRetryIgnore, OK, OKCancel, RetryCancel,YesNo, YesNoCancel.
- Icon của MessageBox: MessageBoxIcon.<Icon_Type>
+ Icon Type: Warning (tam giác vàng có dấu chấm than), Error (hình tròn đỏ có chữ X), Information (hình tròn
xanh lam có chữ i), Question (hình tròn lam có dấu chấm hỏi).
- MessageBox.Show("Hello World", "First CSharp Program", MessageBoxButons.YesNoCancel,
MessageBoxIcon.Question);
- Còn rất nhiều tùy chọn khác (Default button, options, Help button, using the specified Help file,
HelpNavigator, Help topic)

1.2.6: Graphics Graphical Interface (GDI+)
- GDI+ là API(Application Programming Interface) cung cấp các lớp:


+ Tạo đồ họa 2D vector
+ Thao tác trên font
+ Hiển thị ảnh
- Khởi động thư viện đồ họa: using System.Drawing;
-Chọn ngữ cảnh vẽ:
Graphics g = panel.CreateGraphics()

Graphics g = form.CreateGraphics()
*Color: kết hợp 3 giá trị Red, Green, Blue trong dải 0 -> 255
VD: Color.FromArgb(alpha, Color.Blue)
+ alpha là độ trong suốt: 0 -> 255
*Font : có 13 phiên bản constructor. Thông dụng :
Font fa = new Font("Times New Roman", 8);
Font fb = new Font("Arial", 36, FontStyle.Bold);
Font fc = new Font(fb, FontStyle.Bold | FontStyle.Italic);
Font fd = new Font("Arial", 1, GraphicsUnit.Inch);
*Image: Lớp Image hiển thị các ảnh bitmap dạng *.bmp, *.gif, *.jpg, *.ico…
Image img = Image.FromFile("Image1.bmp")
- Đường dẫn thư mục mặc định: [Program Folder]\\bin\\Debug
- Phương thức GrawImage xuất ảnh lên Graphics: g.DrawImage(image, int x, int y, int width, int height)
*Vẽ lại ảnh: Nhận sự kiện Repaint: Private void Form1_Paint(object sender, PaintEventArgs e)
- Màn hình giống như một khung vẽ, Windows không nhớ cái gì bên dưới của nó
=> Do đó khi bạn di chuyển picturebox hay control nào đó ảnh đã vẽ bị hiện tượng "rách"

Chương 2: Trò chơi cờ vua và các thuật toán xử lý
2.1: Giới thiệu trò chơi cờ vua
2.1.1: Lịch sử máy tính trò chơi cờ vua
Tiền thân của cờ vua xuất hiện ở đất nước của nhưng điệu múa bụng nổi tiếng là Ấn Độ, trong thời kỳ của đế
chế Gupta, vào khoảng thế kỷ thứ 6 sau công nguyên. Vào thời đó, người ta gọi trò chơi này là chaturanga –
trò chơi với nhiều loại binh chủng xuất hiện trên bàn cờ gồm bộ binh, kỵ binh, tượng binh và xa binh tương
ứng với các quân cờ hiện đại là chốt, mã, tượng và xe. Ở đất nước Ba Tư khoảng 600 năm sau công nguyên,
tên trò chơi được gọi là chatrang và những luật lệ đã bắt đầu phát triển cao hơn, đặc biệt trong số đó người ta
gọi “Shāh!” khi tấn công vào Vua đối phương, và “Shāh māt!” khi quân Vua đó bị tấn công và không có cách
nào để thoát khỏi. Điểm này tồn tại với cờ vua khi nó được mang đến nhiều vùng đất khác nhau trên thế giới.
Cuộc chinh phục của người Ba Tư đã đưa trò chơi này đến các đất nước Tây Á và tên của trò chơi được sửa lại
đôi chút cho hợp với giọng đọc của người dân trong vùng là shatranj. Sau đó, người Maroc ở vùng Bắc Phi đổi
tên thành shaterej, đọc theo tiếng Tây Ban Nha có thể là acedrez, axedrez hay ajedrez. Khi cờ vua đến với

châu Âu, tùy theo âm điệu giọng nói của từng dân tộc, từng quốc gia mà thành nhiều tên khác nhau như
scacchi (Italy), échecs (Pháp), schack (Thụy Điển)…
Cờ vua đã du nhập đến nhiều vùng miền trên thế giới bởi nhiều con đường khác nhau và cũng từ đó phát triển
mạnh về số người chơi cờ vua. Vì có nhiều người chơi từ nhiều đất nước dân tộc nên nảy sinh ra nhu cầu phải


có luật lệ thống nhất để mọi người có thể giao lưu với nhau dù khác biệt về ngôn ngữ, văn hóa. Các luật lệ
được phát triển mạnh mẽ và sớm hình thành hệ thống ở châu Âu vào cuối thế kỷ 15 của thời Phục Hưng.
Chúng ta cùng điểm qua sự phát triển của các quân cờ qua thời gian và khi đến các vùng đất, dân tộc khác
nhau.
Ở Ấn Độ ngày trước, quân Hậu chỉ có thể đi chéo 1 ô, quân Tượng thì đi chéo 2 ô không hơn không kém và
quân chốt chưa thể đi 2 ô ngay từ đầu. Tuy đã có luật phong cấp nhưng chốt khi ấy cũng chỉ có thể phong
thành Hậu, không thể thành quân cờ khác. Riêng Xe, Tượng, Mã thì không có nhiều thay đổi.
Ở châu Âu, người ta thêm 1 luật cho chốt có khả năng nhảy 2 ô ngay từ vạch xuất phát và cũng từ đó hình
thành nên luật ăn chốt qua đường. Tiếp theo đó, Vua được cho thêm khả năng nhảy 2 ô 1 lần duy nhất trong
ván, đó là tiền đề cho sự hình thành nước nhập thành “nhất cử lưỡng tiện” để Vua được an toàn và Xe ra tấn
công ngay. Hậu đã được phép đi ngang dọc chéo trên bàn cờ, tuy cũng mới chỉ được 2 ô. Tuy nhiên, lại không
cho một quân đang bị ghim được thực hiện nước chiếu.
Qua nhiều cải cách trên thế giới, cờ vua dần được hoàn thiện và đến với mọi người. Luật cờ vua cũng từ đó
mà dần hợp nhất. Thế nhưng, các quân cờ vẫn chưa phát huy hết được sức mạnh của nó, cụ thể là Hậu và
Tượng vẫn còn rất yếu. Điều đó cũng do nguyên nhân, khi cờ vua du nhập châu Âu người ta không có Tượng
binh và khi đó phụ nữ vẫn chưa được xem trọng. Quân Tượng từ Ấn Độ nay biến thành quân cố vấn
(Councilor) và cố vấn cũng chỉ quanh vẩn vua nên sức mạnh quân sự của nó không thể cao như kỵ binh (Mã)
hay xa binh (Xe). Nhưng sau đó, người ta dần nhận ra tầm quan trọng của các quý bà cũng như muốn làm cho
cờ vua càng trở nên hoàn thiện, Hậu và Tượng đã được nâng cao giá trị qua việc biến chúng trở thành quân
tầm xa và đặc biệt là Hậu có thể ngang dọc khắp bàn cờ. Cũng từ đó, việc phong cấp cho chốt càng giá trị hơn
và quân chốt yếu ớt ngày này, nay được người ta xem trọng hơn rất nhiều.
Những câu lạc bộ, tổ chức, trung tâm cờ xuất hiện. Đó là nơi nhiều tay cờ nổi tiếng tụ hội để thi đấu học hỏi
lẫn nhau hay cũng chính là nơi để những người mới biết chơi rèn luyện khả năng tư duy của mình trên bàn cờ.
Nổi tiếng nhất trong số các trung tâm cờ chính là quán cà phê Régence ở Pháp, nơi hai nhà chơi cờ kiệt xuất là

Paul Morphy và Andre Philidor đặt chân đến thi đấu.
Các tổ chức cờ hình thành nhằm mục đích xây dựng các hệ thống thi đấu Quốc gia và Quốc tế, thống nhất làng
cờ thế giới để tìm ra người giỏi nhất. Và hiện này, chúng ta có tổ chức cờ vua thế giới với tên viết tắt là FIDE.
*Sơ lược lịch sử máy tính trong cờ Vua
Chiếc máy đánh cờ đầu tiên:
Năm 1769 kỹ sư người Hungary Baron Wolfgang von Kempelen thiết kế một chiếc máy chơi cờ để làm vui cho
nữ hoàng Áo Maria Theresia. Đây là một cỗ máy cơ khí hoàn toàn, có hình dáng giống như một người Thổ. Tất
nhiên là sức mạnh nổi bật của nó là nhờ một kiện tướng được khéo léo giấu bên trong nó. Chiếc máy này là đồ
giả mạo
Chiếc “máy giấy” của Turing
Một điều đáng kinh ngạc là chương trình chơi cờ đầu tiên được viết trước khi chiếc máy tính đầu tiên được
phát minh. Nó được viết bởi một người nhìn xa trông rộng, biết rằng máy tính có thể lập trình được sắp ra đời
và một khi nó được phát minh ra, nó có thể chơi cờ được.
Người đó là Alan Turing, một trong những nhà toán học lớn của thời kỳ đó. Turing đứng đầu nhóm phá mã bí
mật “Enigma” của Đức, có ảnh hưởng lớn đến kết cục của chiến tranh thế giới lần thứ 2. Ông rất thích chơi cờ
nhưng mặc dù rất cực kỳ thông minh và giành rất nhiều công sức để học cờ nhưng ông vẫn chỉ là một người
chơi tương đối yếu. Sau chiến tranh, ông viết những lệnh hướng dẫn để máy tính có thể chơi cờ được. Vào
thời điểm đó chưa có chiếc máy tính nào có thể chạy được các lệnh nên chính ông thực hiện các lệnh đó,


đóng vai bộ xử lý trung tâm và cần khoảng nửa tiếng cho một nước đi. Một ván cờ được ghi lại, trong đó chiếc
“paper machine” của Turing thua một đồng nghiệp.
Đây là ván cờ lịch sử: Turing’s paper machine – Alick Glennie, Manchester 1952: 1.e4 e5 2.Nc3 Nf6 3.d4 Bb4
4.Nf3 d6 5.Bd2 Nc6 6.d5 Nd4 7.h4 Bg4 8.a4 Nxf3+ 9.gxf3 Bh5 10.Bb5+ c6 11.dxc6 0-0 12.cxb7 Rb8 13.Ba6 Qa5
14.Qe2 Nd7 15.Rg1 Nc5 16.Rg5 Bg6 17.Bb5 Nxb7 18.0-0-0 Nc5 19.Bc6 Rfc8 20.Bd5 Bxc3 21.Bxc3 Qxa4 22.Kd2?
[22.h5 would have trapped the bishop] 22…Ne6 23.Rg4 Nd4? [23...Rxb2! 24.Bxb2 Rxc2+] 24.Qd3 Nb5 25.Bb3
Qa6 26.Bc4 Bh5 27.Rg3 Qa4 28.Bxb5 Qxb5 29.Qxd6 Rd8 0-1.
Chiến lược của Shanon
Cũng vào cùng thời với Turing, một nhà toán học lớn khác, Claude Shanon của Bell Laboratorié cũng nghĩ tới
việc dạy máy tính chơi cờ. Ông nhận ra rằng vấn đề là ở chỗ có quá nhiều khả năng tiếp diễn sau một nước đi.

Do đó ông phân biệt giữa “chiến lược A”, tìm kiếm tất cả những nước tiếp theo, và “chiến lược B”, bỏ những
đường không cần thiết. Ngày nay chúng ta phân biệt các chương trình theo loại “cục súc” (brute force) hay
“lựa chọn” mặc dù tất cả các chương trình mạnh đều ít nhiều thuộc về loại “cục súc”.
Cờ thay vì bom nguyên tử
Trong những năm chiến tranh, Mĩ xây dựng một phòng thí nghiệm khổng lồ ở Los Alamos trong sa mạc của
bang New Mexico. Mục đích của nó là nghiên cứu chế tạo bom nguyên tử. Để tìm ra dạng cấu tạo của phần
kích nổ để có thể tạo thành phản ứng dây chuyền đòi hỏi rất nhiều tính toán.
Năm 1946, nhà toán học Hungary/Mỹ John von Neumann được giao nhiệm vụ thiết kế một chiếc máy tính để
thực hiện công việc này nhanh hơn. Năm 1950, một chiếc máy khổng lồ được goi là MANIAC I được chế tạo.
Nó có hàng nghìn bóng chân không và công tắc và có thể thực hiện 10000 lệnh trong một giây. Nó cũng có thể
được lập trình.
Thay vì ngay lập tức bắt tay vào việc chế tạo bom, các nhà khoa học bắt đầu thí nghiệm với chiếc máy. Một
trong những điều đầu tiên họ làm là viết một chương trình chơi cờ. Nó chơi trên một bàn cờ thu nhỏ 6×6 và
không có Tượng. Mặc dù vậy chương trình này vẫn cần 12 phút để tìm kiếm trước 4 ply (ply là nửa nước đi, ví
dụ e4 hay …d5; 1.e4 e5 là một nước đi) (với Tượng trên bàn cờ nó sẽ cần khoảng 3 tiếng).
Chương trình này chơi ba ván cờ trong những năm 50. Ván đầu tiên thi đấu với chính nó (Trắng thắng), ván
thứ hai với một người chơi hay, chấp nó một hậu. Ván cờ kéo dài 10 tiếng và người thắng. Cuối cùng nó chơi
với một phụ nữ trẻ, mới học chơi cờ tuần trước. Chương trình thắng trong vòng 23 nước. Đó là lần đầu tiên
con người thua một chiếc máy tính trong một trò chơi trí tuệ.
Đây là ván cờ lịch sử thứ hai (bàn cờ 6×6, không tượng, tốt không được phép đi hai ô trong nước đầu tiên,
không được nhập thành)
MANIAC 1 – Human, Los Alamos 1956: 1.d3 b4 2.Nf3 d4 3.b3 e4 4.Ne1 a4 5.bxa4? [5.Nd2 and 6.Nd2-c4+
Nbcxc4 7.b3xc4 with a good game] 5…Nxa4 6.Kd2? Nc3 7.Nxc3 bxc3+ 8.Kd1 f4 9.a3 Rb6 10.a4 Ra6 11.a5 Kd5
12.Qa3 Qb5 13.Qa2+ Ke5 14.Rb1 Rxa5 15.Rxb5 Rxa2 16.Rb1 [to prevent 16...Ra1 mate!] 16…Ra5 17.f3 Ra4
18.fxe4 c4 19.Nf3+ Kd6 20.e5+ Kd5 21.exf6Q Nc5 22.Qf6xd4+ Kc6 23.Nf3-e5 mate.
Cờ và toán học
Vấn đề chính với các chương trình chơi cờ là số lượng lớn các nước phải tính toán. Một ví trí trung bình sẽ có
40 nươc đi hợp lệ. Nếu bạn tính tất cả các nước đi đối phương trả lời bạn sẽ có 40×40 = 1600 vị trí. Điều này
có nghĩa là sau hai ply, được coi là một nước đi trong cờ Vua, 16000 vị trí có thể xảy ra. Sau hai nước nó là 2.5
triệu vị trí và sau ba nước là 4.1 tỷ. Trung bình một ván cờ kéo dài khoảng 40 nước. Số vị trí cần tính là khoảng

10 mũ 128, lớn hơn cả số nguyên tử có trong vũ trụ (chỉ khoảng 10 mũ 80)


Một điều dễ nhận thấy là không có chiếc máy tính hay loại máy nào có thể chơi cờ bằng cách tìm ra tất cả các
khả năng. Nhưng con người cũng không phải là hoàn hảo. Câu hỏi là máy cần tìm kiếm tới độ sâu nào (trước
bao nhiêu nước) để có thể đối chọi được với khả năng chiến lược của con người. Những chiếc máy tính thời
đầu có thể tạo và đánh giá khoảng 500 vị trí trong một giây hay 90000 vị trí trong ba phút, thời gian bạn có để
đi một nước trong các cuộc thi đấu. Điều này có nghĩa là nó chỉ có thể tìm kiếm trước 3 ply (một nước đi rưỡi).
Điều này có nghĩa là nó chơi rất kém – chỉ ngang một người mới tập chơi. Để tìm kiếm sâu hơn nữa nó cần giải
quyết được 15000 vị trí trong một giây, nhanh hơn gấp 30 lần. Nhưng tính toán trước 4 ply cũng chưa đủ sâu.
Do đó máy tính dường như không bao giờ có thể chơi ở trình độ kiện tướng trong cờ Vua.
Alpha-beta
Bước nhẩy vọt đầu tiên là năm 1958 khi ba nhà khoa học của đại học Carnegie-Mellon University tại
Pittsburgh (Newell, Shaw và Simon) tìm ra một phát hiện quan trọng. Bạn có thể bỏ một phần lớn của cây tìm
kiếm mà không ảnh hưởng tới kết quả. Họ gọi đó là thuật toán alpha-beta. Một điểm cần nhớ là đây là một kỹ
thuật toán học thuần tuý.
Đây là sơ lược thuật toán alpha-beta trong cờ Vua: giả sử máy tính đã kết thúc ước lượng một nước đi và bắt
đầu tính toán nước thứ hai. Ngay khi có một đường chứng tỏ nó sẽ có giá trị thấp hơn nước đầu tiên chúng ta
có thể bỏ đường tìm kiếm này. Chúng ta không cần biết chính xác là nước đi thứ hai tệ hơn bao nhiêu so với
nước đi đầu tiên nhưng chắc chắn là chúng ta muốn nước đi đầu tiên hơn.
Thuật toán alpha-beta có kết quả giống như một tìm kiếm đầy đủ trong khi chỉ phải đi qua căn bậc hai số vị trí
mà tìm kiếm đầy đủ cần. Đột nhiên những chiếc máy tính thời đầu có thể tìm kiếm trước 5 hoặc 6 ply. Vào
thập kỷ 70, chiếc máy tính nhanh nhất (CDC Cyber series) có thể tìm trước tới 7 ply và đạt được khả năng chơi
đáng nể. Nhưng kể cả với alpha-beta, bạn vẫn cần tốc độ gấp 5 lần để có thể tìm thêm một ply nữa. Số mũ của
số phải tìm kiếm một lần nữa đuổi kịp các nhà lập trình.
Chiếc máy Belle
Ken Thompson là một nhà khoa học không thể chờ đợi những chiếc siêu máy tính giá hàng triệu đô trở nên 5
hay 25 lần nhanh hơn để có thể chơi cờ tốt hơn. Ông và một đồng nghiệp ở Bell Laboratories quyết định chế
tạo một chiếc máy chỉ chuyên để chơi cờ, sử dụng hàng trăm con chip và giá khoảng 20 nghìn đô la.
Họ gọi chiếc máy đó là “Belle” và nó chỉ có thể chơi cờ. Nhưng nó có thể tìm kiếm tới 180 nghìn vị trí trong

một giây (siêu máy tính vào thời đó chỉ có thể tìm được 5000 vị trí) Belle có thể tìm trước 8 hay 9 ply trong các
cuộc thi đấu, giúp nó có thể được chơi trong hàng kiện tướng. Nó thắng giải vô địch thế giới máy tính chơi cờ
đầu tiên và tất cả những giải đấu khác từ 1980 đến 1983 cho đến khi nó bị chiếc máy khổng lồ Cray X-MPs, đắt
hơn nó một nghìn lần, qua mặt.
Những con chip để chơi cờ
Vào giữa những năm 80, giáo sư Hans Berliner, một nhà khoa học máy điện toán ở đại học Carnegie-Mellon
tiếp tục công việc của Ken Thompson. Berliner, đã từng là phóng viên báo chỉ ở giải vô địch cờ vua thế giới,
chế tạo một chiếc máy tính có phần cứng đặc biệt để chơi cờ, gọi là HiTech. Ông và sinh viên Carl Ebeling chế
tạo một con chip để tính các nước đi. Với 64 chip chạy song song, HiTech suýt nữa đạt được danh hiệu vô địch
máy tính đánh cờ vua thế giới vào năm 1986 (một chiếc Cray thắng giải này).
Sau đó các sinh viên của Berliner như Feng-hsiung Hsu, Murray Campbell và những người khác tự phát triển
một chiếc máy tính khác, được gọi là ChipTest và sau đó Deep Thought. Giá của nó khoảng 5000 đô la và có
thể tính toán được 500 000 vị trí trong một giây. Sau đó Hsu và Campbell cắt đứt với các thầy và gia nhậm
IBM. Cùng vời Joe Hoane họ chế tạo ra Deep Blue.


Deep Blue
Garry Kasparov thi đấu với Deep blue tại Philadelphia và New York. Nó gồm có một máy chủ IBM SP/2 với một
số lớn các con chip đặc biệt để tính toán nhanh. Mỗi con chip có thể xử lý hai đến ba triệu vị trí một giây. Với
việc sử dụng hơn 200 con chip này, tốc độ tổng cộng của chương trình có thể tăng lên tới 200 triệu vị trí trong
một giây.
Độ sâu tìm kiếm và khả năng chơi cờ
Xử lý 200 triệu vị trí trong một giây có nghĩa gì với một chiếc máy tính đánh cờ ? Ken Thompson, cha đẻ của
Belle (cũng như Unix và ngôn ngữ lập trình C) tiến hành một số thí nghiệm thú vị trong những năm 80 cho
thấy tương quan giữa độ sâu tìm kiếm và khả năng chơi cờ.
Thompson chơi Belle với chính nó với một bên được tính toán sâu hơn. Trung bình tính trước được thêm một
ply ngang bằng với khoảng 200 điểm ELO. Với 4 ply Belle ở khoảng 1230 và với 9 ply nó đạt tới 2328 điểm ELO.
Bằng cách tiếp tục tăng độ sâu tìm kiếm (càng về sau ELO càng tăng chậm) ta có thể kết luận là cần tính trước
được 14 ply để có thể đạt đến trình độ vô địch thế giới (2800)
Kết luận của các chuyên gia: bạn cần chế tạo một chiếc máy tính có thể xử lý một tỷ vị trí trong một giây (và

tính trước 14 ply) nếu bạn muốn thách đấu với nhà vô địch cờ vua thế giới. Deep Blue đã tiến khá gần, nhưng
chưa đạt tới điểm này.
Những chiếc máy nhỏ bé
Tất nhiên là chất lượng lập trình cũng có vị trí rất quan trọng. Những chương trình chơi cờ trên PC ngày này
như Fritz hay Junior có thể xử lý 5 triệu hoặc hơn vị trí trong một giây. Chúng đều đạt đến sức mạnh khoảng
2700 ELO và là đối thủ cho bất kỳ ai trong nhóm 100 kỳ thủ đứng đầu thế giới. Trong cờ nhanh chỉ có khoảng
10 kỳ thủ đứng đầu có thể cạnh tranh với nó và nếu chơi blitz có lẽ chỉ hai hoặc ba người có thể sống sót.
Tấn công trên cả hai mặt trận
Một trong những điểm quan trọng trong sức mạnh của máy tính là nó có khả năng chơi theo các sách khai
cuộc. Những kiến thức và kinh nghiệm qua bao đời của các kiện tướng có thể dễ dàng được lưu trữ trên đĩa
cứng và máy tính có thể truy cập nó trong khi chơi khai cuộc. Ngay cả những chương trình trên PC cũng biết
khoảng 10 triệu vị trí khai cuộc và có thể truy cập đầy đủ thống kê về chúng (những nước nào đã được đi, kết
quả như thế nào, thứ hạng của người chơi v.v…). Thường thì máy tính sẽ chơi mười lăm hoặc hai mươi nước
trước khi nó phải tính toán nước đầu tiên. Nếu không có được lợi thế từ kiến thức của con người trong khai
cuộc, máy tính sẽ yếu đi nhiều
Máy tính không chỉ có lợi từ khối lượng kiến thức khổng lồ trong khai cuộc từ lịch sử cờ Vua mà nó còn có lợi
thế từ những nghiên cứu về cờ tàn.

Cơ sở dữ liệu cờ tàn
Một lần nữa chúng ta lại gặp lại Ken Thompson, người tiên phong trong lĩnh vực này. Trong những năm 80,
ông bắt đầu tạo và ghi lại tất cả những vị trí tàn cuộc với bốn và năm quân trên bàn cờ. Một thế cờ tàn cuộc
bình thường với 5 quân, ví dụ như một Vua với hai Tượng và một Vua với một Mã, sẽ có khoảng 121 triệu vị
trí. Với một con tốt, do nó đi không đều (nước đầu tiên có thể đi hai ô), số vị trí tăng lên 335 triệu. Thompson
viết một chương trình tính toán tất cả các vị trí hợp lệ và tìm ra tất cả các đường bắt buộc dẫn trong mỗi tàn
cuộc. Ông cũng nén dữ liệu và có thể lưu trữ khoảng 20 loại tàn cuộc trong một đĩa CD-ROM chuẩn.


Sử dụng cơ sở dữ liệu này, máy tính sẽ chơi mỗi tàn cuộc với độ chính xác tuyệt đối (“như là chúa trời”). Cho
bất kỳ thế tàn cuộc nào, nó biết ngay lập tức đó là một trận thắng, hoà hay thua và trong bao nhiêu nước.
Thường thì nó sẽ thông báo chiến thắng hay chiếu hết trước khoảng 50 nước. Khi ở bên thua nó sẽ chơi theo

đường tốt nhất. Deep Blue sử dụng cơ sở dữ liệu tàn cuộc của Thompson và ngay cả chương trình cho PC Fritz
bây giờ cũng sử dụng nó trong cây tìm kiếm của mình. Điều này sẽ ảnh hưởng đến sức mạnh của nó như thế
nào sẽ cần thời gian để trả lời.
Một số tàn cuộc với 5 quân nổi tiếng là khó hoặc không thể cho con người có thể làm chủ. Một ví dụ điển hình
là Hậu chống lại Hậu và Tốt, trong trường hợp này con người không có cơ hội nào có thể thắng được máy tính.
Nhưng những tàn cuộc với 5 quân chỉ là tic-tac-toe (một trò chơi rất đơn giản) so với những tàn cuộc với 6
quân mà Thompson đang tạo ra. Trong một số tàn cuộc với 6 quân, bạn cần đi chính xác 200 nước đi để có thể
dành chiến thắng. Thường thì ngay cả những kỳ thủ mạnh nhất trên thế giới cũng không thể biết được mình
đã tiến đến đâu sau 100 nước đi mà máy tính nói với chúng ta là bắt buộc. Sự phát triển về công nghệ phần
cứng cũng làm tăng lợi thế của máy tinhs. Các thế tàn cuộc với 6 quân của Thompson, với 8 đến 20 tỷ vị trí mỗi
loại, có thể được nén và lưu trữ trên một chiếc DVD.
May mắn thay tàn cuộc với 7 quân, gồm khoảng 500 nghìn tỷ vị trí cho mỗi loại, vẫn là một tương lai xa. Và
may mắn hơn nữa là hai đầu – nghiên cứu khai cuộc và cơ sở dữ liệu về tàn cuộc – sẽ không bao giờ gặp nhau.
Có lẽ bạn sẽ không bao giờ thấy máy tính đi 1.e4 và thông báo sẽ chiếu hết ở nước thứ 40. Nhưng hầu như chỉ
còn là vấn đề thời gian, vài năm hay một thập kỷ, trước khi máy tính có thể liên tục đánh bại nhà vô địch cờ
Vua thế giới.

2.1.2: Mô tả trò chơi cờ vua
- Cờ vua là trò chơi trí tuệ đánh theo lượt, chia làm 2 quân: trắng và đen
- Bàn cờ: 64 ô vuông trắng, đen luân phiên
- Mỗi quân đều có : 2 xe, 2 mã, 2 tịnh, 1 hậu, 1 tướng, 8 tốt
- Rule: Hậu trắng bên trắng, hậu đen bên đen

- Trừ Knight ra, tất cả các quân đều không được đi xuyên
*Pawn: đi thẳng ăn chéo, không được lùi
- Ngoài ra khi tốt xuống tới ô cuối cùng thì ngay lập tức được thăng cấp thành các quân khác trừ vua


*Knight: đi hình chữ L, là quân cờ duy nhất có thể đi xuyên


*Rook: đi thẳng ăn thẳng

*Bishop: Đi chéo ăn chéo

*King: đi và ăn xung quanh 1 ô


- Ngoài ra King có thể nhập thành với Rook với điều kiện King và Rook chưa di chuyển
+ Đây là nước duy nhất vua có thể đi 2 ô
+ Chỉ được nhập thành một lần duy nhất trong ván cờ
+ Vua đã bị chiếu nhưng chưa di chuyển vẫn có thể nhập thành
- Không được nhập thành nếu gặp vào 1 trong 3 trường hợp sau:
+ Vua đang bị chiếu
+ Trên đường di chuyển của vua bị quân địch tấn công
+ Đường đi từ King tới Rook không được giải tỏa (có quân chặn)

*Queen: đi được như Rook và Bishop

Checkmate : chiếu vua
- Thông báo chiếu vua là không bắt buộc
- Khi vua bị chiếu thì phải tìm nước tránh chiếu:
+ Di chuyển vua sang ô khác
+ Lấy quân khác chặn
+ Ăn quân đang chiếu
Thắng: Nếu quân ta chiếu vua và vua không tìm được nước nào tránh chiếu
Thua: Nếu vua ta bị chiếu và không tìm được cách nào tránh chiếu


Hòa khi một bên không còn quân và thỏa mãn 2 điều kiện:
+ Một bên quân kiểm soát hết các nước di chuyển vua đối phương nhưng không chiếu vua đối phương

+ Đối phương không còn quân nào để di chuyển

2.2: Các thuật toán xử lý
2.2.1: Thuật toán Minimax
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 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òcchơ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.
- Xét trạng thái hiện tại (trạng thái trên cùng)
+ Minimax: có thể gọi là quét hết các trạng thái có thể có và tìm trạng thái có lợi nhất
- Cắt tỉa alphabeta :
+ Một nhược điểm của minimax phải quét toàn bộ các trạng thái
+ Trạng thái trên cùng chỉ là một nhánh của toàn bộ trạng thái
+ Nếu phải xét toàn bộ trạng thái để xét được nước đi tối ưu nhất mất rất nhiều thời gian
+ Đối với cờ vua có 64 ô cờ thì điều này là không thể
+ Tuy nhiên con người cũng không phải là hoàn hảo
+ Do đó chỉ cần tính toán tới độ sâu nhất định nào đó là có thể đánh được

*Phân tích : Trạng thái hiện tại của trò chơi là trạng thái U và đến lượt quân x đi trước
*TH1 : x là computer


- Thuật toán minimax xét toàn bộ trạng thái tiếp diễn ra KẾT QUẢ và chọn kết quả thuận lợi nhất
- Sau khi xét toàn bộ trạng thái tiếp diễn, computer nhận thấy kết quả sẽ là win nếu đi trạng thái B1 hoặc B2 (full trạng
thái – 2 trạng thái), do đó computer sẽ đánh x tại trạng thái B

*TH2: o là computer và bạn là người chơi không giỏi
- You (X) : trạng thái A
- Computer (0) : trạng thái A1
+ xét các trạng thái tiếp diễn, computer nhận thấy không thể thắng được bạn, do đó computer sẽ chọn kết quả thuận lợi
nhất cho mình, đó là A1
TH3 : o là computer và bạn là người chơi bình thường
- You(X) : trạng thái B
- Commputer(0) : random(B1, B2)
+ computer nhận thấy cả 2 trạng thái đều không có lợi cho mình, nên thực hiện random

Ưu điểm
Tìm kiếm được mọi nước đi tiếp theo sau đó lựa chọn random nước đi tốt nhất, vì giải thuật có tính chất vét
cạn nên không bỏ sót trạng thái.
Khuyết điểm
Đối với các trò chơi có không gian trạng thái lớn như caro, cờ tướng… việc chỉ áp dụng giải thuật Minimax có
lẽ không còn hiệu quả nữa sự bùng nổ tổ hợp quá lớn.
Giải thuật áp dụng nguyên lý vét cạn không tận dụng được thông tin của trạng thái hiện tại để lựa chọn nước
đi, vì duyệt hết các trạng thái nên tốn thời gian.

2.2.2: Thuật toán cắt cụt alpha-beta
- Theo thuật toán minimax:


+ Đỉnh max sẽ nhận giá trị lớn nhất
+ Đỉnh min sẽ nhận giá trị nhỏ nhất
- Tại đỉnh c muốn chọn giá trị lớn nhất phải thực hiện so sánh u với b
+ Việc kiểm tra a là thừa nếu u > v
+ Đỉnh b nhận giá trị nhỏ nhất : Giả sử v > a => b nhận giá trị v là sai
+ Nhưng nếu u > v thì giá trị của c là đúng
- Ta không cần quan tâm các giá trị bắt buộc phải đúng, mà chỉ cần quan tâm giá trị cuối cùng đúng

=> Không cần quan tâm tới a nếu u > v

Chương 3: Ứng dụng CSharp trong lập trình trò chơi cờ vua
3.1: Phân tích bài toán
*Các chức năng cơ bản:
- Di chuyển các quân cờ (kéo thả)
- Chỉ ra các nước có thể đi của quân cờ đó
- Kiểm tra tính hợp lệ khi di chuyển
- Hightlight tấn công quân khác
- Lưu lại trạng thái di chuyển cuối cùng
- Hiển thị các quân đã giết được của 2 bên
- Thông báo chiếu vua
- Khống chế nước di chuyển của vua (vua chỉ có thể đi vào ô an toàn)
- Phong cấp cho Pawn
- Nhập thành
- xác định thắng, thua, hòa (chưa xác định được hoàn toàn trạng thái thắng)
*Phi chức năng: Không cho phép kéo thả ngoài khu vực bàn cờ
*Hạn chế:
- Chưa xây dựng được AI (chế độ người đánh với máy)
- Chưa xây dựng được hoàn toàn theo hướng đối tượng
- Chưa tìm được cách xử lý màu của quân đã ăn
+ Do ảnh di chuyển, quân di chuyển đều cùng một chỉ số mảng
+ Nếu xóa ảnh và quân đã bị ăn sẽ ảnh hưởng tới mảng, ảnh hưởng tới vua, xe và nhiều thứ liên quan
- Ô cờ sử dụng paint nên bắt buộc phải repaint lại, do đó ô cờ có đôi khi bị lỗ hổng
- Chưa tìm được cách tạo quân cờ không có khung
+ Nếu cố tình Draw và Clear quân cờ sẽ dẫn tới tình trạng quân cờ bị nhấp nháy
+ Có thể tạo được quân cờ bằng Draw nhưng chưa thể tùy ý kéo thả (tức là chỉ có thể kéo thả theo ô). Clear
theo một ô sẽ dễ hơn là Clear 1 vùng các ô nhưng tạo sự cứng ngắc cho game
*Hướng phát triển:
- Nếu có thời gian em sẽ xây dựng lại ô cờ bằng picturebox



+ Không phải repaint lại tạo sự mượt mà cho game
+ Xử lý nhanh do không phải chạy lại hàm tạo bàn cờ
- Tự động nạp quân cờ (không nạp vào một cách trực tiếp - hiển thị ở phần design => có thể xóa được)
- Cố gắng phân tích thật kỹ trước khi bắt tay vào thực hành
- Hoàn thiện phần AI chưa làm xong
- Tìm phương pháp chỉnh color cho quân đã ăn
- Tìm phương pháp nạp quân cờ không có khung mà không bị nhấp nháy
- Thêm phần resize chương trình
- Cải thiện đồ họa tốt hơn

3.2: Xây dựng các tính năng trong game
*Di chuyển các quân cờ: không nên tạo các sự kiện cho từng quân cờ: 32 mouse down, 32 mouse move, 32 mouse up
- Chỉ cần tạo 3 sự kiện chính: Form_MouseDown, Form_MouseMove, Form_MouseUp và sự kiện Form_Paint
- Enable = false cho tất cả các quân cờ
- Tạo 1 bản đồ các quân cờ, mỗi quân ứng với một giá trị:
+ White: 1 -> 16
+ Dark: -1 -> -16
Tọa độ này được sử dụng để thiết lập các quân cờ từ 0 -> 15 và danh sách List<PistureBox> từ 0 -> 15
- Game bắt đầu với sự di chuyển của quân White:
- Khi nhấp chuột (mouse down) vào một quân bất kỳ trên bàn cờ
+ Đổi color quân cờ vừa chọn
+ Hightlight ô cờ vừa nhấp chuột theo tọa độ của Form (tọa độ cơ bản 1 -> 7, tọa độ thực nhân với edge)
+ Kiểm tra lượt có thỏa mãn, nếu thỏa, dựa vào bản đồ quân cờ xác định đó là quân cờ nào
+ Thực hiện tính toán các nước di chuyển hợp lệ của một quân cờ trong một mảng di chuyển
+ Duyệt mảng di chuyển để hight light các nước đi của quân cờ
+ Xét điểm di chuyển (dựa vào bản đồ map đã xây dựng) nếu gặp quân địch thì đổi color quân địch
- Khi di chuyển quân cờ (mouse move):
+ Lọc các trường hợp di chuyển và khống chế không cho phép di chuyển qua bàn cờ

+ Tính toán di chuyển Left, Top quân cờ dựa theo Form
- Khi nhả chuột (mouse up):
+ Nếu tọa độ nhả chuột không nằm trong tọa độ mảng di chuyển:
+ Hủy di chuyển (trả về tọa độ mouse down)
+ Cập nhật lại color của quân cờ vừa bị tấn công về default
+ Cập nhật lại color của quân cờ vừa di chuyển về default nếu đó không phải là quân di chuyển cuối cùng
+ Nếu tọa độ nhả chuột nằm trong tọa độ mảng di chuyển:
+ Nhận tọa độ mouse up
+ Cập nhật lại bản đồ (điểm tại mouse down = 0, điểm tại mouse up = selected)
+ Nếu tọa độ nhả chuột ăn quân địch:
+ Đưa giá trị pInit = -1 (hủy tọa độ di chuyển)
+ Xóa tọa độ tại bản đồ (cập nhật = 0)
+ Đưa quân địch vào danh sách các quân chết
+ Hiển thị quân vừa ăn ở ngoài bàn cờ
+ Hightlight nước di chuyển cuối cùng (mouse down) theo bên

*Thông báo chiếu vua:


- Khi mousedown (nhấp) mới thực hiện tính toán đường di chuyển, do đó khi mouse up (nhả) sẽ không thể xác
định được quân vua có bị chiếu hay không
- Đồng thời cũng không thể nhận biết được dấu hiệu nào từ MouseDown cho biết là đã chiếu
- Do đó nếu mouse up thành công (di chuyển hợp lệ):
+ Mặc định cho checkmate = false
+ Thực hiện thực hiện tính ngầm lại một lần nữa kiểm tra xem vua có bị chiếu không, nếu có checkmate = true
+ Nếu nhận được dấu hiệu vua bị chiếu, hiển thị thông báo
- Ngay sau khi vua bị chiếu:
+ Khi click vào 1 quân bất kỳ nếu đó không phải là vua
+ Nếu quân đó không ăn được quân đang chiếu
+ Tạo 1 bức tường giả với các ô == 0, thay bằng một giá trị nào đó khác giá trị trên bàn cờ, giả dụ 100

+ Thực hiện ngầm định chiếu lại một lần nữa bằng quân vừa chiếu vua
+ Nếu thực hiện chiếu lại thành công, tức là bức tường giả không ngăn được chiếu vua
+ Phá bức tường giả (update lại bản đồ, các giá trị 100 thay bằng 0)
+ select = 0 , return mouse down (không chọn được quân này)
+ Nếu thực hiện chiếu không thành công (bức tường giả ngăn được chiếu vua)
+ phá bức tường giả
+ Thực hiện cho phép di chuyển quân này
- Bức tường giả có 1 nhược điểm: Chỉ có thể xác định được quân nào được phép đi, chưa xác định được giao
điểm để tránh chiếu. Nói cách khác có thể xác định quân nào được phép đi nhưng chưa thể khống chế quân
đó phải đi vào nước chặn chiếu
- Để xác định được ô nào có thể chặn chiếu, phải xác định được mảng di chuyển từ quân chiếu tới vua, sau đó
hủy hết mảng di chuyển của quân có thể chặn chiếu, chỉ để lại nước có thể chặn chiếu
- Nếu làm theo phương pháp này thì không cần xây dựng bức tường giả, đó là ngõ cụt mà em đã đâm đầu vào
khi chỉ mới xác định một nửa là tìm cách nào đó xác định quân chặn chiếu trước, sau đó tìm cách xét điểm
chặn chiếu sau
*Khống chế nước di chuyển của vua (vua chỉ có thể đi vào ô an toàn):
- Ở đây em sử dụng phương pháp kiểm tra một ô có bị tấn công hay không bằng phương pháp tạo quân ảo
+ Xét các nước di chuyển của vua và hủy đi các nước không hợp lệ (bị quân khác chắn, ngoài bàn cờ)
+ Đưa mảng di chuyển hợp lệ của vua vào phương thức quân ảo:
+ Tạo 1 quân ảo: King, Pawn, Knight, Castle, Bishop
+ Riêng King là vẽ đường di chuyển, không tạo qua lớp King
+ Kiểm tra xem các nước di chuyển của quân ảo có tìm thấy một quân đối phương cùng skill không
(VD: Castle sẽ tìm thấy quân Castle của địch)
+ Nếu tìm được quân đối phương cùng skill => Hủy điểm di chuyển
- Phương thức tạo quân ảo có 1 điểm mù:
+ Nếu bên phải có 1 quân Castle đang chiếu, nước di chuyển bên phải bị hủy
+ Nhưng Castle là quân ăn theo đường thẳng, do đó đáng lẽ ra điểm di chuyển bên trái cũng phải hủy
+ Phương pháp tạo quân ảo sẽ không thể nào tìm thấy một quân xe ở bên phải (do bị King chắn)
+ Do vậy điểm di chuyển bên trái không bị hủy (điểm mù)
- Khắc phục: + Lưu lại giá trị King, xóa tọa độ King trong bản đồ = 0

+ Do đó điểm bên trái sẽ quét được quân Castle bên phải (do King = 0 không chặn)
+ Hủy điểm di chuyển nếu tìm được 1 quân cùng skill
+ Sau khi hoàn thành, cập nhật lại giá trị của King trong bản đồ
- Phương pháp tạo quân ảo có 1 điểm lợi: Có thể xác định được có quân nào yểm trợ không
+ Giả sử quân hậu đang tấn công vua, và hậu được mã yểm trợ


+ Do dùng tạo quân ảo tại điểm quân Hậu nên không tìm được quân hậu nào => King có thể ăn Hậu
+ Nhưng mà tại điểm quân hậu khi giả tưởng gặp quân Mã, đó là lý do nước đi ăn Hậu bị hủy bỏ hay nói cách
khác không thể ăn quân nếu có quân hỗ trợ => King tuyệt đối an toàn
*Phong cấp cho Pawn
- Khi Pawn xuống tới ô cuối cùng, nhận tín hiệu dừng MouseDown
- Hiển thị Panel các quân phong cấp: Castle, Knight, Bishop, Queen
- Do bị tín hiệu stopMouseDown khống chế, không thể làm được gì khác ngoài việc phong quân
- Nhấn vào quân phong, cập nhật tín hiệu phong cho Pawn
+ Đổi picture cho Pawn theo quân đã phong
+ Nhận được tín hiệu phong cấp, xét các điểm di chuyển theo quân vừa phong cấp
* Nhập thành
- Xác định quân chọn có phải vua không?
- Kiểm tra xem có quân nào chặn không? (Nếu tọa độ di chuyển của vua bằng tọa độ hiện thời của 1 quân nào
đó (điểm khác 0 trên bản đồ)) => Có quân chặn
- Nếu đường di chuyển từ vua tới Castle thông thoáng, kiểm tra xem vua đã di chuyển chưa, quân Castle tham
gia nhập thành đã di chuyển chưa
- Nếu chưa thì kiểm tra xem vua có bị chiếu không?
- Nếu không duyệt trên đường di chuyển bằng phương thức tạo quân ảo để xác định xem 2 điểm di chuyển
trên đường từ vua tới xe có bị quân nào khống chế không?
- Từ đó xác định được có được phép nhập thành hay không?
*Xác định Hòa:
- Nếu một bên không còn nước hợp lệ để đi thì hòa
- Phải lắng nghe động thái từ King liên tục

+ Nếu King không còn nước di chuyển, lập tức phải duyệt xem còn nước di chuyển nào hợp lệ không
*Xác định Thắng - Thua:
-Đơn giản: Nếu trên bàn cờ có 1 quân duy nhất (King), King đang bị khống chế tất cả các nước di chuyển và
King đang bị chiếu => Win
- Nâng cao: Khi King bị chiếu
+ Kiểm tra xem King có di chuyển được không
+ Kiểm tra xem có quân nào ăn quân đang chiếu không
+ Kiểm tra xem có quân nào chặn được quân đang chiếu không
-Nếu King không thể di chuyển được
+ Không có quân nào ăn được quân đang chiếu
+ Không có quân nào chặn được quân đang chiếu
=> Thắng
- Không cần xác định thua vì 1 bên thắng tức bên còn lại thua

3.3: Một số hình ảnh demo
- Giao diện Game:


- Di chuyển các quân cờ (kéo thả) – Khống chế không di chuyển ngoài biên

- Chỉ ra các nước có thể đi của quân cờ đó
- Kiểm tra tính hợp lệ khi di chuyển
- Hightlight tấn công quân khác
- Lưu lại trạng thái di chuyển cuối cùng

- Hiển thị các quân đã giết được của 2 bên


- Thông báo chiếu vua


- Khống chế nước di chuyển của vua (vua chỉ có thể đi vào ô an toàn)

- Phong cấp cho Pawn


- Nhập thành

- Không thể nhập thành vì bị quân hậu khống chế


- Khống chế nước di chuyển của các quân khi vua bị chiếu

- Không được phép di chuyển để bị chiếu


×