Người đi trướcquân đen sẽ đánh đầu\n tiên vào tâm bàn cờ.\n- Nếu bên nào xếp được 5 quân theo \n đường thẳng, ngang, chéo \n-và không bị \nchặn ở 2 đầu thì bên đó dành thắng lợi"; tmChuC
Trang 1
LỜI MỞ ĐẦU
Đây là tài liệu dùng để biểu diễn cơ bản vấn đề “lập trình game
bằng ngôn ngữ lập trình C# theo phương pháp hướng đối tượng ” do sinh
viên Nguyễn Thị Yến thiết kế và lập trình Tài liệu này giúp ta có cái nhìn cơ
bản về ngôn ngữ lập trình hướng đối tượng nói chung và ngôn ngữ C# nóiriêng
Do thời gian có hạn nên đồ án đã không thể hoàn thành hết nhữngchức năng đã định như ban đầu đặt ra Tuy nhiên, những chức năng chưahoàn thiện sẽ sớm được bổ sung và hoàn thiện trong thời gian sớm nhất cóthể
Trong thời gian thực hiên, đồ án sẽ không tránh khỏi có những sai sót,mong quý thầy cô và các bạn thông cảm và có những góp ý quý báu nhằmhoàn thiện sản phẩm hơn
Xin chân thành cảm ơn!
Nguyễn Thị Yến
Trang 2
NỘI DUNG VẤN ĐỀ
Trong xu thế phát triển công nghệ thông tin như vũ bão hiện nay đặcbiệt là ngành công nghệ phần mềm thì ngày càng đòi hỏi trình độ cao trong kĩthuật lập trình Chính vì vậy mà ngôn ngữ lập trình hướng thủ tục cổ điển đãkhông thể đáp ứng nhu cầu của thời đại đặt ra Ngay khi đó, một phương pháplập trình mới được ra đời theo nguyên lí Alan-kay được ra đời nhằm giải
quyết nhu cầu bức thiết đó: “Phương pháp lập trình hướng đối tượng”
Đồ án này được thiết kế trên nền tảng ngôn ngữ lập trình hướng đốitượng C#, do Microsoft đề ra dựa trên mục đích tạo ra một ngôn ngữ lập trình
hướng đối tượng: đơn giản, hiện đại, ít từ khóa, mạnh mẽ và mềm dẻo,
hướng module và trở nên phổ biến hơn
Chính vì vậy nó sẽ tránh khỏi các vấn đề khi thiết kế bằng phươngpháp lập trình hướng thủ tục cổ điển:
Mã chương trình dễ đọc, dễ hiểu, cô đọng
Chương trình được tổ chức thành các class, được nối ghép với nhau
tạo thành một thể thống nhất
Mỗi class lại bao gồm nhiều Method đảm nhận các vai trò khác nhau
trong chương trình
chương trình có tính mềm dẻo cao
có khả năng tái sử dụng tài nguyên
Trang 3
NỘI DUNG VẤN ĐỀ
I Project tittle: lập trình trò chơi cờ caro bằng phương pháp lập trình
hướng đối tượng
II Giới thiệu tổng quát: đây là một game mô tả trò chơi caro có thể chơi
online trên Internet hoặc offline trên máy tính của bạn Nó được lậptrình bằng ngôn ngữ C# theo phương pháp lập trình hướng đối tượng
III Các chức năng chính cần thiết:
1 Luật chơi cơ bản:
Hai bên sẽ thay phiên nhau đánh cờ
Người đi trước(quân đen) sẽ đánh đầu tiên vào tâm bàn cờ
Nếu bên nào sếp được 5 quân theo đường thẳng, ngang, chéo vàkhông bị chặn ở 2 đầu thì bên đó dành thắng lợi
2 Bắt đầu:
a giải thích: để bắt đầu chơi thì bạn phải click mouse và nhấn vào
button Start , trò chơi sẽ chính thức được bắt đầu
3 Các chế độ chơi:
Trong trò chơi này thì có 2 chế độ chơi:
Chơi với máy: Player vs Comp
Chơi với bạn bè: Player vs Player
Nếu bạn muốn chơi ở chế độ nào thì click mouse vào button đó
IV Các bước kĩ thuật
1 Tạo giao diện cho trò chơi:
a Tạo 1 menu (menustrip): gồm các thư mục, bên trong các thư mụcchứa các thao tác
File : new, open, save…
Help: help, custom, about…
Trang 4
Exit:
b Tạo 1 groupbox là 1 Container trong C# giúp hiển thị luật chơi trong
khi chơi, các button chọn chế độ chơi, chơi, thoát Thay đổi text,font, background, forecolor… của các groupbox, button theo tùy ý
Trang 5
2 phân tích thiết kế các lớp
a lớp ô cờ:
class O_Co {
const int chieudai;
const int chieurong;
int sohuu;
void Ve_oco(graphic g, int sohuu) }
giải thích:
Trang 6
1 ô cờ sẽ có các thuộc tính chiều dài chiều rộng là các biến Const và
biến sở hữu Khi biến sở hữu bằng 1 thì ô cờ là của máy, biến sở hữu bằng 2 thì ô cờ là của người chơi
Và method (phương thức) là Ve-oco sử dụng trong GDI+ của C#
b Lớp bàn cờ:
Class Ban_Co {
int sodong;
int socot;
Void Vebanco(graphic g, O_Co[][] mangoco)
Void Vequanco(graphic g, int dong, int cot,image img, o_co[][] mangoco[]) }
Trang 7Vebanco ( được gọi từ lớp trên ),
XacDinhOCo ( với các biến tọa độ x,y ) choivoinguoi ( xử lý khi người chơi chọn chế
độ player vs player ),
choivoimay (xử lý khi người chơi chọn chế độ
chơi player vs comp )
XuLyThangThua (duyệt thắng thua khi chơi)
3 Lập trình xử lý đồ họa
a Tạo hiệu ứng
Tạo nhãn Label: để hiện thị các chuỗi chữ trong trò chơi
private void Form1_Load (object sender, EventArgs e) {
lblchuoichu.Text = "-Hai bên sẽ thay phiên nhau đánh cờ Người đi trước(quân đen) sẽ đánh đầu\n tiên vào tâm bàn cờ.\n- Nếu bên nào xếp được 5 quân theo \n đường thẳng, ngang, chéo
\n-và không bị \nchặn ở 2 đầu thì bên đó dành thắng lợi";
tmChuChay.Enabled = true;
}
Đối tượng Time: để tạo hiệu ứng chữ chạy trong trò chơi
Trang 8
private void tmChuChay_Tick(object sender, EventArgs e)
{
lblchuoichu.Location=newPoint(lblchuoichu.Location.X, lblchuoichu.Location.Y-1);
if (lblchuoichu.Location.Y + lblchuoichu.Height < 0) lblchuoichu.Location = new Point( lblchuoichu.Location.X, groupBox1.Height);
}
Giải thích:
Qua sự kiện Tick thì qua 1 thời gian nhất định chuỗi chữ được
tạo sẽ nhảy từ tọa độ ban đầu sang 1 tọa độ mới (cụ thể ở đây: chuỗi chữ sẽ nhảy lên 1 dọc theo trục tọa độ Y)
Cho tới khi chuỗi chữ đó chạy hết chiều dài của groupbox1 thì
lại bắt đầu chạy từ dưới lên
Cứ liên tục lặp lại như thế
Trang 9
public const int _ChieuRong = 25;
public const int _ChieuCao = 25;
private int _Dong;
public int Dong
{
set {_ Dong = value; } get { return _Dong; } }
private int _Cot;
public int Cot
{
set { _Cot = value; } get { return _Cot; } }
private Point _ViTri;
public Point ViTri
{
set { _ViTri = value; } get { return _ViTri; } }
private int _SoHuu;
public int SoHuu
{
set {_SoHuu = value; } get { return _SoHuu; } }
Trang 10
}
Giải thích:
Trong lớp này ta khởi tạo lớp O-Co với các ô cờ có chiều rộng và
chiều dài là 25, và với các thuộc tính _Dong, _Cot, _ViTri, _SoHuu (ở đâythuộc tính sở hửu có thể hiểu rằng nếu là 1 thì là người chơi thứ 1 đi, nếu là 2thì là người chơi thứ 2 đi, nếu là 0 thì không thuộc sở hữu của bất kì ngườichơi nào)
Ta sử dụng các phương thức khởi tạo set, get để khởi tạo cho các thuộctính của lớp đó
Lớp BanCo:
class Ban_Co {
private int_ SoDong;
private int _SoCot;
public int SoDong
Trang 11g.DrawLine(GameCaro.pen, 0, j * O_Co.chieucao, _SoCot * O_Co.chieurong, j * O_Co.chieucao);
} }
}
Giải thích:
Trong lớp này ta cũng khởi tạo bàn cờ với các thuộc tính _Sodong,
_Socot và phương thức khởi tạo bàn cờ truyền tham số soDong, soCot
Đặc biệt, trong lớp Ban_Co này ta cần lưu ý tới các phương thứcVeBanCo và VeQuanCo
Phương thức VeBanCo sẽ được truyền đối tượng Graphics khi đó sẽgọi tới phương thức DrawLine của đối tượng đó đễ kẻ các đường thẳng dọc
và ngang từ tọa độ x tới tọa độ y nào đó
Trang 12
Lớp GameCaro:
class GameCaro
{
public static Pen pen;
private Ban_Co _Banco;
Trang 13Trong lớp này ta lập trình cho sự kiện paint của panel pnlBanCo bằng
cách gọi tới phương thức VeBanCo của lớp gameCaro
4 Lập trình xử lí trò chơi
Trang 14int Cot = MouseX / O_Co._ChieuRong;
int Dong = MouseY / O_Co._ChieuCao;
if (_MangOCo[Dong, Cot].SoHuu != 0) return false;
Trang 15}
Giải thích:
Tạo phương thức DanhCo để xác định tọa độ mà người chơi nhấn vào
và sau đó vẽ quân cờ bằng phương thức VeQuanCo thông qua phương thức
vẽ FillEllips của đối tượng Graphics
Ta xử lí lượt đi của các lượt người chơi:
Nếu lượt đi là 1 tương ứng người thứ 1 chơi, quân cờ là cờ
màu xanh, và ngược lại nếu lượt đi là 2 thì lượt đi là lượt đi của người thứ 2, quân cờ sẽ lại quân cờ màu đỏ
Nếu vị trí mà người chơi định đi đã được đánh thì trả về giái
trị là false (tức là không được đánh vào vị trị đó)
Và khi ta sẽ lưu lại các nước đã đi vào Stack bằng cách khởi tạolist_CacNuocDaDi và phương thức VeLaiQuanCo, trong đó C# hỗ trợphương thức List<>
public void StartPlayerVsPlayer(Graphics g)
{
_SanSang=true;
list_CacNuocDaDi= new List<O_Co>();
KhoiTaoMangOCo();
Trang 16Ở trên ta lập trình cho chế độ chơi Player vs Player
Khi game cờ caro đã sẵn sang (tức _SanSang=true) thì tiến hành khởitạo lại danh sách các nước đã đi , khởi tạo mới lại mảng ô cờ và vẽ lại bàn cờ
}
}
Trang 17Nếu cờ caro đang ở trạng thái sẵn sàng, và chơi ở chế độ 2(chơi với máytính) thì ta sẽ gọi tới phương thức khởi động máy tính để bắt đầu chơi và tiếnhành kiểm tra chiến thắng cho máy tính
Còn trong sự kiện click với menutooltrip PlayerVsPlayer thì khi bắt đầulại hoặc bắt đầu mới thì ta sẽ xóa màu các quân cờ, xóa các dòng kẻ chỉ để lạimàu nền của panel
Trang 18Trong phương thức này cũng có các trường hợp mà không thể chiến thắng
TH1: quân cờ hiên tại đang ở dòng > (số dòng bàn cờ trừ đi5) khi đó
không thể đi để có 5 quân cờ liên tiếp cùng màu nhau được
TH2: người chơi có 5 quân cờ cùng màu nhau và liên tiếp nhau nhưng bị
chặn 2 đầu thì không thể thắng được
Trang 19
Tương tự như duyệt theo chiều dọc
private bool DuyetCheoXuoi(int currDong, int currCot, int currSoHuu) {
if (currDong > _Banco.SoDong - 5 || currCot> _Banco.SoCot-5) return false;
int Dem;
for (Dem = 1; Dem < 5; Dem++)
Trang 20private bool DuyetCheoNguoc(int currDong, int currCot, int currSoHuu)
Trang 21Tương tự với duyệt theo chéo xuôi
public void KetThucTroChoi()
Trang 22_ketThuc = oco.SoHuu == 1 ? KETTHUC.Player1 : KETTHUC.Player2;
Trang 23
Giải thích: trong phương thức này ta sẽ xét các trường hợp để kết thúc
cờ:
TH1: nếu đi tất cả các ô trong bàn cờ mà chưa tìm được trên hàng
ngang, dọc, chéo ngược, chéo xuôi nào có 5 quân cờ liền nhau cùng màu nhauthì cờ hòa
TH2: xét tất cả các nước đã đi theo hàng ngang, hàng dọc, chéo
ngược, chéo xuôi có 5 quân cờ liền nhau cùng màu nhau, khi đó 5 quân cờ đóthuộc sở hữu của người chơi nào thì người đó thắng cuộc và kết thúc trò chơi
Khi người chơi 1 (bạn )thắng sẽ hiện ra message thông báo tương ứng
Khi người chơi 2 thắng hay máy thắng tức là bạn đã thua.
V Giới thiệu về trí tuệ nhân tạo cho máy trong trò chơi
1 Sơ lược về trí tuệ nhân tạo:
Trí tuệ nhân tạo hay trí thông minh nhân tạo( được viết tắt từ: ArtificialIntelligence hay Machine Intelligence, thường được viết tắt là AI ) là trí tuệđược biểu diễn bởi bất cứ một hệ thống nhân tạo nào đó
Trí tuệ nhân tạo được chia ra thành 2 trường hai tư duy: trường pháitruyền thống và trường phái trí tuệ tính toán
2 Trí tuệ nhân tạo trong trò chơi
Game cờ caro là 1 loại hình GameBoard, trong trò chơi luôn tồn tại haihướng đi song song: tấn công và phòng ngự
Các nước đi trong trò chơi luôn đòi hỏi phải đạt được trạng thái cuốicùng là giành chiến thắng hoặc đạt được thế cờ tốt nhất
Cần tìm được hàm đánh giá nước cờ thứ I để đánh giá nước cờ có thế
cờ “tốt” nhất
3 Lập trình trí tuệ nhân tạo cho máy trong trò chơi
Trang 24
a Sơ đồ cấu trúc cây:
Tại điểm A, ta có các nước có thể đánh : B, C
Tính trước các nước có thể đi khác: D,E tương ứng với B; F,G,H tươngứng với nước C
Tiếp tục tính trước các nước I tương ứng với E, và các nước
M,N tương ứng với I nước J, K tương ứng với G, và L tương ứng với H
Có quá nhiều nước đi phải tính ???
Tương ứng với mỗi nước đi ta cần duyệt các hướng của mỗi
nước: lần lượt duyệt các hướng của nước đi đó và tìm ra nước đi
có lợi cho cả việc tấn công và phòng thủ
Dùng hai mảng để lưu trữ cả điểm tấn công và phòng thủ:
Trang 25
Tìm kiếm nước đi:
Trong cờ caro, sau mỗi nước cờ thì các đối thủ sẽ chọn các ô cờ còntrống để đi, do đó, sau mỗi ô trống thì số ô trống còn lại sẽ giảm Như vậyviệc tìm kiếm mỗi nước đi cho trạng thái có sẵn chỉ là việc tìm kiếm trênnhững ô trống còn lại, đồng thời, không gian tìm kiếm sẽ bị thu hẹp theo sốnước đã đi
Không gian chọn nước đi từ mỗi trạng thái ban đầu là hữu hạn, nhưngkhông gian tìm kiếm 1 nước đi dẫn đến chiến thắng là rất lớn Do đó ta khôngthể vét sạch không gian tìm kiếm nước đi này mà ta phải giới hạn không giantìm kiếm
Một không gian tìm kiếm có thể hiện theo 1 cây đa phân được gọi là mộtcây tìm kiếm hay một cây trò chơi
Dựa vào cây trò chơi ta đã định nghĩa ở trên thì ta có, viếc tìm kiêmnước đi là việc chọn 1 nút ở trên cây trò chơi (mức 1) sao cho nước đi đó làtốt nhất theo thông thường thì 1 nước đi được đánh giá là tốt hay không thìphục thuộc vào khả năng chiến thắng sau nước đi đó có cao hay không Do
đó, muốn chọn 1 nước đi tốt nhất thì chỉ dựa vào thế cờ hiện tại thì chưa đủ,phải căn cứ thêm vào những thông tin thế cờ sau khi chọn nước cờ đó
Chiến lược minimax để tìm kiếm nước đi trong cờ caro:
Ta chọn:
Max tương ứng với quân cờ màu xanh
Min tương ứng với quân cờ màu đỏ
Trạng thái kết thúc là 3 hàng ngang, dọc, chéo xuất hiện cùng 1 quân cờtức là nếu cùng xuất hiện quân màu xanh thì Max thắng, còn nếu cùng xuấthiện quân màu đỏ thì Min thắng còn nếu các quân cờ cùng được đi và cùng
Trang 26
xuất hiện thì điểm thắng của cờ màu xanh là -1, điểm thắng của quân cờ màu
đỏ là 1, và nếu hòa thì điểm là 0
Từ trạng thái bàn cờ hiện tại thì ta có thể phân tích các nước đi của trạngthái bàn cờ tiếp theo, nếu đên trạng thái bàn cờ tiếp theo ta tiến hành lượnggiá cây trò chơi bằng cách vét cạn các trạng thái tiếp theo cho tới trạng tháichiến thắng cuối cùng (note lá cuối cùng) thì ta có thể tính điểm note lá nhưsau :
Nếu ở trạng thái chiến thắng ta gặp đó là lượt đi của quân cờ màu xanhthì điểm của trạng thái đó là -1
Nếu ở trạng thái chiến thắng ta gặp đó là lượt đi của quân cờ màu đỏ thìđiểm trạng thái là 1
Nếu ở đó hòa nhau thì điểm trạng thái là 0
Sau đó tính ngược lại giá trị của cây trò chơi bằng cách:
Nếu nút đó thuộc lớp Max thì ta gán giá trị lớn nhất của các note con chonote đó
Nếu nút đó thuộc lớp Min thì ta lại gán gái trị nhỏ nhất trong các notecon cho note đó
Sau khi lượng giá hết cây trò chơi thì ta tiến hành chọn nước đi bằngcách:
Nếu lớp tiếp theo là lớp Max thì ta chọn nước đi có giá trị lớn nhất Nếu lớp tiếp theo là Min thì ta chọn nước đi có giá trị là nhỏ nhất
Ví dụ:
Trang 27
Ưu điểm: tìm được mọi nước đi tiếp theo sau đó chọn nước đi tốt nhất
do giải thuật có tính chất vét cạn nên không bỏ sót trạng thái nào
Nhược điểm: giải thuật tìm kiếm nước đi minimax còn vấp phải 1 vấn đề
bùng nổ(mức hàm mũ) các khả năng cần xét của các nước đi -> không phùhợp với các bài toán trò chơi thực tế Vì vậy, chúng ta phải tỉa đi(cắt bỏ-không xét đến) các nhánh của cây trò chơi
Phương pháp cắt tỉa (α-β) Alpha-beta pruning:
Nếu 1 nhánh nào đó không thể cải thiện các giá trị (hàm tiện ích) màchúng ta đang sẵn có thì chúng ta sẽ loại bỏ các nhánh đó đi
Việc cắt bỏ các nhánh tìm kiếm (tồi )đó đi thì sẽ không ảnh hưởng tớikết quả cuối cùng Khi đó, α là giá trị của nước đi tốt nhất đối với Max(giá trịtối đa) đối với nhánh tìm kiếm đó Nếu v là giá trị tồi hơn α thì Max sẽ bỏ quanước đi ứng với v-> cắt tỉa nhánh tìm kiếm v
Trang 28
Tương tự ta có β được định nghĩa tương tự với Min
Kĩ thuật lượng giá trong trò chơi:
Ở phần trên ta có nhắc tới việc tiến hành lượng giá cho cây trò chơi
Kĩ thuật lượng giá là một kĩ thuật quan trọng trong trò chơi Kĩ thuật này
sẽ giúp cho điểm trạng thái của bàn cờ để từ đó xây dựng cây trò chơi Việccây dựng hàm lượng giá hợp lý, chính xác sẽ giúp cho hệ thống có thể đánhgiá về trạng thái bàn cờ và có nước đi thông minh hơn để giành chiến thắng Đối với bài toán trò chơi cờ caro thì ta có thể sử dụng hàm lượng đánhgiá tính “tốt, xấu” của mỗi nước cờ tại 1 thời điểm những ô cờ nào ở gần ô cờ
đã được đánh trước đó thì sẽ có điểm cao hơn Nhưng ô càng xa thì càng được
ít điểm hơn Tuy nhiên đây chỉ là 1 Heuristic, ta phải có thêm các Heuristickhác nữa ví dụ như là ở vùng có 2,3,4 quân cờ liên tiếp thì sẽ được cộng 1 sốđiểm thưởng nào đó dựa vào trọng số các quân cờ(các vùng có trọng số càngcao thì càng được cộng nhiều điểm thưởng)
Sau mỗi nước đi thì hệ thống sẽ kiểm tra bàn cờ và tìm ra các thế cờ rồitùy vào độ lợi thế đã định sẵn trước để tính điểm
Ví dụ ta có các trường hợp để tính điểm như sau:
{0, 1, 1, 1, 1}, {1, 0, 1, 1, 1}, {1, 1, 0, 1, 1},8
* TH2: Trường hợp thuận lợi (+585 điểm){0, 0, 1, 1, 1, 0}, {0, 1, 0, 1, 1, 0}, {1, 0, 1, 0, 1, 0, 1}
{0, 1, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 1, 1},{0, 1, 1, 0, 1}, {0, 0, 1, 1, 1}, {1, 0, 1, 1, 0},{1, 0, 0, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 0, 1, 1},