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