phân tích chi tiết trò chơi ống dầu
Trang 1II Phân tích chi tiết chương trình trò chơi ống dầu : II.1 Giải quyết các yêu cầu của trò chơi :
II.1.1 Các loại ống dẫn dầu và các qui định : v Có 7 loại ống dầu là:
Để kiểm tra được việc dầu có chảy được không ta dùng các biến “in” “out” để kiểm tra
v Ta qui định các cạnh lần lượt là
Trang 2Ta gán ‘in = 2’ và ‘out = 4 Ø Với ống
Ta gán ‘in = 1’ và ‘out = 3’ Ø Trường hợp đặc biệt
Ta gán ‘in = 5’ và ‘out = 5’ Ø Các loại ống khởi đầu:
Trang 3v Cách thể hiện dầu chảy : ta đặt các ống vào theo thứ tự như hình vẽ bên dưới(hình 5), ta sẽ thấy dầu chảy chậm trong ống Tương tự cho các ống khác ta cũng thực hiện như vậy
II.1.2 Vẽ khung của trò chơi:
Ta vẽ sẵn các button trên khung trò chơi gồm hàng đợi có 5 button và khung chơi là matrận[n hàng, m cột] với mỗi phần tử của ma trận cũng là một button, sau đó đặt các Bitmap nền vào matrận và hàng đợi để tạo thành khung trò chơi như (hình 2) Như đã nói sẽ có 3 khung cố định cho người sử dụng chọn đó là khung [6,8] , [7,9], [8,10] do đó ta phải tạo trên 3 dialog khác nhau
Để đặt đúng các bitmap vào khung ta dùng hàm LoadBitmaps và sử dụng mã ID của các bitmap đặt vào đó
II.1.3 Mảng của các ống dầu :
Mảng có kiểu là một cấu trúc gồm có các biến ‘in’, ‘out’ và trong chương trình ta có sử dụng phép gán giửa hai phần tử của mảng cho các ống dầu và đồng thời nhằm để kiểm tra dầu chảy theo các hướng vì vậy ta xây dựng một lớp là CMang Ví dụ như ở (hình 5) ta có ống khởi đầu với in=2 và out=4 do là ống khởi đầu nên không có đầu vào in, nhưng đối với các ống khác ta sẽ thấy có 2 đầu vào ra vì vậy dầu sẽ chảy theo 2 hướng như ta đã nói
Và 1 biến nữa thuộc lớp CMảng đó là m_button thuộc lớp CBitmapButton nhằm để gán dãy ma trận các button thuộc lớp này, để ta có thể đặt bitmap lên button 1 cách dể dàng
Trang 4II.1.4 Cách tính thời gian dầu chưa chảy(TimeOut) và thời gian dầu chảy qua từng ống :
Khi ấn Play để bắt đầu trò chơi thì đồng hồ timer được bật lên (FLAGS=TRUE) nhằm set thời gian TimeOut trước khi dầu bắt đầu chảy và thời gian dầu chảy qua từng ống trong khi chơi
• Ta dùng 1 progress để thể hiện thời gian TimeOut trước khi dầu chảy bằng cách tăng các ô trên progress từ vị trí hiện hành là 0 lên đến khi đầy thanh progress
• Sau khi progress được tô đầy thì dầu bắt đầu chảy(FLAGS=FALSE) qua từng ống Sau đó ta SetTimer dầu chảy qua các ống bằng với tốc độ người sử dụng đã nhập ban đầu Và sau mỗi màn thì tốc độ này sẽ được tăng lên
II.1.5 Kiểm tra dầu chảy :
Cứ sau một khoảng thời gian xác định thì dầu sẽ chảy qua ống kế tiếp Để kiểm tra dầu có tiếp tục chảy hay không ta xét ống vị trí (x , y) và nếu :
• Out=1 thì y = y-1 và kiểm tra ô có vị trí (x , y) biến ‘in’ có bằng 3 không?
_ Nếu bằng thì cho dầu tiếp tục chảy và cộng điểm _ Ngược lại kiểm tra biến ‘out’ có bằng 3 không?
_ Nếu bằng thì đổi ‘in’ thành ‘out’, ‘out’ thành ‘in’ và cho dầu tiếp tục chảy và cộng điểm
• Out=2 thì x = x-1 và kiểm tra ô có vị trí (x , y) biến ‘in’ có bằng 4 không?
_ Nếu bằng thì cho dầu tiếp tục chảy và cộng điểm _ Ngược lại kiểm tra biến ‘out’ có bằng 4 không?
_ Nếu bằng thì đổi ‘in’ thành ‘out’, ‘out’ thành ‘in’ và cho dầu tiếp tục chảy và cộng điểm
Trang 5• Out=3 thì y = y+1 và kiểm tra ô có vị trí (x , y) biến ‘in’ có bằng 1 không?
_ Nếu bằng thì cho dầu tiếp tục chảy và cộng điểm _ Ngược lại kiểm tra biến ‘out’ có bằng 1 không?
_ Nếu bằng thì đổi ‘in’ thành ‘out’, ‘out’ thành ‘in’ và cho dầu tiếp tục chảy và cộng điểm
• Out=4 thì x = x+1 và kiểm tra ô có vị trí (x , y) biến ‘in’ có bằng 2 không?
_ Nếu bằng thì cho dầu tiếp tục chảy và cộng điểm _ Ngược lại kiểm tra biến ‘out’ có bằng 2 không?
_ Nếu bằng thì đổi ‘in’ thành ‘out’, ‘out’ thành ‘in’ và cho dầu tiếp tục chảy và cộng điểm
• Trường hợp đặc biệt nếu kiểm tra thấy ô kế tiếp có ‘in’ = 5(trường hợp ống ngã tư) thì gán ‘out’ của ống ngã tư bằng ‘out’ của ô trước đó(tại vị trí (x,y))
Sau khi cho kiểm tra xong ta biết được mức vào của các ống là ‘in’ hay ‘out’: nếu là ‘in’ thì ta cho đặt các bitmap đó có mức vào là ‘in’, ngược lại ta đặt các ống theo mức ‘out’ Trường hợp đặc biệt ống ngã tư ngoài việc kiểm tra ‘in’, ‘out’ ta phải xét thêm ống đó có dầu chảy qua một hướng hay chưa nếu rồi thì ta đặt ống đã có dầu chảy rồi vào(xem hình8)
Ø Kiểm tra xem (x,y) có chạy ra ngoài mảng các ô không Nếu có thì ngưng và kiểm tra điểm
II.1.6 Cách tính điểm, thanh thông báo qua màn và tính màn(Level):
v Cách tính điểm: sau khi load các ống dầu vào khung của trò chơi và hết thời gian TimeOut, dầu bắt đầu chảy thì điểm sẽ tăng lên 50 điểm nếu dầu chảy qua 1 ống Còn nếu Click vào một ô đã có ống dầu thì ống hiện hành bị xóa đi và ống ở cuối hàng đợi sẽ được đặt vào và bạn sẽ bị trừ bớt một nửa số điểm
Hình 8: Trường hợp ống ngã tư đã có dầu 1 luồng
Trang 6mà dầu chảy qua 1 ống được cộng đó là 25 điểm Nếu số điểm này bằng 0 thì sẽ không bị trừ nữa
v Thanh thông báo qua màn: nó sẽ cho ta biết còn bao nhiêu lâu thì sẽ cho qua màn, bằng cách ta dùng một Progress để thể hiện việc này : ta cho mức thấp của Progress bằng 0, mức cao bằng với số ống tối thiểu mà dầu phải chảy qua trong 1 màn được qui định ban đầu của người sử dụng, và thanh progress này sẽ bị giảm xuống 0 nếu dầu chảy qua các ống tăng lên, cho đến khi bằng với số ống qui định ban đầu(nghĩa là thanh
progress sẽ bằng 0) thì sẽ có xuất hiện 1 thông báo ‘Bạn có thể
qua màn kế’ ngay kề bên thanh progress này
v Tính Level(màn) : Sau khi dầu ngừng chảy,thì ta xét dựa vào số ống đã có dầu chảy qua trên khung trò chơi và số ống tối thiểu mà người chơi đã nhập vào ban đầu như đã nói ở thanh thông báo qua màn
Ø Nếu số ống qui định qua 1 màn nhỏ hơn hoặc bằng(1) (<=)số ống dầu chảy được trên khung(2) thì cho qua màn kế
tiếp Trường hợp nếu số ống bị thay không quá 3 ống thì sẽ được thưởng 1000 điểm đồng thời màn kế tiếp người chơi sẽ được giảm bớt 3 ống mà dầu phải chảy qua trong màn
Ø Nếu (1) > (2) thì sẽ chơi lại từ màn 1
Ø Hoặc ta dựa vào thanh thông báo qua màn mà xác định có được qua màn mới hay không
II.1.7 Nhập Password cho màn thích hợp(chọn màn), chức năng Stop(đứng hình) và cho dầu chảy nhanh :
v Chọn màn : Khi ta chọn trên menu ‘Chọn màn’ của dialog trò chơi, thì sẽ cho xuất hiện bên dưới khung trò chơi 2 ô điều khiển: 1 ô combobox để chọn màn và 1 ô edit nhập tên password, và 1 nút ấn ‘OK’sau khi chon xong ta nhấn vào đây(xem hình2) Nếu đúng thì sẽ cho ta chơi màn đã chọn, ngược lại thì thông báo password sai và chơi tiếp màn hiên hành
v Dầu chảy nhanh : Khi người chơi đã đặt các ống dầu đầy khung trò chơi mà dầu chưa chảy hết thì ta ấn vào nút này dầu
Trang 7sẽ chảy nhanh giúp ta tiết kiệm thời gian hơn Ta thực hiện bằng cách cho thời gian TimeOut dầu chảy qua từng ống giảm xuống còn 1/10 (s) thì dầu sẽ chảy nhanh
v Stop(đứng hình): chức năng này sẽ được dùng khi ta cần làm việc gì quan trọng hơn thì ta sẽ ấn nút này để tạm dừng chương trình, và muốn chơi tiếp thì sẽ ấn vào 'OK' của Message Box tạm ngừng này Trái ngược với chức năng chảy nhanh ta cho KillTimer thời gian dầu chảy qua từng ống, nghĩa thông điệp WM_TIMER không còn gởi lại cho windows thì chương trình sẽ tạm ngừng
II.1.8 Thanh Menu :
Ta tạo thanh Menu với các chức năng như : chọn khung, hướng dẫn cách chơi, giới thiệu… cho khung dialog 1(hình1) Và thanh menu :chọn màn, đứng hình, chảy nhanh cho khung dialog trò chơi để người sử dụng có thể chọn các chức năng dể dàng hơn
II.2 Đặc tả các đối tượng của chương trình :
Chương trình hiện thực bằng Visual C++ 5.0 trên môi trường Windows 95 Chương trình trò chơi ống dẫn dầu hầu như sử sụng chuột là chủ yếu
Ø Chương trình có tên là Ongdau
Ø Khi tạo dựa vào ‘Dialog based’ của ‘MFCAppWizard(exe)’ II.2.1 Các class trong chương trình :
Ø Wizard sẽ sinh ra các lớp sau:
Trang 8Game2 Game3 Giupdo
(a) Đối tượng COngdauDlg : được thừa kế từ lớp CDialog, được dùng để hiển thị khung đối thoại lên màn hình, đối với chương trình COngdauDlg đại diện cho khung trò chơi với các ô điều khiển Bao gồm các hàm sau : virtual BOOL OnInitDialog() : sẽ được gọi vào khi tất cả các ô điều
khiển đã được tạo ra và trước khi khung đối thoại được hiển thị
afx_msg void OnBatdau() : Hàm này sẽ thực thi khi người sử dụng chọn nút bắt đầu
afx_msg void OnUpdateKhung68(CCmdUI* pCmdUI) : dùng để cập nhật thông tin khi người chơi chọn trên menu ‘Khung68’
afx_msg void OnKhung68() : sẽ thực hiện nếu menu ‘Khung68’ được chọn
afx_msg void OnKhung79();
afx_msg void OnUpdateKhung79(CCmdUI* pCmdUI); afx_msg void OnKhung810();
afx_msg void OnUpdateKhung810(CCmdUI* pCmdUI);
virtual void DoDataExchange(CDataExchange* pDX) :dùng để trao đổi giá trị các biến
afx_msg void OnOngdauBatdau() : Hàm tạo ra trên thanh menu
afx_msg void OnHuongdan() : dùng để hiển thị khung hướng dẫn cách chơi cuả trò chơi này
(b) Đối tượng COngdauApp : COngdauApp chính là giao tiếp thực sự giữa ta và chương trình Windows Đối tượng này xử lý những Window message và gửi chúng tới cửa sổ của ta để ta có thể biết những gì đang xảy ra
(c) Đối tượng CChung : được thừa kế bởi lớp CWnd, dùng để thiết đặt các thuộc tính và tác vụ sử dụng chung cho các lớp Game1, Game2, Game3 Gồm có các hàm như :
void Kiemtradauchay() : Kiểm tra dầu chảy qua các ống và xét thắng thua
void xoaongchuacodau() : hàm này sau khi dầu tràn sẽ xoá các ống mà chưa có dầu chảy qua
void datbitmapin() : Đặt các bitmap theo chiều ‘in’ vào khung
Trang 9void datbitmapout() : Đặt các bitmap theo chieu out vào khung
void reset() : dùng để đặt các bitmap nền và ống khởi đầu lên khung, đặt ngẫu nhiên các ống dầu lên hàng đợi
void Hientenpasswd() : dùng để hiện password(mật mã) khi chơi xong các màn 4, 8, 12, 16
void Xetthangthua() : Kiểm tra ống dầu đặt được trên khung và ống qui đinh dầu phải chảy qua trong một màn để kiểm tra thắng thua
void reverse() : hàm này dùng để đảo các mức ra ‘out’ thành mức vào ‘in’
BOOL kiemtra(int n) : kiểm tra dầu có thể chảy tiếp hay không
(d) Đối tượng CMang : lớp này cũng được thừa kế bởi lớp CWnd, dùng để thiết đặt các thuộc tính để sử dụng vào việc kiểm tra dầu chảy và đặt các bitmap vào khung trò chơi
void operator=(CMang &p) : nhằm gán các thuộc tính ‘in’, ‘out’ cho trỏ đến địa chỉ của CMang
(e) Đối tượng Game1, Game2, Game3 :Các lớp này được thừa kế từ lớp Cdialog, dùng để hiển thị dialog, các ô diều khiển , và giải quyết các thông điệp như WM_TIMER, OnCommand, WM_PAINT, WM_INITDIALOG… Cả 3 dối tượng này đề có các hàm chung
virtual BOOL OnInitDialog() : sẽ được gọi vào khi tất cả các ô điều khiển đã được tạo ra và trước khi khung đối thoại được hiển thị Cho gọi đến mục quản các ô điều khiển trước tiên
virtual void DoDataExchange(CDataExchange* pDX) : dùng để trao đổi dữ liệu giá trị các biến
afx_msg void OnDunghinh() : Hàm này cho đứng tạm dừng chương trình
afx_msg void OnTimer(UINT nIDEvent) : Dùng để thiết đặt bộ định thời Timer Thông điệp này sẽ được gọi đến sau những khoảng thời gian bằng nhau thông qua hàm SetTimer() và bị hủy bởi hàm KillTimer()
afx_msg void OnChaynhanh() : Ta sẽ cho thời gian dầu chảy qua từng ống nhanh hơn
afx_msg void OnThoat() : Thoát khỏi chương trình bởi hàm exit(0)
Trang 10afx_msg void OnChonmanChon() : Cho người chơi chọn màn có mật mã để chơi tiếp mà không phải chơi lại từ đầu
afx_msg void OnPasswdok() : khi chọn màn và nhập password xong nhấn ‘OK’ hàm này sẽ giải quyết, xem password đúng hay sai để tiếp tục chương trình
afx_msg void OnGioithieu() : dùng để giới thiệu
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam) : hàm này giải quyết thông điệp từ các ô điều khiển gởi đi như : đặt các bitmap vào khung, và đặt các bitmap vào đầu hàng đợi đồng thời dồn các bitmap kia xuống cuối hàng đợi
(f) Đối tượng CLdiem : Dùng để hiển thị điểm và tên người chơi khi lưu điểm cao
afx_msg void OnLButtonUp(UINT nFlags, CPoint point) : nếu click vào bất cứ chỗ nào trên khung lưu điểm thì nó tự động thoát
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX); (g) Đối tượng CNhapten : Dialog nhập tên
afx_msg void OnNhap() : hàm này dùng để nhập tên vào trong khung lưu điểm
virtual void DoDataExchange(CDataExchange* pDX); (h) Đối tượng CFlash : là dialog biểu tượng của trò chơi
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point) : Khi ta ấn vào khung sẽ hiện ra dialog 1(hình 1)
(i) Đối tượng Giupdo: là 1 dialog dùng để hướng dẫn cách chơi chương trình trò chơi ống dầu
II.2.2 Sơ đồ thừa kế các lớp :