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

CÀI đặt THUẬT TOÁN MINMAX áp DỤNG cài đặt GAME cờ CARO

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 (347.58 KB, 33 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN

-------------o0o------------

BÁO CÁO THỰC TẬP CƠ SỞ
ĐỀ TÀI: CÀI ĐẶT THUẬT TOÁN MINMAX. ÁP DỤNG
CÀI ĐẶT GAME CỜ CARO

SINH VIÊN THỰC HIỆN: PHẠM THỊ LIÊN

Thái Nguyên, tháng 03 năm 2018

1


MỤC LỤC
CHƯƠNG I: Cơ sở lý thuyết – Lựa chọn ngôn ngữ lập trình....................................3
1.1 Giới thiệu về lý thuyết trò chơi và ứng dụng....................................................3
1.2 Tổng quan về ngôn ngữ lập trình C#................................................................4
1.2.1 Giới thiệu chung.........................................................................................4
1.2.3 Tại sao phải sử dụng ngôn ngữ lập trình C#.............................................11
1.3 Tổng quan về winform trong C#.....................................................................14
1.3.1 Tổng quan về winform..............................................................................14
1.3.2 Ví dụ đơn giản và cấu trúc 1 chương trình Winform................................18
CHƯƠNG 2: Cài đặt thuật toán...............................................................................20
2.1 Thuật toán tìm kiếm tốt nhất - đầu tiên...........................................................20
2.2 Mô tả bài toán.................................................................................................22
2.2.1 Giới thiệu game dò mìn............................................................................22
2.2.2 Hướng dẫn chơi........................................................................................22
2.3 Cài đặt thuật toán............................................................................................23


2.3.1 Các bước thực hiện thuật toán..................................................................23
2.3.2 Giao diện chương trình.............................................................................24

2


CHƯƠNG I
CƠ SỞ LÝ THUYẾT – LỰA CHỌN NGÔN NGỮ LẬP TRÌNH
1.1 Giới thiệu về lý thuyết trò chơi và ứng dụng
Theo một số tài liệu thì lần đầu tiên lý thuyết trò chơi xuất hiện trong một lá
thư viết bởi James Waldegrave năm 1713, trong lá thư thì tác giả đưa ra lời giải
chiến thuật hỗn hợp Minimax cho một trò đánh bài 2 người Leher.Tuy nhiên thì Lý
thuyết trò chơi chỉ thực sự tồn tại là một ngành khi John von Neumann xuất bản
mốt loạt các bài báo năm 1828.John von Neumann cũng là người đầu tiên hình
thức hóa Lý thuyết trò chơi trong thời ký trước và trong chiến tranh lạnh, chủ yếu
do áp dụng của nó trong chiến lược quân sự, nổi tiếng là khái niệm đảm bảo phá
hủy lẫn nhau (mutual assured destruction).
Sau nhiều năm phát triển thì hiện nay Lý thuyết trò chơi đã được sử dụng
rộng rãi trong nhiều ngành khác nhau như : Kinh tế và kinh doanh, sinh học, chính
trị học, triết học, khoa học máy tính và logic, viễn thông, một số show game trên
truyền hình …
Trong thời đại Công nghệ thông tin phát triển như hiện nay thì Lý thuyết trò
chơi đóng một vai trò hết sức quan trọng, đặc biệt trong logic và khoa học máy
tính.Một số lý thuyết logic có cơ sở trong ngữ nghĩa trò chơi.Thêm vào đó những
khoa học gia máy tính đã sử dụng trò chơi để mô phỏng những tính toán tương tác
với nhau.
Một số thuật toán trong Lý thuyết trò chơi giúp xây dựng, phát triển những
trò chơi hay, như : thiết kế trò chơi Nim; thiết kế kiểu trò chơi có nhân, có tính đối
xứng; thuật toán liên quan đến chiến lược tìm kiếm,…Bài báo cáo đề cập đến thuật
toán tìm kiếm MinMax và thuật toán cắt tỉa Alpha-Beta trong việc xây dựng

chương trình trò chơi cờ caro (Gomoku).

3


1.2 Tổng quan về ngôn ngữ lập trình C#
1.2.1 Giới thiệu chung
- C# là một ngôn ngữ lập trình đơn giản, hiện đại, mục đích tổng quát, hướng
đối tượng được phát triển bởi Microsoft và được phê chuẩn bởi European
Computer Manufacturers Association (ECMA) và International Standards
Organization (ISO).
- C# được phát triển bởi Anders Hejlsberg kiến trúc sư phần mềm nổi tiếng với
các sản phẩm Turbo Pascal, Delphi, J++, WFC và team của ông trong khi phát triển
.Net Framework.
- C# được thiết kế cho Common Language Infrastructure (CLI), mà gồm
Executable Code và Runtime Environment, cho phép chúng ta sử dụng các ngôn
ngữ high-level đa dạng trên các nền tảng và cấu trúc máy tính khác nhau.
- So sánh với C và C++, ngôn ngữ này bị giới hạn và được nâng cao ở một vài
đặc điểm nào đó, nhưng không bao gồm các giới hạn sau đây:
+ Các con trỏ chỉ có thể được sử dụng trong chế độ không an toàn. Hầu hết
các đối tượng được tham chiếu an toàn, và các phép tính đều được kiểm tra tràn bộ
đệm. Các con trỏ chỉ được sử dụng để gọi các loại kiểu giá trị; còn những đối tượng
thuộc bộ thu rác (garbage-collector) thì chỉ được gọi bằng cách tham chiếu.
+ Các đối tượng không thể được giải phóng tường minh.
+ Chỉ có đơn kế thừa, nhưng có thể cài đặt nhiều interface trừu tượng
(abstract interfaces). Chức năng này làm đơn giản hóa sự thực thi của thời gian
thực thi.
+ C# thì an-toàn-kiểu (typesafe) hơn C++.
+ Cú pháp khai báo mảng khác nhau(“int[] a = new int[5]” thay vì “int
a[5]”).

+ Kiểu thứ tự được thay thế bằng tên miền không gian (namespace).
+ C# không có tiêu bản.
+ Có thêm Properties, các phương pháp có thể gọi các Properties để truy cập
dữ liệu.
+ Có reflection.
- C# được Microsoft giới thiệu lần đầu vào năm 2002 trong phiên bản visual
Studio.Net 2002 và tới nay đã trải qua các phiên bản sau:

4


Phiên bản
C#

Phiên bản visual studio

C# 1
C# 1.1

Visual Studio .NET 2002
Visual Studio .NET 2003

C# 2

Visual Studio .NET 2005

C# 3

Visual Studio .NET 2008


C# 4

Visual Studio .NET 2010

Các đặc điểm mới
First release
#line pragma and xml doc comments
Anonymous
methods,
generics,
nullable
types,
iterators/yield, static classes, co/contra
variance for delegates
Object and collection initializers,
lambda
expressions,
extension
methods, anonymous types, automatic
properties, Language Integrated Query
(LINQ),
anonymous
types,
local var type inference, LINQ
Dynamic, named arguments, optional
parameters, generic co/contra variance

Visual Studio .NET 2012

Async / await,

attributes

C# 5

information

Bug fixes, performance improvements,
and technology previews of .NET
Compiler Platform (“Roslyn”)

Visual Studio .NET 2013

C# 6

caller

nameof, String Interpolation,Nullconditional Member Access and
Indexing, Index Initializers, Collection
Initializer and Add Extension Methods,
Overload
Resolution,
Exception
Filters, Await in Catch and Finally
Blocks, Auto-property Initializers,
Getter-only Auto-properites, Function
Members with Expression Bodies,
Using Static

Visual Studio .NET 2015


1.2.2 Đặc điểm cơ bản của ngôn ngữ lập trình C#
1.2.2.1 Các đặc điểm quan trọng của C#
- Điều kiện Boolean,
- Tự động dọn rác bởi Garbage-Collector (GC),
- Thư viện chuẩn (Standard Library),
- Assembly,
5


- Property và sự kiện (Event),
- Delegate Quản lý sự kiện,
- Dễ dàng để sử dụng Generic,
- Indexer,
- Biên dịch có điều kiện (Conditional Compilation),
- Đa luồng dễ dàng (Multithreading),
- LINQ và Lambda Expression,
- Tích hợp với Windows.
1.2.2.2 Các kiểu dữ liệu trong C#
- Các biến trong C# được phân chia thành các kiểu sau:
+ Kiểu giá trị (Value type)
+ Kiểu tham chiếu (Reference type)
+ Kiểu con trỏ (Pointer type)
a) Kiểu giá trị
- Các biến kiểu giá trị có thể được gán một giá trị một cách trực tiếp. Chúng
được kế thừa từ lớp System.ValueType.
- Kiểu giá trị trực tiếp chứa dữ liệu. Một số ví dụ là int, char, và float, tương
ứng giữ số nguyên, chữ cái, và số thực. Khi bạn khai báo một kiểu int, hệ thống cấp
phát bộ nhớ để lưu giá trị đó.
Bảng sau liệt kê các kiểu giá trị có sẵn trong C# 2010


