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.. C# được sử dụng cho nhiều các dự án khác nhau như là tạo ra ứng dụn
Trang 1Chươ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
Trang 2Chươ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
.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
Trang 3- 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:
-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-In-Time (JIT) Kết quả là mã máy được thực thi bởi bộ xử lý của máy
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
Trang 4Trong 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++
Trang 5C# 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)
Trang 61.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
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
Trang 71.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:
Trang 8+ Tạo đồ họa 2D vector
+ Thao tác trên font
+ 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
Trang 9có 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 đó,
Trang 10đó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)
Trang 11Mộ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
Trang 12Deep 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
Trang 13Sử 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