TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIKHOA CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ---*---BÁO CÁO MÔN: PROJECT 1 Đề tài: Lập trình chương trình game cờ caro đánh với máy tính Sinh viên thực hiện:
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIKHOA CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
-* -BÁO CÁO MÔN: PROJECT 1
Đề tài:
Lập trình chương trình game cờ caro đánh với máy tính
Sinh viên thực hiện: Nguyễn Văn Thành
Lớp: CNTT 1 K55
Giảng viên hướng dẫn: TS Trần Hải Anh
Trang 2MỤC LỤC
LỜI GIỚI THIỆU ……… 3
PHẦN I MÔ TẢ BÀI TOÁN……… 4
PHẦN II GIẢI QUYẾT BÀI TOÁN……… 5
A Ngôn ngữ thực hiện……… 5
B Giải quyết bài toán……… 5
1 Thiết kế giao diện……… 5
2 Xây dựng chức năng và thiết kế lớp……… 6
a Các chức năng cần thiết……… 6
b Phân tích và thiết kế lớp……… 6
3 Xây dựng chức năng người chơi với người chơi……… 10
4 Thực hiện chức năng Undo, Redo……… 11
5 Xử lý thắng thua……… 12
6 Trí tuệ nhân tạo cho máy trong cờ Caro……… 12
a Sơ lược về trí tuệ nhân tạo……… 13
b Trí tuệ nhân tạo trong cờ Caro………13
C Giao diện và cách chơi……… 14
1 Giao diện……… 15
2 Cách chơi……….15
PHẦN III MÃ NGUỒN……… 15
TÀI LIỆU THAM KHẢO……… 24
Trang 3LỜI GIỚI THIỆU
Cờ caro là trò chơi logic cổ xưa nhất trên Trái Đất Nó được sáng tạo từ nhiều nền văn minh khác nhau một cách độc lập Nó bắt đầu xuất hiện từ năm 2000 trước CN
ở sông Hoàng Hà, Trung Quốc Một số nhà khoa học đã tìm thấy bằng chứng chứng minh Caro đã được phát minh ở Hy lạp cổ đại và ở Châu Mỹ trước thời Colombo.Môn cờ cổ của Trung Quốc là Wutzu Cờ Caro du nhập từ Trung Quốc vào Nhật Bản từ khoảng năm 270 trước CN Nó thường được gọi là Gomoku nhưng cũng có các tên gọi khác tuỳ theo thời gian và địa phương như Kakugo, gomoku-narabe, Itsutsu-ishi Người ta đã tìm thấy một trò chơi cổ từ một di tích ởNhật năm 100 sau CN và thấy nó là một biến thể của Caro.Nó đã lan truyền nhanh chóng với cái tên Kakugo (trò 5 quân) Các nhà sử học nói rằng vào các thế kỷ 17
và 18, mọi người đều chơi trò này-người già cũng như người trẻ.Năm 1858, khi quyển sách đầu tiên về trò chơi này được xuất bản, nó được gọi là Kakugo Nó tiếptục được chơi, được gọi với nhiều tên khác nhau như Goren, Goseki, rồi
Gomokunarabe, Gomoku và phát triển cho đến ngày nay thành thể loại phức tạp nhất trong họ hàng đông đúc của nó, là Renju (chuỗi ngọc trai)
Trong cuộc sống hằng ngày, game cờ caro cũng rất phổ biến và được đa số các bạnhọc sinh, sinh viên thường xuyên chơi Nó vừa là một game giải trí rất tốt sau những giờ học căng thẳng, vừa là trò chơi có tính trí tuệ cao kích thích tư duy của người chơi
Trang 4PHẦN I MÔ TẢ BÀI TOÁN
Xây dựng trò chơi cờ caro trên một bàn cờ gồm 20 hàng và 20 cột, tạo thành một hình chữ nhật kích thước 20*20
Các tính năng của trò chơi:
- Tính năng cho 2 người chơi với nhau
- Tính năng cho người chơi đấu với máy
- Các chức năng khác như: New Game để bắt đầu ván chơi mới, Undo, Redo cho phép đánh lại nước đi trước đó, Exit để đóng trò chơi
- Ngoài ra bổ sung thêm các chức năng phụ như Option lưu thông tin về luật chơi, Help trợ giúp hướng dẫn cách chơi…
Trên cơ sở của đề tài em đã xây dựng chương trình game cờ caro đơn giản bao gồm các tính năng trên
Dù rất cố gắng nhưng chương trình của em chắc chắn không thể tránh khỏi những thiếu xót, em mong nhận được những ý kiến nhận xét, góp ý của các thầy cô bộ môn để chương trình được hoàn thiện hơn
Trang 5PHẦN II GIẢI QUYẾT BÀI TOÁN
A Ngôn ngữ thực hiện
Ngôn ngữ thực hiện chương trình: C#
Trình biên dịch sử dụng: Visual Studio 6.1
B Giải quyết bài toán
1 Thiết kế giao diện
Tạo project mới: Mở visual studio, vào mục visual C#, chọn Windows forms
Application, đặt tên project: TroChoiCoCaro
Cửa sổ chương trình ban đầu hiện lên giao diện Form1.cs[Design] dùng để thiết kếgiao diện Mở hộp toolbox, trong mục Menus & Toolbars ta chọn Menu Strip, kéo thả sang giao diện form Ta đặt tên MenuStrip tương ứng với các chức năng như: File (New Game, Exit), Edit (Undo, Redo), Option, Help Trong New Game ta đặt
2 chế độ chơi là Player vs Player (người chơi với người) và Player vs Com (người chơi với máy)
Các chức năng được sử dụng trong Toolbox:
- PictureBox dùng để chèn ảnh biểu tượng trò chơi hiện thị trên giao diện
- Các Button dùng để xây dựng các nút: Player vs Player, Player vs Com, New Game, Exit
- Panel là khung thực hiện trò chơi, để vẽ bàn cờ thực hiện các chức năng chơicờ
Tùy vào thẩm mỹ của người thiết kế, ta có thể chỉnh sửa màu sắc, size, cỡ chữ cho các chức năng trên trong mục System.Windows.Forms
Trang 62 Xây dựng chức năng và thiết kế lớp
a Các chức năng cần thiết
- Chơi game: Chơi với người, chơi với máy
- Xử lý thắng thua
- Các chức năng Edit( Undo, Redo): cho phép đánh lại và khôi phục lại nước đi
- Trí tuệ cho máy tính: Có thể chia theo level: Dễ, Trung Bình, Khó
- Thêm 1 vài chức năng khác như: Save Game, Load Game…
b Phân tích thiết kế lớp
Lớp
Ô cờ:
Thực hiện các chức năng lưu thông
tin về ô cờ như chiều dài, chiều
public const int
_ChieuRong
= 25;
public const int
_ChieuCao
= 25;
private int _Dong;
public int Dong
Void VeBanCo(graphics g)Void XacDinhOCo(int x, int y, Graphics g)
Void ChoiVoiNguoi()Void ChoiVoiMay()Bool DuyetChienThang()// AI: Trí tuệ nhân tạo
g, int Dong, int Cot, image
img O_Co[][] MangOCo)
// AI: Trí tuệ nhân tạo
O_Co
const int ChieuDai;
const int ChieuRong;
const int SoHuu;
Void VeOco(graphics g, int
SoHuu)
Trang 7{
get { return _Dong; }
set { _Dong = value ; }
}
private int _Cot;
public int Cot
{
get { return _Cot; }
set { _Cot = value ; }
}
private Point _ViTri;
public Point ViTri
{
get { return _ViTri; }
set { _ViTri = value ; }
}
private int _SoHuu;
public int SoHuu
{
get { return _SoHuu; }
set { _SoHuu = value ; }
class BanCo
{
private int _SoDong;
Trang 8public int SoDong
{
get { return _SoDong; }
}
private int _SoCot;
public int SoCot
g.DrawLine( CaroChess pen, 0, j * OCo _ChieuCao, _SoCot
* OCo _ChieuRong, j * OCo _ChieuCao);
g.FillRectangle(sb, point.X +1, point.Y +1,
OCo _ChieuRong-2, OCo _ChieuCao-2);
}
}
Lớp CaroChess
Trang 9Đây là lớp quan trọng nhất cũng là lớp thực hiện hầu hết các chức năng của trò chơi, lưu trữ thông tin về cờ như trạng thái của trò chơi, các bước đi, chế
độ chơi, lượt đi của mỗi bên, kiểm tra chiến thắng, đánh với người hay đánh với máy Trong chức năng đánh với máy còn có các hàm khởi tạo
computer, tìm kiếm nước đi…
class CaroChess
{
public static Pen pen;
public static SolidBrush sbRed;
public static SolidBrush sbBlack;
public static SolidBrush sbGreenWhite;
private OCo [,] _MangOCo;
private BanCo _BanCo;
private int _CheDoChoi;
public int CheDoChoi
{
get { return _CheDoChoi; }
}
private int _LuotDi;
private bool _SanSang;
public bool SanSang
{
get { return _SanSang; }
}
private Stack < OCo > stkCacNuocDaDi;
private Stack < OCo > stkCacNuocUndo;
private KETTHUC _KetThuc;
public CaroChess()
{
pen = new Pen ( Color Blue);
sbRed = new SolidBrush ( Color Red);
sbBlack = new SolidBrush ( Color Black);
sbGreenWhite = new SolidBrush ( Color FromArgb(192, 255, 255));
_BanCo = new BanCo (20, 20);
_MangOCo = new OCo [_BanCo.SoDong, _BanCo.SoCot];
stkCacNuocDaDi = new Stack < OCo >();
stkCacNuocUndo = new Stack < OCo >();
_LuotDi = 1;
}
Trang 103 Xây dựng chức năng người chơi với người chơi
Chức năng này sẽ thực hiện việc đánh cờ giữa 2 người chơi dùng chuột: Lần lượt người chơi thứ nhất đánh sau đó đến lượt người chơi thứ 2 đánh Các class được sửdụng để thực hiện chức năng này: CaroChess, Ban_Co, O_Co
Trong hàm khởi tạo người đánh với người (Player vs Player) ta lưu trữ các thông tin sau:
- _SanSang = true; Thể hiện trạng thái của bàn cờ, đã sẵn sàng để được chơi hay chưa (có thể bắt đầu đánh cờ được hay chưa)
- _LuotDi = 1 ; Gán ngay bên đi đầu tiên là lượt đi bằng 1 và làm người chơi thứ nhất
- _CheDoChoi = 1: Người đánh với người
- KhoiTaoMangOco(); Gọi đến hàm KhoiTaoMangOco và thực hiện chức năng lưu thông tin của mảng ô cờ mới được gọi
- VeBanCo(g); Thực hiện chức năng vẽ bàn cờ với biến graphics g
public void StartPlayerVsPlayer( Graphics g)
{
_SanSang = true ;
stkCacNuocDaDi = new Stack < OCo >();
stkCacNuocUndo = new Stack < OCo >();
4 Thực hiện chức năng Undo, Redo
Để thực hiện 2 chức năng này ta lưu danh sách các nước đã đi và danh sách các nước đã được undo vào các Stack <ô cờ> (chức năng Redo chỉ thực hiệnđược sau khi sử dụng chức năng Undo)
public void Undo( Graphics g)
{
if (stkCacNuocDaDi.Count != 0)
{
OCo oco = stkCacNuocDaDi.Pop();
stkCacNuocUndo.Push( new OCo (oco.Dong, oco.Cot,
oco.ViTri, oco.SoHuu));
Trang 11OCo oco = stkCacNuocUndo.Pop();
stkCacNuocDaDi.Push( new OCo (oco.Dong, oco.Cot,
oco.ViTri, oco.SoHuu));
_MangOCo[oco.Dong, oco.Cot].SoHuu = oco.SoHuu;
_BanCo.VeQuanCo(g, oco.ViTri, oco.SoHuu == 1 ? sbBlack : sbRed);
Trang 125 Xử lý thắng thua
Như theo luật chơi, nếu bên nào xếp được 5 quân của mình theo một phương bất
kỳ (ngang, dọc, chéo) bất kỳ trước mà không bị quân đối phương chặn 2 đầu thì bên đó được xem như là thắng cuộc Khi đó sẽ có một thông báo hiện ra cho người chơi biết kết quả đồng thời dừng ván chơi ngay tại thời điểm đó
6 Trí tuệ nhân tạo cho máy trong cờ caro
a 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 (Tiếng Anh: Artification intelligence thường được viết tắt là AI) là trí tuệ được biểu diễn bởi bất cứ hệ thống nhân tạo nào Thuật ngữ này dùng đển nói đến các máy tính có được trí tuệ của một phần não người, thông qua việc nghiên cứu của các ngành khoa học khiến máy tính có được suy nghĩ, suy luận như con người
Trí tuệ nhân tạo được chia làm 2 trường phái: Truyền thống và trí tuệ tính toán
b Trí tuệ nhân tạo trong cờ Caro
Sử dụng cấu trúc cây:
Tại lượt đi A, tìm kiếm các nước đi có thể đánh B và C
Tính trước các nước D, E tương ứng với B và F, G,H tương ứng với C
Tiếp tục tính các nước đi tương ứng với E và M, N tương ứng với I
Tương ứng với mỗi nước đi, cần lần lượt quét các hướng:
Lần lượt duyệt các hướng và tính toán cả việc tấn công và phòng ngự có lợi ở nướcđó
Trang 13Dùng 2 mảng để lưu trữ điểm tấn công và phòng ngự:
- Điểm tấn công = {0, 9, 54, 162, …}
- Điểm phòng ngự = {0, 3, 27, 99, …}
Theo hướng đó có bao nhiêu quân thì ta cộng vào bấy nhiêu điểm tấn công hay phòng ngự và ngược lại
Lặp lại với các nước con có thể đánh ở lượt sau
C Giao diện và cách chơi
1 Giao diện
Trang 142 Cách chơi
Giao diện chơi game rất đơn giản và trực quan Các chức năng chính là New Game, Exit, Player vs Player và Player vs Com Trò chơi hỗ trợ được 2 người chơi với nhau và người chơi đánh với máy Ngoài ra còn có các chức năng như Undo, Redo để chơi lại và khôi phục lại nước đi
Để chơi với 2 người người chơi có thể ấn vào nút “Player vs Player” hoặc vào File New Player vs Player Để giành được chiến thắng thì người chơi phảitạo được 1 dãy 5 con liên tiếp cùng màu theo 1 phương bất kỳ (dọc, ngang, chéo) và thỏa mãn điều kiện không bị đối phương chặn 2 đầu
Để chơi với máy người chơi có thể ấn vào nút “Player vs Com” hoặc cũng vào File New Player vs Com
Sau mỗi ván chơi, người chơi click vào nút New Game để chơi ván mới hoặc thoát ra khỏi trò chơi bằng nút Exit
Trang 15public const int _ChieuRong = 25;
public const int _ChieuCao = 25;
private int _Dong;
public int Dong
{
get { return _Dong; }
set { _Dong = value ; }
}
private int _Cot;
public int Cot
Trang 16{
get { return _Cot; }
set { _Cot = value ; }
}
private Point _ViTri;
public Point ViTri
{
get { return _ViTri; }
set { _ViTri = value ; }
}
private int _SoHuu;
public int SoHuu
{
get { return _SoHuu; }
set { _SoHuu = value ; }
Trang 17private int _SoDong;
public int SoDong
{
get { return _SoDong; }
}
private int _SoCot;
public int SoCot
g.DrawLine( CaroChess pen, i *
OCo _ChieuRong, 0, i * OCo _ChieuRong, _SoDong *
OCo _ChieuCao);
}
for ( int j = 0; j <= _SoDong; j++)
{
g.DrawLine( CaroChess pen, 0, j *
OCo _ChieuCao, _SoCot * OCo _ChieuRong, j * OCo _ChieuCao);
Trang 18g.FillEllipse(sb, point.X + 2, point.Y + 2,
OCo _ChieuRong - 4, OCo _ChieuCao - 4);
}
public void XoaQuanCo( Graphics g, Point point,
SolidBrush sb)
{
g.FillRectangle(sb, point.X +1, point.Y +1,
OCo _ChieuRong-2, OCo _ChieuCao-2);
Trang 20private void frmCoCaro_Load( object sender,
Trang 22private void editToolStripMenuItem_Click( object
Trang 23Application SetCompatibleTextRenderingDefault( false );
Application Run( new frmCoCaro ());
}
}
}
Trang 25TÀI LIỆU THAM KHẢO
-Hướng dẫn lập trình C# nâng cao – MinhDangThanh’blog
http://minhdangthanh.wordpress.com/l%E1%BA%ADp-trinh-c-nang-cao/
-Bài giảng hướng dẫn lập trình c# căn bản, lập trình c# nâng cao của anh Lê Nguyễn Anh Huy