6


Kiểu

Biểu diễn

Dãy giá trị

7

GTMĐ


bool

Giá trị Boolean

True hoặc False

byte

Kiểu unsigned integer (8 0 tới 255
bit)

0

char

Kiểu Unicode character U +0000 tới U +ffff

(16 bit)

'\0'

decimal Kiểu thập phân (128 bit) (-7.9x 1028tới7.9 x 1028) / 100 to 28

False

0.0M

double Kiểu double (64 bit)

(+/-)5.0 x 10-324 tới
(+/-)1.7 x 10308

0.0D

float

Kiểu float (32 bit)

-3.4 x 1038 tới + 3.4 x 1038

0.0F

int

Kiểu integer (32 bit)

-2,147,483,648 tới 2,147,483,647 0


long

Kiểu signed integer (64 -9,223,372,036,854,775,808
bit)
9,223,372,036,854,775,807

sbyte

Kiểu signed integer (8 -128 tới 127
bit)

0

short

Kiểu signed integer (16 -32,768 tới 32,767
bit)

0

uint

Kiểu unsigned integer 0 tới 4,294,967,295
(32 bit)

0

ulong


Kiểu unsigned integer 0 tới 18,446,744,073,709,551,615 0
(64 bit)

ushort

Kiểu unsigned integer 0 tới 65,535
(16 bit)

