Tải bản đầy đủ (.pdf) (9 trang)

Các giải thuật của chương trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (31.78 KB, 9 trang )

III. Các Giải thuật của chương trình :
III.1. CMang() :
Ta sử dụng mảng 2 chiều array1[8][10] tương ứng mảng các ô nhận tác
động Click để đặt ống vào, mảng 1 chiều array2[5] hoạt động như một hàng
đợi. Một mảng 1 chiều array3[7] dùng để chứa tất cả các loại ống. Mỗi phần
tử của 3 mảng này gồm có các biến ‘in’ ‘out’ ‘nen’ nhằm để kiểm tra dầu
có thể tiếp tục chảy hay không và m_button thuộc CBitmapButton để ta có
thể đặt các bitmap lên button.
Do đó 3 mảng có kiểu là một cấu trúc gồm có các biến ‘in’ ‘out’ ‘nen’
và m_button 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 vì vậy ta xây dựng một lớp là CMang
class CMang : public CWnd
{
public:
CMang();
public:
BOOL flag;
CBitmapButton m_button;
void operator=(CMang &p);
unsigned int pic;
unsigned int out;
unsigned int in;
virtual ~CMang();
protected:
};
CMang::CMang()
{
in=0;
out=0;
pic=IDB_BITMAPNEN;
flag=FALSE;


}
CMang::~CMang()
{

}
void CMang::operator =(CMang & p)
{
in=p.in;
out=p.out;
pic=p.pic;
}
III.2. Hàm RESET( ) :
Ø Nhằm thiết đặt lại trang thái ban đầu của trò chơi.
Ta cho cờ FLAGS=TRUE trường hợp dầu chưa chảy.
f_start = TRUE; // cho dầu chảy ống khởi đầu.
f_killtimer = FALSE;// cờ này sẽ hủy Timer để thông báo.
f_xoa = FALSE; // cờ xóa các ống chưa có dầu chảy qua khi dầu
tràn.
f_chaynhanh = FALSE ; // dùng cho dầu chảy nhanh
f_passwd = FALSE;
Ø Sau đó ta dùng vòng for để xét array1[m][n]:
For(i=0; I<hàng; i++)
For(j=0; j<cột; j++)
_Ta gán các BitmapNen(array1) cho các biến ‘in’, ‘out’ bằng
0.
_Bật cờ FLAGS bằng FALSE cho phép dầu chảy.
Ø Xét hàng đợi(array0[i]):
For(i=0; i<5, i++)
_Cho đặt ngẫu nhiên các ống dầu array3[j] vào hàng đợi
array2[i].

_Cho đặt ngẫu nhiên các ống khởi đầu(source)
s[4]={1,2,3,4} vào khung trò chơi nhưng không trùng với
4 cạnh củoa khung array[m][n].
_Gán mức vào của ống nguồn bằng 0,mức ra bằng
s[k].Và ống này ta xét cho dầu chảy rồi(flag=TRUE).
III.3. Password() -(mật mã) :
Ø Ngươiø chơi chọn màn và nhập password .
Ø Nếu người sử dụng nhập màn không có password thì sẽ có thông
báo là không có password màn đó.
Ø Ngược lại nếu đúng màn có passwd thì sẽ kiểm tra bằng cách
so sánh 2 chuỗi với nhau:
_ Nếu bằng thì cho hiện đúng số màn đã chọn và cho tốc độ
phù hợp với màn đó.
_ Nếu không thì cho hiện thông báo messagebox báo nhập sai
và cho chơi tiếp màn hiệi hành.

