Người chơi có thể đổi nhạc nghe nhạc trong máy của người chơi hoặc dừng hẳn nhạc nền chức năng này sẽ được trình bày bên dưới Ngoài ra, người dùng còn có thể dùng chuột để di chuyển
Trang 1Đề tài:
“Game Cờ Tướng người - người”
Trang 2II - Ý Tưởng và Thuật Toán cụ thể
II.1 Lớp MainMenu : Form II.2 Lớp MainGame : Form II.3 Lớp BANCO : Form II.4 Lớp QUAN CO : PictureBox II.5 Lớp QuanXe : QUANCO II.6 Lớp QuanPhao : QUANCO II.7 Lớp QuanMa : QUANCO II.8 Lớp TUONG : QUANCO II.9 Lớp QuanSi : QUANCO II.10 Lớp QuanTuong : QUANCO II.11 Lớp QuanTot : QUANCO
Trang 3§3 TỔNG KẾT
§1 Đặc Tả Chức Năng
Chương trình chơi cờ tướng là chương trình được viết bằng C#.NET 2005, cho phép
hai người chơi cờ tướng với nhau trên cùng một máy tính Các chức năng chính của
chương trình được mô tả như sau:
I - Main Menu : là menu chính của chương trình, được load lên trước
tiên khi người chơi kích hoạt file exe chạy chương trình
Hình 1 – Main Menu
Trang 4Kể từ khi bắt đầu chương trình (nghĩa là từ lúc Load Main Menu ) cho đến suốt thời
gian chạy chương trình, thì chương trình có chạy một bài nhạc nền tạo cảm hứng cho
người chơi Người chơi có thể đổi nhạc ( nghe nhạc trong máy của người chơi ) hoặc
dừng hẳn nhạc nền ( chức năng này sẽ được trình bày bên dưới )
Ngoài ra, người dùng còn có thể dùng chuột để di chuyển Form MainMenu đến bất
cứ vị trí nào trên màn hình máy tính
Các lựa chọn trong Main Menu :( chuột di chuyển đến gần Menu nào thì
Menu đó đổi sang màu khác đồng thời có âm thanh báo )
Play: Bắt đầu chơi – Khi click vào chức năng này thì một bàn cờ sẽ được bắt
đầu
Open : Open một file định dạng *.cotuong – Khi click vào chức năng này, thì
chương trình sẽ mở một hộp thoại Open File cho người dùng có thể Open những file
định dạng *.cotuong đã được chơi trước đó để tiếp tục ván cờ đó
Teacher: Giới thiệu Giáo Viên hướng dẫn – Khi click vào Menu này thì tất cả
các Menu khác sẽ ẩn đi, thay vào đó là phần giới thiệu về giáo viên đã hướng dẫn
nhóm sinh viên thực hiện chương trình này – thầy Phạm Thi Vương
Students: Giới thiệu Nhóm sinh viên thực hiện – Khi click vào Menu này thì
tất cả các Menu khác sẽ ẩn đi, thay vào đó là phần giới thiệu về Nhóm sinh viên đã
thực hiện chương trình này ( Nhóm 27 , lớp K1C4.2 – UIT )
Exit: Thoát khỏi chương trình
II - Main Game :
Nếu người dùng click vào Play ( hoặc Open một file *.cotuong ), thì cửa sổ Main
Menu sẽ bị ẩn và thay vào là cửa sổ của Game chính ( bàn cờ ) Hình ảnh giao diện
bàn cờ như hình sau :
Trang 5Người chơi có thể giữ chuột tại những vị trí ngoài phạm vi đường viền xanh để di
chuyển Form bàn cờ đến bất cứ vị trí nào trên màn hình máy tính
Hình 2 Giao Diện Bàn Cờ Tướng khi chơi
Các Chức Năng Của Trò Chơi :
a) Chương trình cho phép người chơi di chuyển các quân cờ trên Bàn Cờ theo ý
muốn nếu thỏa các điều kiện cần thiết
- Kiểm tra sự hợp lệ của các quân cờ trong các nước đi hay không Nếu không hợp
lệ, thì chương trình sẽ tự động chuyển quân cờ đó về đúng vị trí xuất phát ban đầu
( xem như chưa đi ) và phát ra âm thanh báo lỗi
Trang 6- Không cho bất cứ bên nào đi “ đường tử “ – nghĩa là cố tình để cho đối phương
bắt Tướng bên mình
- Kiểm tra chiếu tướng – nếu chiếu sẽ phát ra âm thanh báo chiếu tướng
- Kiểm tra các nước cản, lộ mặt Tướng …
- Phân chia lượt đi theo đúng quy định của luật cờ Tướng – không tới lượt của
mình thì không được đi Và hai label : Red – Green sẽ thông báo cho người chơi
biết đến lượt bên nào
b) Chức năng Undo :
- Người chơi có thể hồi lại nước cờ nếu muốn bằng cách click vào button Back ở
góc trái – dưới của giao diện
- Người chơi cũng có thể “đi tới” các nước sau ( nếu có ) bằng cách click vào
button Next ở cạnh Back trên giao diện trò chơi
- Khi một chức năng nào đó không còn ý nghĩa nữa thì tự động , Button của chức
năng đó sẽ bị vô hiệu hóa Ví dụ : Khi nhấn Back liên tục cho đến khi trạng thái
các quân cờ trở về như một bàn cờ mới thì chương trình sẽ tự động vô hiệu hóa
button Back này Tương tự , button Next cũng vậy
c) Tính Thời Gian :
- Chương trình có thể tính thời gian và hiển thị thời gian từ đầu ván cờ cho đến
thời điểm hiện tại ( Đồng Hồ Số ở giữa ,phía trên Bàn Cờ )
d) Bảng Menu :
- My Music : Open nhạc trong máy người chơi để làm nhạc nền
- NewGame : Bắt đầu lại một ván cờ mới
- MainMenu : Trở về MainMenu khi nảy
- Save: Lưu ván cờ đang chơi vào máy người chơi
- Exit: Thoát khỏi chương trình – trước khi thoát, chương trình sẽ hỏi người chơi
có muốn Save hay không !
- Hai button : Stop và Play nhạc nền ( tương tự như hai button trong chương trình
Window Media Player )
Trang 7§2 Đặc Tả Kĩ Thuật
- Chương trình được viết trong 11 lớp tất cả : MainMenu, QUANCO, QuanXe,
QuanPhao, QuanMa, TUONG, QuanSi, QuanTuong, QuanTot, BANCO,
MainGame
- Mỗi lớp sẽ làm một công việc khác nhau Trong đó, Lớp MainMenu giữ vai trò là
“Class Program” của cả chương trình
I.1 - Lớp MainMenu : ( Kế thừa từ lớp Form )
- Lớp này dùng để tạo giao diện ban đầu cho người chơi lựa chọn các chức năng
của chương trình : Play, Open, Teacher, Students, Exit
Trang 8- Thiết kế những đặc điểm mà bất kì một quân cờ nào cũng có Ví dụ các đặc
điểm như : hình dạng, kích thước… và một số các thông số cần thiết khác :
Enable, tọa độ xuất phát…
- Thiết kế những đặc điểm riêng của Quân Xe trong Cờ Tướng ( cho cả hai bên “
tham chiến ” ) như : Hình ảnh, tọa độ lúc ban đâu… và thiết lập điều kiện tối thiểu
mà một Quân Xe phải đạt được đó là : “ Xe phải đi theo đường thẳng ” Chú ý:
Ở đây, chưa nói đến việc Cản một quân Xe đi như thế nào
- Cũng tương tự như lớp QuanXe Lớp QuanPhao thiết kế những đặc điểm riêng
của một Quân Pháo trong Cờ Tướng như : hình ảnh, tọa độ ban đầu… và thiết lập
điều kiện tối thiểu mà một Quân Pháo phải đạt được là : “ Pháo đi đúng luật thì
trước hết, nó phải đi theo đường thẳng ” Cũng chưa nói đến việc Cản quân
Pháo ở lớp này
- Thiết kế những đặc điểm riêng của Quân Mã trong Cờ Tướng : hình ảnh, tọa độ
ban đầu ….và thiết lập điều kiện tối thiểu mà một Quân Mã phải đạt được là :
“Quân Mã đi đúng luật, thì trước hết phải đi chéo 1ô x 2ô hoặc 2ô x 1ô ” Và
cũng chưa xét nước cản Quân Mã trong lớp này
Chú thích : ở các lớp như : QuanXe, QuanPhao, QuanMa thì cả hai bên đều giống nhau, vì các quân cờ này không giới hạn không gian hoạt động; còn đối với Tướng, Sĩ, Tượng sẽ bị giới
hạn không gian hoạt động Vì thế mà trong cách thiết lập điều kiện tối thiểu, ta phải viết hai lần :
một đối với bên A, và một đối với bên B
- Thiết kế những đặc điểm riêng của Quân Tướng trong Cờ Tướng : hình ảnh, tọa
độ ban đầu ….và thiết lập điều kiện tối thiểu mà một Quân Tướng phải đạt được
là : “ Tướng đi đúng luật, thì trước hết phải đi thẳng, khoảng cách là 1ô cờ và
phạm vi hoạt động không được phép vượt ra ngoài ranh giới “ cung điện” của
Trang 9Tướng ” Trong lớp này cũng chỉ xét đến điều kiện tối thiểu thôi, chưa xét nước
cản Tướng hay lộ mặt Tướng ở đây
- Cũng thiết kế những đặc điểm riêng về hình ảnh, tọa độ….của một Quân Sĩ
trong Cờ Tướng Và thiết lập điều kiện tối thiểu như các quân cờ khác Điều kiện
đó là : “ Quân Sĩ được chỉ được phép đi trong “ cung điện “ của Tướng để bảo
vệ Tướng Và mỗi nước đi, phải đi chéo 1ô x 1ô ” Không tính đến nước cản
trong lớp này
- Quân Tượng hay còn được gọi là Tịnh hay Bồ ( tùy địa phương ) Trong lớp
này, chúng ta cũng chỉ thiết lập như những lớp “ cờ riêng ” ở trên Nghĩa là cũng
thiết kế đặc điểm riêng của Quân Tịnh trong cờ Tướng về hình ảnh, tọa độ ban
đầu, ….và thiết lập điều kiện tối thiểu để quân Tượng có thể đi đúng luật đó là : “
Quân Tượng phải đi chéo 2ô x 2ô ” Và cũng tương tự như các quân cờ khác, ở
đây, chúng ta chưa nói đến việc cản quân Tượng và việc cấm quân Tượng “ qua
sông ”
- Ta cũng thiết kế cho Quân Tốt những đặc điểm riêng, ngoài những đặc điểm
chung kế thừa từ lớp QUANCO Trong điều kiện đi hợp lệ của Quân Tốt, nếu
Quân Tốt chưa qua sông, thì chỉ được phép đi tới 1ô Đặc biệt, khi Quân Tốt đã
qua sông thì Tốt được “ phong cấp “ – nghĩa là được phép đi ngang 1ô và tuyệt
đối không được phép đi lùi Điều kiện tối thiểu của Quân Tốt cũng sẽ được thiết
lập trong lớp này Và cũng như các lớp khác , ta không xét cản Tốt ở đây
- Công việc chính trong lớp BANCO là chỉ vẽ bàn cờ, các chỉ số tọa độ của Bàn
Cờ, một số hình ảnh trong giao diện lúc chơi cờ và quan trọng là tạo một mảng
hai chiều các nút ( các giao điểm ) trên bàn cờ mà các Quân Cờ nằm tại những
giao điểm đó
Trang 10I.11 - Lớp MainGame : ( Kế thừa từ lớp Form )
- Lớp MainGame là lớp giao diện chính trong ván cờ Người chơi sẽ chơi cờ trực
tiếp trên Form này
- Công việc của Lớp MainGame khá nhiều Nhưng ở đây, chúng ta chỉ đề cập đến
công việc chung của MainGame ( cụ thể sẽ được nói sau )
- MainGame sẽ gọi những hàm thiết kế vẽ bàn cờ, giao diện từ lớp BANCO sang,
và gọi những hàm thiết lập điều kiện tối thiểu của các quân cờ Đồng thời thiết lập
thêm một số điều kiện khác cho hoàn chỉnh luật đi các quân cờ như : cản , tránh
chiếu… , xử lý các sự kiện : chiếu, âm thanh, hình anh, time, …
- Thiết kế Một Lớp Kế thừa Form làm giao diện chính để Play Game
( ở đây là lớp MainGame )
- Thiết kế lớp QUANCO kế thừa từ PictureBox ( cũng có thể dùng control khác )
để tạo quân cờ chung
- Thiết kế các lớp : Xe, Pháo, Mã, Tướng, Sĩ, Tượng, Tốt kế thừa từ lớp QUANCO
và sau đó đặt các Quân Cờ lên Form ( lớp MainGame ) rồi tiến hành xử lý các
luật và một số sự kiện khác
- Trước hết, chúng ta sẽ tạo ra những công cụ không thể thiếu để bắt đầu một ván
cờ Đó là Bàn Cờ và các Quân Cờ Nghĩa là chúng ta phải viết các lớp tạo Quân
Cờ và lớp Bàn Cờ để tạo một bàn cờ đơn giản trước, rồi sau đó mới bắt đầu viết
lớp MainMenu và lớp MainGame để hoàn thiện chương trình
và thiết lập các Nút ẩn (các giao điểm trên bàn cờ) Lớp BANCO được mô tả như sau :
Trang 11Các biến : public Graphics g; // doi tuong do hoa int x, y, i, j;//toado(x,y) va chi so i,j
Color butvemau = Color.Black;
public Color color = Color.Black;
public Point[,] Nut = new Point[10, 9];
Hàm public void VeBanCo() : dùng để vẽ Bàn Cờ và các hình ảnh giao diện Hàm này sử dùng các phương thức :
DrawLine : để vẽ các đường thẳng DrawImage : để vẽ các hình ảnh DrawString : để vẽ các dòng text thể hiện chỉ số Bàn Cờ : a0, a1,b5…
DiemSang, DiemSangBienPhai, DiemSangBienTrai : để vẽ các điểm khởi đầu của Tốt và Pháo Các hàm này dùng phương thức DrawLine
để vẽ các đoạn thẳng “ siêu ngắn ” và ghép lại thành “ điểm sáng “ Hàm public void TaoDiemAn() : dùng để tạo ra các Nút ẩn trên bàn cờ Sử dụng vòng for để gán tọa độ cho các phần tử mảng Nut[,]
Quân Cờ chung cho tất cả các Quân Cờ Các lớp QuanXe, QuanPhao… sẽ kế thừa từ đây Lớp QUANCO được mô tả như sau :
Các biến : public bool hoatdong; // Ktra hd cua co public Point toadoxuatphat;
public Point PExplor; //toa do tham’ hiem~
dung de xu li sau nay
private GraphicsPath path = null;// dung
de cat quan co htron
Hàm public void TaoCo(int a, int b): Tạo một Quân Cờ
Cơ Sở, dùng các phép gán để gán các giá trị ban đâu Trong đó, tọa
độ ban đầu là (a,b)
Hàm public bool NhanLenh(MouseEventArgs e): Nếu trỏ chuột nằm đè lên Quân Cờ nào và chuột đang MouseDown thì Quân cờ đó
đang trong trạng thái Nhận Lệnh Ở đây, Quân Cờ có Size = (40,40) Do đó,
trạng thái Nhận Lênh = true khi (e.X > this.Location.X
&& e.X < this.Location.X + 40
Trang 12&& e.Y > this.Location.Y &&
e.Y < this.Location.Y + 40 &&
e.Button == MouseButtons.Left)
Hàm public bool DuDinhDongQuan(Point diemden):
Tương tự như hàm NhanLenh Nếu Quân Cờ đang trong trạng thái hoạt
động, đè lên một Nút ẩn trên bàn cờ thì nó “dự định đóng quân” tại Nút đó
Hàm public bool DangChiemDong(Point pt): Nếu Location của Quân Cờ trùng với một điểm nào đó, thì chương trình hiểu rằng Quân Cờ
đang chiếm đóng tại điểm đó Chú ý : ở đây là điểm chứ không phải Nút
public bool DangChiemDong(Point pt) {
protected override void OnResize(EventArgs e)
protected override void OnPaint(PaintEventArgs e)
những đặc điểm riêng biệt của Quân Xe Lớp QuanXe gồm các hàm :
Hàm public PictureBox TaoQuanXeDo(int x, int y): Hàm này sẽ tạo lại tọa độ cho Xe là (x,y) và gán giá trị Image cho Quân Cờ mang hình ảnh của một
Quân Xe màu đỏ thực thụ Giá trị trả về là PictureBox để thuận tiện cho việc
Add lên Form sau này
Hàm public PictureBox TaoQuanXeXanh(int x, int y): Tương tự như hàm TaoQuanXeDo Nhưng hình ảnh là Quân Xe màu xanh
Hàm public bool XeDiDungHuong(Point pBegin, Point
Trang 13
if (pBegin.X != pEnd.X && pBegin.Y != pEnd.Y ||
pBegin == pEnd)
return false;
kế thừa từ lớp QUANCO và thiết kế những đặc điểm riêng biệt của Quân Pháo Lớp QuanPhao gồm các hàm :
Hàm public PictureBox TaoQuanPhaoDo(int x, int y): Hàm này
sẽ tạo lại tọa độ cho Phao là (x,y) và gán giá trị Image cho Quân Cờ mang hình
ảnh của một Quân Pháo màu đỏ thực thụ Giá trị trả về là PictureBox để
thuận tiện cho việc Add lên Form sau này
Hàm public PictureBox TaoQuanPhaoXanh(int x, int y): Tương tự như hàm TaoQuanPhaoDo Nhưng hình ảnh là Quân Pháo màu xanh
Hàm public bool PhaoDiDungHuong(Point pBegin,
Point pEnd):
Hàm PhaoDiDungHuong sẽ thiết lập điều kiện tối thiểu để một Quân Pháo đi hợp lệ, nghĩa là Pháo đi theo đường thẳng Thuật Toán ở đây là điêm đầu ( pBegin ) và điểm cuối ( pEnd ) không được khác nhau về cả hai thành phần tọa độ x,y
if (pBegin.X != pEnd.X && pBegin.Y != pEnd.Y ||
pBegin == pEnd)
return false;
QuanMa cũng thiết kế hình ảnh riêng của mình Hai hàm :
public PictureBox TaoQuanMaDo(int x, int y) public PictureBox TaoQuanMaDo(int x, int y) tương tự như Xe và Pháo Riêng, đối với quân đi chéo như Mã thì cần có hàm int trituyetdoi(int a) để quản lý tính hợp lệ của nước đi
Và trong hàm : public bool MaDiDungHuong(Point pBegin, Point pEnd)
sẽ sử dụng hàm int trituyetdoi(int a)
Asb(pBegin.X - pEnd.X) * Asb(pBegin.Y -pEnd.Y) ==
400&& pBegin != pEnd) return true; ;// Asb == trituyetdoi
Trang 14II.6 - Lớp TUONG : Hai hàm TaoTuongXanh và TaoTuongDo tương tự như
các lớp kia Ta xét tiếp các hàm thiết lập điều kiện tối thiểu Lớp TUONG cũng có
hàm int trituyetdoi(int a) như lớp Mã Nhưng do Tướng chỉ được phép đi trong “
cung “, nên ta phải chia thành hai hàm để giải quyết
public bool TUONGDoDiDungHuong(Point pBegin, Point pEnd)
{
// khong duoc phep “dam chan tai cho”
if (pBegin.X != pEnd.X && pBegin.Y != pEnd.Y)
return false;
// gioi han pham vi dua vao toa do ban co
if ((pBegin.X == pEnd.X || pBegin.Y == pEnd.Y)
&& pEnd.X > 255 && pEnd.X < 405
&& pEnd.Y < 490 && pEnd.Y > 385)
Tương tự cho hàm public bool TUONGXanhDiDungHuong nhưng phải giới hạn
tọa độ phù hợp vơí Tướng Xanh
cung Các hàm thiết kế tương tự ( tham khảo code )
động rộng hơn Do đó, chúng ta thiết lập luật đi của Tượng là chung cho cả hai
bên, không giới hạn phạm vi ở đây Nên không chia thành hai hàm để xử lí Mặc dù ta
biết rằng Tượng không được phép qua sông
{