tới 0L

0

b) Kiểu tham chiếu
- Kiểu tham chiếu không chứa dữ liệu thực sự được lưu giữ trong một biến,
nhưng chúng chứa một tham chiếu tới các biến.
- Nói cách khác, chúng tham chiếu tới một vị trí bộ nhớ. Việc sử dụng nhiều
biến, thì kiểu tham chiếu có thể tham chiếu tới tới một vị trí bộ nhớ. Nếu dữ liệu
trong vị trí bộ nhớ bị thay đổi bởi một trong số các biến, thì biến khác tự động phản
ánh sự thay đổi về giá trị này.
- Ví dụ các kiểu tham chiếu có sẵn trong C# là: object, dynamic, và string.
8


Kiểu object trong C#
- Kiểu object là lớp cơ sở cơ bản cho tất cả kiểu dữ liệu trong C# Common Type
System (CTS). Object là một alias cho lớp System.Object. Các kiểu object có thể
được gán giá trị của bất kỳ kiểu, kiểu giá trị, kiểu tham chiếu, kiểu tự định nghĩa
(user-defined) khác. Tuy nhiên, trước khi gán các giá trị, nó cần một sự chuyển đổi
kiểu.
- Khi một kiểu giá trị được chuyển đổi thành kiểu object, nó được gọi là boxing