void Game1::OnPasswdok()
{
CString m_chonsoman;
CString m_tenpasswd;
pch.f_passwd = FALSE;
UpdateData(TRUE);
if((atoi(m_chonsoman) % 4) != 0)
AfxMessageBox("Khong co Password man nay ! \n Vui long chon
man trong khung combobox !");
switch(atoi(m_chonsoman))
{
case 4 :
if(m_tenpasswd.Compare("son")==0)
{

pch.c_man = 4;
pch.c_diem = 0;
pch.n_tocdo = (2000-200);
pch.status =0;
pch.reset();
}
else
if(MessageBox("Password khong dung !","Thong
bao",MB_ICONHAND|MB_APPLMODAL)==IDOK);
break;
case 8 :
if(m_tenpasswd.Compare("vietnam")==0)
{
pch.c_man = 8;
pch.c_diem = 0;
pch.n_tocdo = (2000-400);
pch.status =0;
pch.reset();
}
else
if(MessageBox("Password khong dung !","Thong
bao",MB_ICONHAND|MB_APPLMODAL)==IDOK);
break;
case 12 :
if(m_tenpasswd.Compare("ronaldo")==0)
{
pch.c_man = 12;
pch.c_diem = 0;
pch.n_tocdo = (2000-600);
pch.status =0;

pch.reset();
}
else
if(MessageBox("Password khong dung !","Thong
bao",MB_ICONHAND|MB_APPLMODAL)==IDOK);
break;
case 16 :
if(m_tenpasswd.Compare("rose")==0)
{
pch.c_man = 16;
pch.c_diem = 0;
pch.n_tocdo = (2000-800);
pch.status =0;
pch.reset();
}
else
if(MessageBox("Password khong dung !","Thong
bao",MB_ICONHAND|MB_APPLMODAL)==IDOK);
break;
}
III.4. Hàm OnTimer() cùng với tính điểm,màn(Level) & tốc độ dầu chảy :
Ø
Nếu FLAGS=TRUE (dầu chưa chảy)
Ø Nếu TimeOut>1000(mức cao của progress thể hiện thời gian
dầu chưa chảy). Thì ta gán start=0.
Ngược lại ta tăng start=start+10;
_ Cho prpgress cho chạy từ start lên 1000(mức cao của progress)
_ Cho phép đặt ống dầu vào khung trò chơi.
Ø
Nếu start=1000 Thì cho FLAGS=FALSE(dầu bắt đầu chảy)

_ Hủy Timer đã thiết đặt cho thanh và thiết đặt Timer cho tốc độ
dầu chảy qua từng ống.
Ø
Nếu hàm kiemtra() ngưng :
Ø Cho xóa các ống dầu chưa có dầu chảy qua.
Ø Nếu (ống đã có dầu chảy qua trên khung trò chơi >= số ống
tối thiểu mà người chơi đã nhập vào ban đầu ) Thì cho thông
báo chơi màn tiếp theo đồng thời tăng tốc độ,level và Reset
lại.
Ø
Ngược lại thông báo thua: cho lưu điểm cao và trở lại từ đầu
màn 1 hoặc thoát khỏi chương trình.
Ø Ngược lại thay ống chưa có dầu thành ống đã có dầu ,
Điểm = điểm + 50 ;
Số ống = sống + 1;
Đặt các ống dầu vào khung của trò chơi;
Bật cờ flag tại vò trí (x,y) này thành TRUE(ống đã có
dầu không bò thay thế).
III.5. Hàm Kiemtra():
v Kiemtra():
Ø Ta xét 4 trường hợp switch(n) tại vò trí dầu chảy (x,y):
Ø TH1: nếu out=1:
Ta gán y=y-1;
_ Nếu (mức vào của ô này=3 (array1[x][y].in = 3) ) cho
phép dầu chảy.
_ Nếu (mức ra của ô =3 (array1[x][y].out = 3) ) thì ta
hoán vò mức ra thành mức vào rồi cho phép dầu chảy.
Ø TH2: out=2:
Ta gán x=x-1;
_ Nếu (mức vào của ô này=4 (array1[x][y].in = 4) ) cho

phép dầu chảy.
_ Nếu (mức ra của ô =4 (array1[x][y].out = 4) ) thì ta
hoán vò mức ra thành mức vào rồi cho phép dầu chảy.
Ø TH3: out=3:
y=y+1;
_ Nếu (mức vào của ô này=1 (array1[x][y].in = 1) ) cho
phép dầu chảy.
_ Nếu (mức ra của ô =1 (array1[x][y].out = 1) ) thì ta
hoán vò mức ra thành mức vào rồi cho phép dầu chảy.
Ø TH4: out=4:
Ta gán x=x+1;
_ Nếu (mức vào của ô này=2 (array1[x][y].in = 2) ) cho
phép dầu chảy.
_ Nếu (mức ra của ô =2 (array1[x][y].out = 2) ) thì ta
hoán vò mức ra thành mức vào rồi cho phép dầu chảy.

×