II. 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à
Ø Với ống
Ta gán ‘in = 1’ và ‘out = 2’
Ø Với ống
Ta gán ‘in = 2’ và ‘out = 3’
Ø Với ống
Ta gán ‘in = 3’ và ‘out = 4’
Ø Với ống
Ta gán ‘in = 4’ và ‘out = 1’
Ø Với ống
1
4
3
Ta 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:
_Với ống :
Ta gán ‘in’ = 0, ‘out’ = 4.
_Với ống :
Ta gán ‘in’ = 0, ‘out’ = 1
_Với ống :
Ta gán ‘in’ = 0. ‘out’ = 2.
_Với ống :
Ta gán ‘in’ = 0, ‘out’ = 3.
v 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.
Hình 6 : ống bò chắn
Thay bơ
i
Hình 5 : thực hiện dầu chảy.
II.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.
(x,y)
x
y
0
Hình 7: vò trí (x,y).
• 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
mà 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
sẽ 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:
CAboutDlg.
COngdauDlg.
COngdauApp.
Ø Ngoài các lớp được tạo ra từ Wizard, ta còn tạo thêm các lớp :
CChung .
CLdiem .
CNhapten.
CMang.
CFlash.
Game1.
Game2.
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.
void 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).
afx_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 :
CWndThread
CWinApp
COngdauApp
_COngdauApp( )
_InitInstance( )
Không có nhận xét nào:
Đăng nhận xét