và ngược lại, khi một kiểu object được chuyển đổi thành kiểu giá trị, nó được gọi là
unboxing.
Kiểu Dynamic trong C#
- Bạn có thể lưu giữ bất kỳ kiểu giá trị nào trong biến kiểu dữ liệu dynamic. Việc
kiểm tra các kiểu biến này diễn ra tại run time.
- Cú pháp để khai báo một kiểu dynamic trong C# là:
dynamic <tên_biến> = giá_trị;
Ví dụ
dynamic d = 20;
- Kiểu dynamic là tương tự với kiểu object, ngoại trừ việc kiểm tra cho các biến
kiểu object diễn ra tại compile time, trong khi việc kiểm tra các biến kiểu dynamic
diễn ra tại run time.
Kiểu string trong C#
- Kiểu string trong C# cho phép bạn gán bất kỳ giá trị chuỗi nào cho một biến.
Kiểu string là một alias cho lớp System.String. Nó kế thừa từ kiểu object. Giá trị
cho một kiểu string có thể được gán bởi sử dụng các hằng chuỗi trong hai mẫu là
quoted và @quoted.
Ví dụ:
String str = "Hello C#";
Và một hằng chuỗi @quoted trông như sau:
@"Hello C#";
c) Kiểu con trỏ
- Các biến kiểu con trỏ lưu giữ địa chỉ bộ nhớ của kiểu khác. Các con trỏ trong
C# có khả năng như con trỏ trong C hoặc C++.
- Cú pháp để khai báo một kiểu con trỏ trong C# là:
type* identifier;
Ví dụ:
char* cptr;
1.2.2.2 Các câu lệnh điều khiển trong C#
a) Các câu lệnh điều khiển lựa chọn

i. Câu lệnh if-else
Mục đích của chúng là dùng để điều khiển chương trình khi chỉ thực thi một
nhiệm vụ nào đó khi thỏa mãn điều kiện của biểu thức.
9


Cú pháp câu lệnh :
if(điều kiện 1)
các câu lệnh ;
else if(điều kiện 2)
các câu lệnh ;
else
các câu lệnh ;
ii. Câu lệnh switch-case
Cũng giống như câu lệnh if-else, switch-case là câu lệnh rẽ nhánh, sử dụng
biểu thức để quyết định chương trình sẽ đi theo hướng nào. Switch – case cũng
được hỗ trợ hầu hết trong các ngôn ngữ lập trình như C,C++, java, javascript và C#.
Khác với câu lệnh if-else nơi mà biểu thức dựa trên so sánh giá trị của biểu
thức với kiểu boolean để quyết định rẽ nhánh. Biểu thức switch case dựa trên việc
so sánh với biểu thức với nhiều giá trị cụ thể.
Trong C#, giá trị mà biểu thức có thể so sánh có kiểu dữ liệu số, chuỗi, hoặc
enum với các biểu thức so sánh với một tập các giá trị ý nghĩa, nên đặt tập các giá
trị ý nghĩa đó thành một enum và sử dụng nó trong switch-case.
Cú pháp câu lệnh:
switch (điều kiện)
{
case giá trị 1
lệnh 1;
case giá trị 2
lệnh 2;


Case giá trị n
lệnh n;
}
b) Các câu lệnh điều khiển lặp
i. Câu lệnh for
Câu lệnh for là một trong bốn câu lệnh lặp cơ bản phổ biến trong các ngôn
ngữ lập trình hiện đại. Cú pháp của câu lệnh for trong ngôn ngữ lập trình C# có sự
tương đồng trong các ngôn ngữ lập trình như C, ++, Java, javascript.
Mục đích: Câu lệnh for thường được sử dụng để thực hiện những công việc
mang tính lặp đi lặp lại nhiều lần. Trong đó sốtổng số lần công việc cần thực hiện
lặp người lập trình phải tiên đoán được trước.
Cú pháp:
for(giá trị khởi tạo; đk để vòng lặp dừng; số bước nhảy)
{
//công việc cần thực hiện;
10


}
Ví dụ: Sử dụng vòng lặp for để tính tổng các số từ 1 đến 10
for(int i=1; i<10; i++)
{
tong = tong + i;
return tong;
}
ii. Câu lệnh foreach-in
Câu lệnh foreach – in là một câu lệnh điều khiển lặp, là một câu lệnh tiện ích,
một trường hợp đặc biệt của câu lệnh điều khiển lặp for.
Mục đích: thường dược sử dụng khi cần thực hiện công việc mang tính lặp

