Chức Năng Save – Open file *.cotuong : khi sử dụng chức năng Save, chương trình sẽ ghi ra một file text, chuyển tọa độ của tất cả các quân cờ về kiểu string và ghi chuổi đó vào trong file text vừa ghi ra rồi lưu lại. Do đó, khi ta Open with file *.cotuong này bằng Notepad chẳn hạn thì nội dung file sẽ là một chuỗi các con số. Tổng cộng là 32*6=192 kí số trong file đó ( vì tất cả các quân cờ đều có tọa độ gồm 6 kí tự : 3 cho X và 3 cho Y )
Khi người dùng Open file đã được lưu trước đó, thì chương trình làm một thao tác ngược lại với khi Save là : đọc file được người dùng ra lệnh mở, chuyển chuổi string trong file đó về dạng mảng kí tự, chuyên từng phần tử trong mảng kí tự đó về kiểu int và gán nó vào tọa độ tưng quân cờ tương ứng.
19 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2548 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Đồ án Môn học Lập trình windows: Game Cờ Tướng người - Người, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Mục Lục
§1. ĐẶC TẢ CHỨC NĂNG
I - Main Menu
II - Main Game
§2. ĐẶC TẢ KĨ THUẬT
I - Bố Cục Chương Trình
I.1. Lớp MainMenu
I.2. Lớp MainGame
I.3. Lớp BANCO
I.4. Lớp QUAN CO
I.5. Lớp QuanXe
I.6. Lớp QuanPhao
I.7. Lớp QuanMa
I.8. Lớp TUONG
I.9. Lớp QuanSi
I.10. Lớp QuanTuong
I.11. Lớp QuanTot
II - Ý 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
§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
Kể 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 :
Ngườ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 :
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
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 .
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
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ờ )
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 )
§2. Đặc Tả Kĩ Thuật
I – Bố Cục Chương Trình :
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
I.2 - Lớp QUANCO : ( Kế thừa từ lớp PictureBox)
- 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….
I.3 - Lớp QuanXe : ( Kế thừa từ lớp QUANCO )
- 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
I.4 - Lớp QuanPhao : ( Kế thừa từ lớp QUANCO )
- 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
I.5 - Lớp QuanMa : ( Kế thừa từ lớp QUANCO )
- 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
I.6 - Lớp TUONG : ( Kế thừa từ lớp QUANCO )
- 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 Tướ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
I.7 - Lớp QuanSi : ( Kế thừa từ lớp QUANCO )
- 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.
I.8 - Lớp QuanTuong : ( Kế thừa từ lớp QUANCO )
- 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 ”.
I.9 - Lớp QuanTot : ( Kế thừa từ lớp QUANCO )
- 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 .
I.10 - Lớp BANCO : ( Kế thừa từ lớp Form )
- 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 đó.
I.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, …..
Tổng Quát : Ý tưởng chung của Game Cờ Tướng
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.
II – Ý Tưởng và Thuật Toán cụ thể :
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.
II.1 - Lớp BANCO : Lớp BANCO kế thừa từ Form, dùng để vẽ Bàn Cờ 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 :
Cá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[,]
II.2 - Lớp QUANCO : Lớp QUANCO kế thừa từ PicturBox thiết kế một 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
&& 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)
{
if (this.Location == pt)
return true;
else
return false;
}
Ba hàm cắt Quân Cờ theo hình elipse :
private void RefreshPath()
protected override void OnResize(EventArgs e)
protected override void OnPaint(PaintEventArgs e)
II.3 - Lớp QuanXe : Lớp QuanXe kế thừa từ lớp QUANCO và thiết kế 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 pEnd):
Hàm XeDiDungHuong sẽ thiết lập điều kiện tối thiểu để một Quân Xe đi hợp lệ, nghĩa là Xe đ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;
II.4 - Lớp QuanPhao : Hoàn toàn tương tự lớp QuanXe, lớp QuanPhao 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;
II.5 - Lớp QuanMa : Tương tự như hai lớp trước là Xe và Pháo, lớp 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
II.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 385)
{
if (trituyetdoi(pEnd.X - pBegin.X) == 50 ||
trituyetdoi(pBegin.Y - pEnd.Y) == 40 &&pBegin !=pEnd)
return true;
else
return false;
}
else
return false;
}
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
II.7 - Lớp QuanSi : Tương tự như TƯỚNG. Quân Sĩ đi chéo, trong phạm vi cung. Các hàm thiết kế tương tự ( tham khảo code )
II.8 - Lớp QuanTuong : Cũng tương tự như Sĩ. Nhưng Tượng có phạm vi hoạt độ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
public bool TuongDiDungHuong(Point pBegin, Point pEnd)
{
if (trituyetdoi(pEnd.X - pBegin.X) * trituyetdoi(pEnd.Y - pBegin.Y) == 8000 && pBegin != pEnd)
return true;
else
return false;
}
II.9 - Lớp QuanTot : Về việc thiết kế hai Quân Tốt cho hai bên thì tương tự như các lớp khác. Riêng về thiết lập luật đi, Quân Tốt có một đặc điểm là khi đã qua sông rồi, thì Tốt có thể đi ngang được. Do đó, trong lớp QuanTot, ta phải khai báo hai biến : public bool phongcapdo và public bool phongcapxanh
để kiểm tra sự phong cấp của mỗi bên. Ngoài ra, còn phải viết thêm hai hàm :
public void KiemtraPhongcapDo()
public void KiemtraPhongcapXanh()
để gán giá trị cho biến phongcap một cách đúng lúc. Đồng thời ta cũng phải chia thành hai hàm tách biệt để xử lí điều kiện của Tốt
public bool TotDoDiHopLe(Point pBegin, Point pEnd)
{
if (!phongcapdo && pEnd.X == pBegin.X && (pEnd.Y - pBegin.Y) == -40 && pBegin != pEnd)
return true;
if (phongcapdo && ((pEnd.X == pBegin.X && (pEnd.Y- pBegin.Y) == -40)|| (pEnd.Y == pBegin.Y
&& trituyetdoi(pEnd.X - pBegin.X) == 50))
&& pBegin != pEnd)
return true;
else
return false;
}
Hàm TotXanhDiHopLe tương tự
II.10 - Lớp MainGame :
Lớp MainGame sẽ làm tất cả các công việc còn lại để hoàn thiện luật đi của các quân cờ và vẽ bàn cờ lên Form từ các sự kiện vẽ trong lớp BANCO. Trước hết, chúng ta cần phải khai báo một số biến cần thiết nhất trong chương trình
BANCO banco = new BANCO();
QuanXe quanxedo1 = new QuanXe();
QuanXe quanxedo2 = new QuanXe();
QuanXe quanxexanh1 = new QuanXe();
QuanXe quanxexanh2 = new QuanXe();
QuanPhao quanphaodo1 = new QuanPhao();
QuanPhao quanphaodo2 = new QuanPhao();
QuanPhao quanphaoxanh1 = new QuanPhao();
QuanPhao quanphaoxanh2 = new QuanPhao();
QuanMa quanmado1 = new QuanMa();
QuanMa quanmado2 = new QuanMa();
QuanMa quanmaxanh1 = new QuanMa();
QuanMa quanmaxanh2 = new QuanMa();
TUONG TuongDo = new TUONG();
TUONG TuongXanh = new TUONG();
QuanSi quansido1 = new QuanSi();
QuanSi quansido2 = new QuanSi();
QuanSi quansixanh1 = new QuanSi();
QuanSi quansixanh2 = new QuanSi();
QuanTinh quantinhdo1 = new QuanTinh();
QuanTinh quantinhdo2 = new QuanTinh();
QuanTinh quantinhxanh1 = new QuanTinh();
QuanTinh quantinhxanh2 = new QuanTinh();
QuanTot quantotdo1 = new QuanTot();
QuanTot quantotdo2 = new QuanTot();
QuanTot quantotdo3 = new QuanTot();
QuanTot quantotdo4 = new QuanTot();
QuanTot quantotdo5 = new QuanTot();
QuanTot quantotxanh1 = new QuanTot();
QuanTot quantotxanh2 = new QuanTot();
QuanTot quantotxanh3 = new QuanTot();
QuanTot quantotxanh4 = new QuanTot();
QuanTot quantotxanh5 = new QuanTot();
int i, j;
bool playerxanh=true, playerdo=true;
bool bTracking,nuocdihople;
bool an=false; // mot quan co an quan cua doi phuong
Point[,] trangthai = new Point[500, 32];
int nuoc = 0;// trang thai dau tien cua BAN CO
int nuocmax;
Vẽ Bàn Cờ : gọi lại hàm Vebanco từ lớp BANCO
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
banco.g = e.Graphics;
banco.VeBanCo();
banco.g.Dispose();
}
Thiết kế các Menu giao diện : Tương tự như trong lớp MainMenu. Sẽ được trình bày sau.
Thiết lập luật đi các quân cờ : Trong suốt quá trình chơi cờ: lấy cờ, di chuyển cờ, buông cờ. được xử lý chủ yếu trong 3 hàm chính của lớp MainGame :
// ------- HAM NHAN CHUOT ---------- //
protected override void OnMouseDown(MouseEventArgs e)
// ------- HAM DI CHUYEN CHUOT ---------//
protected override void OnMouseMove(MouseEventArgs e)
// ------- HAM THA CHUOT RA ----------- //
protected override void OnMouseUp(MouseEventArgs e)
Trong hàm MouseDown :
Nếu quân cờ nào Nhận Lệnh thì
+ hoatdong = true
+ toadoxuatphat sẽ lưu Location của nó
+ Location bắt đầu thay đổi theo Mouse
+ Add lại những quân cờ còn lại
+ Đặt bTracking=true nghĩa là chuột đang hoạt động
( công việc Add lại các quân cờ nhằm tránh tình trạng quân đang đi bị quân đứng yên đè lên )
Trong hàm MouseMove :
Nếu Quân Cờ nào đang hoạt động và chuột cũng đang hoạt động thì Quân Cờ đó sẽ di chuyển theo chuột
Trong hàm MouseUp : đây là bước xử lí quan trọng nhất và nặng nhất trong cả chương trình. Trong hàm MuoseUp, chúng ta cho chạy hai vòng for lồng nhau. Một vòng đến 9 và một vòng đến 10 để kiểm tra tất cả 90 Nút ẩn trên Bàn Cờ và xét tính hợp lệ của các quân cờ vừa đi.
Ví dụ cụ thể như sau :
Giả sử Quân cờ đang hoạt động và đang di chuyển là Xe Đỏ thì khi buông Xe Đỏ ở bất kì vị trí nào, ta phải xét :
* Nếu Xe Đỏ dự định đóng quân tại Nút bất kì nào đó trên Bàn Cờ, thì ta phải xét tiếp xem có Quân Cờ Đỏ nào nằm đó chưa.
+ Nếu đã có thì nước đi không hợp lệ, Xe Đỏ về vị trí cũ
+Nếu không thì Xe Đỏ sẽ nằm vào Nút đó
*Xét tiếp xem Xe Đỏ có đi hợp lệ từ vị trí trước đó đến Nút nó đang nằm khong, có đúng lượt hay không, sẽ bị mất Tướng hay không.
+Nếu không thì trả về và nước đi là không hợp lệ
+Nếu đã hợp lệ thì Xe Đỏ nằm đó và tiếp tục xét xem Xe Đỏ có ăn quân nào hay không, có chiếu đối phương hay không để phát ra âm thanh tương ứng
Riêng về hàm kiểm tra Xe Đỏ có đi hợp lệ hay không được viết:
Hàm bool XeDiHopLe(QuanXe Xe ,Point pBegin, Point pEnd):
Sẽ kiểm tra xem có quân cờ nào cản đường Xe hay không, và kiểm tra Xe đã đạt điều kiện tối thiểu hay chưa ? để chuyển giá trị Booleand đến cho hàm MouseUp xử lí.
Các Quân Cờ khác cũng được xử lí tương tự như Xe Đỏ trong ví dụ trên. Nhưng do tính năng và luật đi của mỗi loại đều khác nhau nên bố cục các bước xử lí có thể thay đổi chút ít. Nhưng về ý tưởng thì tất cả đều như nhau.
Chúng ta có thể tham khảo code để xem được chi tiết hơn các phần xử lí cho từng Quân Cờ cụ thể.
Xử lí sự kiện ăn : chương trình sẽ có hai hàm là CoDoAn và CoXanhAn. Trong hai hàm này, nếu một quân cờ đang hoạt động được buông ra hợp lệ và trùng tọa độ với một quân cờ tùy ý trong quân đối phương thì quân cờ đó của đối phương sẽ bị chết ( đưa về tọa độ 999,999 )
Xử lí các chức năng Back – Next : Mỗi nước đi hợp lệ, chương trình sẽ lưu tọa độ các quân cờ vào một mảng hai chiều với số dòng là chỉ số của nước đi, số cột là 32 con cờ trên bàn cờ. Kể cả các quân cờ đã bị ăn ( 999,999 ). Và mỗi nước đi hợp lệ, biến nuoc sẽ tăng giá trị , nuocmax chính là chỉ số của nước sau cùng trong ván cờ.
Sau đó, khi sử dụng chức năng Back thì nuoc--, Next thì nuoc++ và Load lên hiện trạng của nước đó.
Chức Năng Save – Open file *.cotuong : khi sử dụng chức năng Save, chương trình sẽ ghi ra một file text, chuyển tọa độ của tất cả các quân cờ về kiểu string và ghi chuổi đó vào trong file text vừa ghi ra rồi lưu lại. Do đó, khi ta Open with file *.cotuong này bằng Notepad chẳn hạn thì nội dung file sẽ là một chuỗi các con số. Tổng cộng là 32*6=192 kí số trong file đó ( vì tất cả các quân cờ đều có tọa độ gồm 6 kí tự : 3 cho X và 3 cho Y )
Khi người dùng Open file đã được lưu trước đó, thì chương trình làm một thao tác ngược lại với khi Save là : đọc file được người dùng ra lệnh mở, chuyển chuổi string trong file đó về dạng mảng kí tự, chuyên từng phần tử trong mảng kí tự đó về kiểu int và gán nó vào tọa độ tưng quân cờ tương ứng.
II.11 - Lớp MainMenu : MainMenu kế thừa từ Form. Là lớp chưa hàm Main của cả chương trình và là Form đầu tiên được Load lên khi chạy chương trình với mục đích giới thiệu các chức năng cơ bản của chương trình. Ý tưởng cho MainMenu cũng tương đối đơn giản
Lớp chỉ gồm các Label tạo ra các lựa chọn cho người chơi và xử lí khi người chơi lựa bất kì một chức năng nào
Cắt Form theo hình chữ nhật
// cat Form theo Hinh Chu Nhat
GraphicsPath Shape = new GraphicsPath();
// chen hcn tai toa do (0,29), size = kichthuoc Form
Shape.AddRectangle(new Rectangle(0, 29, this.Width,this.Height));
this.Region = new Region(Shape);
Tạo dragging cho Form : ( tham khảo code )
Tạo 4 Menu cho chương trình :
Tạo Label Play : Label Play nằm trên cùng, với BackColor=color.Transferent làm cho màu nền cua Label trở nên trong suốt.
Khi rề chuột đến, Label đổi màu sang màu khác và có âm thanh báo.
Khi Click vào Play để chơi thì chương trình sẽ ẩn đi MainMenu và chay Form MainGame cho người dùng sử dụng
this.Visible = false;
GameBoard.Visible = true;
Các sự kiện được xử lí trên các hàm MouseMove, MouseLeave, MouseClick của đối tượng Label Play
Các Label khác cũng tương tự như Play ( tham khảo code )
§3. Lời Kết
Trên đây là báo cáo đầy đủ về đồ án môn học Lập Trình windows của Nhóm 27 , Lớp K1C4.2 , trường Đại Học CNTT – ĐHQG TPHCM về game Cờ Tướng
Vì đây là Đồ Án đầu tiên của Nhóm chúng tôi, nên việc sai xot trong quá trình báo cáo là điều khó có thể tránh khỏi. Nhóm chúng tôi rất mong sự đóng góp ý kiến từ phía các bạn để chúng tôi có thể cải thiện chương trình trở nên hoàn thiện hơn.
Chúng em xin chân thành cảm ơn thầy Phạm Thi Vương đã tận tình hướng dẫn, hổ trợ cho chúng em trong thời gian qua để chúng em có thể hoàn thiện một cách cơ bản chương trình này !
Xin kính chào !
------------- Hết ------------
Các file đính kèm theo tài liệu này:
- Do An Mon Hoc.doc