1. Trang chủ
  2. » Luận Văn - Báo Cáo

Giải thuật C Sharp.pdf

9 700 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giải Thuật C Sharp
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Phần Mềm
Thể loại bài luận
Năm xuất bản 2023
Thành phố Hồ Chí Minh
Định dạng
Số trang 9
Dung lượng 31,78 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Giải thuật C Sharp

Trang 1

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;

Trang 2

}

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

Trang 3

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);

Trang 4

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

Trang 5

Ø 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

Trang 6

Ø Ngược lại (x,y) nằm ngoài (sốhàng, sốcột) thì không cho dầu

chảy

Ø Trường hợp đặc biệt ống dầu ngã tư :

_Nếu mức vào = 5 thì ta sẽ kiểm tra mức ra và cho dầu chảy phụ thuộc vào mức ra này

III.6 Dầu chảy nhanh, đứng hình(stop), thanh thông báo qua màn :

v Đứng hình(stop): Khi ấn vào nút stop dầu sẽ ngưng chảy để thực hiện điều này ta dùng hàm KillTimer để hủy thời gian SetTimer lúc đầu, sau đó ta cho thông báo 1 thông điệp tạm dừng nếu người chơi Click ‘OK’ trên thông điệp ta sẽ cho thiết đặt lại hàm SetTimer để dầu có thể chảy tiếp

void Game1::OnDunghinh()

{

if(pch.f_passwd == FALSE) {

CString msg;

KillTimer(1);

msg="Chuong Trinh Tam Dung \n Nhan OK De Tiep Tuc"; AfxMessageBox(msg);

SetTimer(1,100,NULL);

} }

v Cho dầu chảy nhanh:

Ø Nếu người sử dụng Click vào nút này thì ta cho bật Timer và cho tăng tốc độ dầu chảy lên gấp 10 lần so với thời gian ban đầu

do người sử dụng nhập vào

void Game1::OnChaynhanh()

{

pch.f_chaynhanh=TRUE;

KillTimer(1);

SetTimer(1,50,NULL);

} }

v Thanh báo qua màn : thanh này cũng được biểu diễn bằng một Progress giảm dần xuống 0, với mức thấp là 0 và mức cao là số ống qua một màn do người dùng nhập vào ban đầu trước khi chơi, còn bước nhảy sẽ là số ống mà dầu chảy qua từng ống Nó sẽ cho

ta biết còn bao lâu thì ta sẽ được qua màn kế tiếp

pch.n_quaman = pch.n_ong;

Trang 7

ch.n_quaman =pch.m_quaman – 1;

m_progress2.SetRange(0,pch.n_quaman);

m_progress2.SetPos(pch.n_quaman);

III.7 Hàm OnCommand() : hàm này sẽ sử lý thông điệp đối với những

thông tin gởi đi từ các ô điều khiển

Ø Hàm này cho phép ta đặt các ống dầu vào hàng đợi Để thực hiện điều này ta cho đặt ngẫu nhiên các ống dầu vào hàng đợi nhưng trong đó không có các ống khởi đầu

Ø Khi một ống từ hàng đợi đặt vào khung trò chơi thì sẽ lấy ngẫu nhiên 1 ống khác đặt vào đầu hàng đợi các ống khác được dồn xuống cuối Các ống dầu đặt lại sẽ bị trừ điểm

BOOL Game1::OnCommand(WPARAM wParam, LPARAM lParam)

{

int i;

unsigned int m,n;

m = (wParam / 100) % 100; // gán biến m,n cho thông số wParam để cho biết

n = wParam % 100; // mã nhận diện của ô điều khiển(button) if(pch.f_passwd == FALSE)

{

if(m<0 || m>hang || n<0 ||n>cot) return CDialog::OnCommand(wParam, lParam);

if(pch.array1[m][n].co) return CDialog::OnCommand(wParam, lParam);

else { if(pch.array1[m][n].nen!=IDB_BITMAPNEN)

pch.c_ongbithay -= 1;

if(pch.c_diem>=25) {

pch.c_diem -= 25; //ống dầu đặt lại sẽ bị trừ điểm

m_diem = pch.c_diem;

} }

pch.c_demong += 1;

pch.array1[m][n] = pch.array2[4]; // đặt ống cuối hàng đợi

// vào khung

Trang 8

n, NULL,NULL);

pch.array1[m][n].m_button.Invalidate(FALSE);

for(i=4; i>0; i) //dồn các ống xuống cuối hàng đợi

pch.array2[i] = pch.array2[i-1];

pch.array2[0] = pch.array3[rand()%7]; // đặt 1 ống ngẫu nhiên vào

{

pch.array2[i].m_button.LoadBitmaps(pch.array2[i].nen , NULL,NULL);

pch.array2[i].m_button.Invalidate(FALSE);

} UpdateData(FALSE);

} }

return CDialog::OnCommand(wParam, lParam);

}

III.8 Hàm OnInitDialog() :Hàm này 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ị

Ø Ở đây ta cho gọi các ô khiển button vào phân lớp động bởi hàm SubclassDlgItem( ) để gắn điều khiển đó vào CWnd, khi điều

khiển là phân lớp động thì windows sẽ gơỉ qua thông điệp của

CWnd và gọi thông điệp những mục quản của CWnd trước tiên

Ø Ta cho gán mức vào, ra cho các ống ‘in’=0, ‘out’=1

BOOL Game1::OnInitDialog()

{

CDialog::OnInitDialog();

unsigned int i,j;

int t1=10000;

int t2=100;

unsigned int a[7][2]={{1,2},{2,3},{3,4},{4,1},{2,4},{1,3},{5,5}};

for(i=0; i<7; i++)

{

pch.array3[i].in = a[i][0];

pch.array3[i].out = a[i][1];

pch.array3[i].nen = (t2*5)+(i+1)*10+1;

}

pch.st->m_button.SubclassDlgItem(2030,this);

pch.nh->m_button.SubclassDlgItem(2028,this);

for(i=0; i<5; i++)

VERIFY(pch.array2[i].m_button.SubclassDlgItem((t1/5)+i,this));

Trang 9

for(j=0; j<hang; j++)

for(i=0; i<cot; i++)

ASSERT(pch.array1[j][i].m_button.SubclassDlgItem(t1+(t2*j)+i,this));

UpdateData(FALSE);

reset();

Invalidate();

return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE

}

Ngày đăng: 23/08/2012, 13:21

TỪ KHÓA LIÊN QUAN

w