lại với việc thao tác lần lượt các phần tử trong một mảng hay một tập hợp các đối
tượng trong ( Array, Collection,…).
Cú pháp:
foreach (type item in Set) statement
trong đó:
+ type: kiểu dữ liệu của từng item
+ Set : là Tập hợp dữ liệu dạng array, collection mà câu lệnh foreachin sẽ thực hiện lặp. Đối với tập dữ liệu kiểu collection, thì bản thân các phần tử phải
convert được tới kiểu dữ liệu type. Đối với các collection để có thể thực hiện được
câu lệnh foreach-in thì bản thân các collection đó phải thực thi interface
IEnumerable hoặc khai báo một phương thức GetEnumerator
+ item: là một phẩn từ của tập hợp
+ statement : nhiệm vụ cần thực hiện
iii. Câu lệnh while
Câu lệnh while là một câu lệnh điều khiển lặp dùng tính đúng sai của biểu
thức dạng boolean để quyết định có thực hiện tiếp công việc hay không. Chừng nào
biểu thức còn đúng thì còn thực hiện câu lệnh, nếu sai thì câu lệnh while dừng lại.
Mục đích: Khác với câu lệnh điều khiển lặp for thường dùng cho khi biết
trước số lần cần lặp, thì mục đích chính của câu lệnh điều khiển lặp while lại
thường dùng để thực hiện cho các công việc cần lặp lại mà không biết số lần cần
lặp.

Cú pháp:
While (điều kiện)
{
//thực hiện lệnh;
[thay đổi biểu thức điều kiện];
11


}

iv. Câu lệnh do-while
Giống như câu lệnh while, câu lệch do-while là một câu lệnh điều khiển lặp
dùng tính đúng sai của biểu thức dạng boolean để quyết định có thực hiện tiếp công
việc hay không. Chừng nào biểu thức còn đúng thì còn thực hiện câu lệnh, nếu sai
thì câu lệnh do-while dừng lại.
Mục đích: Khác với câu lệnh điều khiển lặp for thường dùng cho khi biết
trước số lần cần lặp. Và giống với vòng lặp while, vòng lặp do-while lại thường
dùng để thực hiện cho các công việc cần lặp lại mà không biết số lần cần lặp.
Nhưng điểm khác biệt với while là do-while sẽ thực hiện nhiệm vụ ít nhất 1 lần
trước khi sự so sánh của biểu thức xảy ra.
Cú pháp:
do
{
//thực hiện lệnh;
[thay đổi biểu thức];
} while(điều kiện);
Ngoài ra còn một số các câu lệnh điều khiển khác trong C# như câu lệnh nhảy
bước, câu lệnh xử lý lỗi trong đó:
Câu lệnh nhảy bước gồm:
 Câu lệnh break
 Câu lệnh continue
 Câu default
 Câu lệnh goto
 Câu lệnh return
Câu lệnh xử lý lỗi gồm:
 Câu lệnh throw
 Câu lệnh try-catch
 Câu lệnh try-finally
 Câu lệnh try-catch-finally
1.2.2.3 Các loại tham số của hàm trong C#

a. Tham số bình thường
b. Tham số dạng params
c. Tham số dạng ref
d. Tham số dạng out
1.2.3 Tại sao phải sử dụng ngôn ngữ lập trình C#
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
12


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
1.2.3.1 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++.
1.2.3.2 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. Tuy nhiên, cũng đừng lo lắng chúng ta sẽ dần
dần được tìm hiểu những đặc tính qua các chương trong cuốn sách này.
13


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++.
1.2.3.3 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 cả những đặc tính trên.

1.2.3.4 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.
1.2.3.5 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. Bảng sau liệt kê các từ khóa của ngôn ngữ C#.
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal

default
delegate
do

double
else
enum
event
explicit
extern
false
finally
fixed
float
for

foreach
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null

object
operator
out

override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short

1.2.3.6 C# là ngôn ngữ hướng module
14

sizeof
stackalloc
static
string
struct
switch
this
thow
true
try
typeof
unit
ulong
unchecked


unsafe
unshort
using
virtual
volatile
void
while


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ả.
1.2.3.7 C# sẽ là một ngôn ngữ phổ biến
C# là một trong những ngôn ngữ lập trình mới nhất. Vào thời điểm cuốn sách
này được viết, nó không được biết như là một ngôn ngữ phổ biến. Nhưng ngôn ngữ
này có một số lý do để trở thành 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 muốn ngôn ngữ C# trở nên phổ biến. Mặc dù một công ty không
thể làm một sản phẩm trở nên phổ biến, nhưng nó có thể hỗ trợ. Cách đây không
lâu, Microsoft đã gặp sự thất bại về hệ điều hành Microsoft Bob. Mặc dù Microsoft
muốn Bob trở nên phổ biến nhưng thất bại. C# thay thế tốt hơn để đem đến thành
công sơ với Bob. Thật sự là không biết khi nào mọi người trong công ty Microsoft
sử dụng Bob trong công việc hằng ngày của họ. Tuy nhên, với C# thì khác, nó được
sử dụng bởi 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ẽ...
1.3 Tổng quan về winform trong C#
1.3.1 Tổng quan về winform
Windows Form là công cụ dùng để tạo các ứng dụng Windows, nó mượn các
ưu điểm mạnh của ngôn ngữ Visual Basic : dễ sử dụng, hỗ trợ mô hình RAD đồng
thời kết hợp với tính linh động, hướng đối tượng của ngôn ngữ C#. Việc tạo ứng
dụng Windows trở lên hấp dẫn và quen thuộc với các lập trình viên.
Lý do sử dụng Winform:
- Hỗ trợ cải tiến các đối tượng sau này,
- Hỗ trợ thừa kế,
- Có các tập Control phong phú,
15


- Nhiều kiểu giao diện,
- Hỗ trợ cải tiến về đồ họa,
- Hỗ trợ khả năng truy cập các thuộc tính Control,
- Thuận lợi cho việc thiết kế Form.

Mô hình 3 lớp trong Winform.

----H8: Cấu trúc các lớp----

16


Phân cấp các lớp của Winform


----H9: Phân cấp các lớp----

Kích trên Form hoặc là Control thì sẽ
có hộp thoại Properties hiện lên và
chúng ta có thể thao tác thay đổi các
thuộc tính của Form, Control trong này
một cách đơn giản.

----H10: Properties---17


- Trên Properties kích chọn Form Event
có biểu tượng hình “tia sét”.
- Sử dụng Form Event:
+ Activated và DeActivate: Activated
là xảy ra khi Form được kích hoạt hoặc
người dùng tương tác.
+ FormClosing: Xảy ra khi Form đang
chuẩn bị đóng.
+ FormClosed: Xảy ra sau sự kiện
Closing và trước Dispose.
+ MenuStart và MenuComplete: Xảy
ra khi menu nhận và mất focus.
----H11: Form Event---Điều khiển nhiều sự kiện với một thủ tục:
private void Form1_Activated(object sender, EventArgs e)
{
Debug.WriteLine("Form1 Activated!");
this.Text = "Form Activated!";
}
Giải thích:

- “sender”: tham chiếu tới đối tượng mà được gọi bởi sự kiện. Nó hữu ích
trong trường hợp có nhiều đối tượng sử dụng chung một sự kiện.
- “e”: chứa các thông tin về control mà người dùng có thể nhận diện được
các hành vi và cách thực của control.
- Tuỳ vào mỗi sự kiện khác nhau mà tham số thứ 2 có thể khác nhau.

18


Một Control căn bản:
- Label: hiển thị icons hoặc text không sửa được.
- Textbox: nhập dữ liệu từ bàn phím hoặc hiển thị.
- Button: bắt các sự kiện khi kích chuột.
- CheckBox: cho người dùng chọn hoặc không chọn.
- ComboBox: một danh sách đổ xuống.
- ListBox: một danh sách các item để chọn.
- PictureBox: hiển thị ảnh.
- MenuStrip: hiển thị menu
- ProgressBar: hiển thị tiến trình của một tác vụ
- ToolStrip…
Một Event căn bản:
- Click: Sự kiện khi click vào Button trong form
- Double Click: Sự kiện click đúp vào Button trong form
- Enter: sự kiện khi ấn Enter
- KeyDown:
- KeyUp:
- MouseClick: Sự kiện kích chuột.
- MouseMove: Sự kiện di chuyển chuột.
- MouseUp:
- Move:

- FormClosing:
1.3.2 Ví dụ đơn giản và cấu trúc 1 chương trình Winform.

19


Ví dụ: Chương trình Winform đơn giản

----H12: Code Demo---Một chương trình trong Winform thường được bắt đầu bằng các thư viện ví
dụ như “using system” , “ using system.Winform.Forms”…
Tiếp đến là từ khóa “namespace DemoWinform” là tên của Project chúng
ta đã tạo.
Tiếp theo ta sẽ cho ứng dụng kế thừa từ Form “public partial class
HelloWorld : Form”. Bất kỳ một ứng dụng Windows Form nào cũng đều thừa kế
từ đối tượng Form, ta có thể dùng đối tượng này để tạo ra các cửa sổ chuẩn như :
các cửa sổ trôi (floating form), thanh công cụ (tools), hộp thoại (dialog box) …
Mọi Điều khiển trong bộ công cụ của Windows Form (Label, Button, Listbox …)
đều thuộc vùng tên này.
20


Kết quả của ví dụ trên là khi ta bấm vào Button OK thì sẽ có một
MessageBox hiện lên đi kèm với dòng chữ “Hello World”.

----H13: Kết quả----

21


CHƯƠNG 2

CÀI ĐẶT THUẬT TOÁN
2.1 Thuật toán minmax
2.1.1 Ý tưởng thuật toán.
Hai đối thủ trong trò chơi được gọi là MIN và MAX luân phiên thay thế
nhau đi. MAX đại diện cho người quyết dành thắng lợi và cố gắng tối đa hóa
ưu thế của mình, ngược lại người chơi đại diện cho MIN lại cố gắng giảm điểm
số của MAX và cố gắng làm cho điểm số của mình càng âm càng tốt. Giả thiết
đưa ra MIN và MAX có kiến thức như nhau về không gian trạng thái trò chơi
và cả hai đối thủ đều cố gắng như nhau.
Mỗi Node biểu diễn cho một trạng thái trên cây trò chơi. Node lá là
Node chứa trạng thái kết thúc của trò chơi.
Giải thuật Minimax thể hiện bằng cách định trị các Node trên cây trò chơi:


Node thuộc lớp MAX thì gán cho nó giá trị lớn nhất của con Node đó.



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

lý nhất.
2.1.2 Ví dụ mô phỏng giải thuật Minimax cho trò chơi Tic-Tac-toe


MAX đại diện quân đi O.



MIN đại diện quân đi X.

Trạng thái kết thúc là trạng thái có 3 ô liên tiếp ngang, dọc, chéo có cùng

một quân cờ X hoặc O, nếu là X tức MIN thắng còn O tức MAX thắng còn nếu
tất cả các ô cờ đều được đi và trạng thái chưa kết thúc thì bàn cờ hòa. Điểm
thắng của X là -1, của O là 1, và bàn cờ hòa là 0.
Áp dụng giải thuật Minimax:
Từ trạng thái bàn cờ hiện tại ta dự đoán nước đi của trạng thái tiếp theo
nếu trạng thái tiếp theo ta tiến hành lượng giá cây trò chơi bằng cách ta tiến
hành quét cạn tất cả các trạng thái tiếp theo cho đến lúc gặp trạng thái chiến
thắng (Node lá) tính điểm cho Node lá bằng cách:
22




Nếu ở trạng thái mà ta gặp chiến thắng nếu đó là lượt đi của quân X thì
đánh giá điểm trạng thái đó là -1.



Nếu ở trạng thái ta gặp chiến thắng nếu đó là lượt đi của quân O thì
đánh giá điểm trạng thái đó là 1.



Nếu là hòa thì điểm trạng thái đó là 0.

Sau đó tính ngược lại cây trò chơi theo quy tắc:



Nút thuộc lớp MAX thì gán cho nó giá trị lớn nhất của các Node con của
Node đó.



Nút thuộc lớp MAX thì gán cho nó giá trị nhỏ nhất của các Node con
của Node đó.

Sau khi lượng giá hết cây trò chơi ta tiến hành chọn bước đi tiếp theo nguyên
tắc:


Nếu lớp tiếp theo là MAX ta chọn Node con có giá trị lớn nhất.
Nếu lớp tiếp theo là MIN ta chọn Node con có giá trị nhỏ nhất.

 Ưu điểm
Tìm kiếm được mọi nước đi tiếp theo sau đó lựa chọn 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ỏ soá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 do 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 Giới thiệu game cờ caro
Cờ caro là game rất phổ biến, đặc biệt là trong giới thanh thiếu niên.
Đây là trò chơi đối kháng giữa 2 người. Ván cờ được chơi trên bàn cờ ô vuông.
Hai bên sẽ thay phiên nhau tích vào những ô vuông trên bàn cờ. Ký hiệu mỗi
nước đi của từng người là X hoặc O. Người chơi sẽ phải dùng chiến thuật và
kinh nghiệm để tạo thành 1 hàng ngang, dọc, chéo có 5 quân cờ của mình.

23


Lưu ý là 5 quân cờ này không được phép chặn 2 đầu bởi các quân cờ của
đối phương. Người chiến thắng là người tạo được hàng 5 đầu tiên.
Kết thúc ván chơi, kết quả thắng thua sẽ hiển thị trên màn hình game. Số
phỉnh sẽ cập nhật vào tài khoản của bạn. Đặc biệt số điểm cúp sẽ được tính
theo luật Elo quốc tế. Khi bạn chơi với đối thủ mạnh, nếu thắng bạn sẽ được
cộng nhiều điểm hơn đối thủ bình thường.
2.3 Cài đặt thuật toán
2.3.1 Cài đặt thuật toán
2.3.1.1 Phân tích thuật toán
Hai đối thủ trong một trò chơi được gọi là Max và Min. Max là đại diện
cho đối thủ quyết giành thắng lợi hay cố gắng tối đa hóa ưu thế của mình.
Ngược lại Min là đối thủ cố gắng tối thiểu hóa điểm số của Max. Ta giả thiết
Min cũng dùng cùng những thông tin như Max.
Một trò chơi như vậy có thể được biểu diễn một 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 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ả 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. Do hai đối 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ân phiên nhau là Max và Min. Cây trò chơi vì thế
còn có tên là cây Min-Max. Trên cây trò chơi các nút ứng dụng với trạng thái
mà từ đó người chơi Max chọn nước đi sẽ thuộc lớp Max, các nút ứng với
trạng thái mà từ đó người chơi Min chọn nước đi sẽ thuộc lớp Min. Chiến lược
minimax thể hiện qua quy tắc định trị cho các nút trên cây trò chơi như sau:
- Nếu nút là nút là gán cho nút đó một giá trị để phản ánh trạng thái
thắng thua hay hòa của các đối thủ.
- Sử dụng giá trị của các nút là để xác định giá trị của các nút ở các mức

trên cây trò chơi theo quy tắc:
+ Nút thuộc lớp Max thì gán cho giá trị lớn nhất của các nút con
của nút đó.

24


+ Nút thuộc lớp Min thì gán cho nó giá trị nhỏ nhất của các nút
con của nút đó..
Giá trị được gán cho từng trạng thái theo quy tắc trên ghi rõ giá trị của
trạng thái tốt nhất mà mỗi đối thủ có thể hy vọng đạt được. Người chơi Max
khi đến lượt đi, người chơi này sẽ chọn nước đi ứng với trạng thái có giá trị
cao nhất trong các trạng thái con, còn với người chơi Min khi đến lượt sẽ chọn
nước đi ứng với trạng thái có giá trị nhỏ nhất trong các trạng thái con.
Ví dụ: Xét trò chơi Tic Tac Toe. Hai người Max và Min thay phiên nhau
đi X hoặc O. Người nào đi được 3 ô thẳng hàng(ngang, dọc, chéo) 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 10: Một phần cây trong trò chơi Tic Tac Toe.
25


×