Ãëàâíàÿ Ó÷åáíèêè - Ðàçíûå Ëåêöèè (ðàçíûå) - ÷àñòü 32
|
Ãîñóäàðñòâåííûé êîìèòåò Ðîññèéñêîé Ôåäåðàöèè ïî âûñøåìó îáðàçîâàíèþ Êàçàíñêèé ãîñóäàðñòâåííûé òåõíè÷åñêèé óíèâåðñèòåò èìåíè À.Í. Òóïîëåâà -------------------------------------------------------------- Êàôåäðà ÀÑÎÈÓ ïî îñíîâàì ïðîãðàììèðîâàíèÿ ÈÃÐÀ «Parovoz» ÈÑÏÎËÍÈÒÅËÜ: ñòóäåíòêà ãðóïïû 4221 Ïåòðîâà Å.Ã. ÐÓÊÎÂÎÄÈÒÅËÜ: Âàôèí Ð.Ð. Îöåíêà____________________________ Ïîäïèñü___________________________ "____"________________________2001ã. ÊÀÇÀÍÜ 2001ã. ÑÎÄÅÐÆÀÍÈÅ 1.Îïèñàíèå ïðèìåíåíèÿ ._____________________________________________ 3 1.1. Çàïóñê ïðîãðàììû._____________________________________________ 3 1.2. Ïðàâèëà èãðû._________________________________________________ 3 2. Îïèñàíèå ïðîãðàììû ._____________________________________________ 4 2.1. Ìåòîä ðåøåíèÿ çàäà÷è .__________________________________________ 4 2.2. Îïèñàíèå èñïîëüçóåìûõ êëàññîâ, ñòðóêòóð è ôóíêöèé.______________ 4 2.2.1. CApp - êëàññ ïðèëîæåíèÿ .______________________________________________ 4 2.2.2. CÌainWnd- êëàññ ãëàâíîãî îêíà .________________________________________ 4 2.2.3. Êàðòà ñîîáùåíèé._____________________________________________________ 5 2.3. Îáðàç ãëàâíîãî îêíà.______________________________________________ 6 Ïðèëîæåíèå________________________________________________________ 7 Ëèñòèíã ôàéëà main.cpp_____________________________________________ 7 Ëèñòèíã ôàéëà main.h______________________________________________ 12 Ëèñòèíã ôàéëà menu1.h____________________________________________ 13 Ëèñòèíã ôàéëà menu1.rc____________________________________________ 13 Çàïóñê ïðîãðàììû
íåîáõîäèìî ïðîèçâîäèòü , íàõîäÿñü â ñðåäå Windows 95 :
çàïóñêàåìûé ôàéë – parovoz.exe
. Ïîñëå çàïóñêà èãðû, íà ýêðàíå ïîÿâëÿåòñÿ îêíî ñ
íàäïèñüþ «âûáåðèòå ïóíêò ñòàðò». Îêíî èìååò ìåíþ, ñîñòîÿùåå èç íåñêîëüêèõ
ïóíêòîâ. Ñ ïîìîùüþ ïóíêòîâ ìåíþ ìîæíî: èçìåíÿòü öâåò äâèæóùåãîñÿ îáúåêòà
(ïàðîâîçèêà â êðàñíûé, ñèíèé, çåë¸íûé), íà÷àòü (ïåðåçàïóñòèòü), îñóùåñòâèòü
âûõîä èç èãðû. Ïîñëå âûáîðà ïóíêòà ìåíþ «ñòàðò», â ëåâîì íèæíåì óãëó îêíà
ïîÿâëÿåòñÿ ïàðîâîç, ïðåäñòàâëÿþùèé ñîáîé ñîâîêóïíîñòü ãåîìåòðè÷åñêèõ ôèãóð –
ýëëèïñîâ (êîë¸ñà) è ïðÿìîóãîëüíèêîâ (êàáèíà, òðóáû). Ïàðîâîç äâèæåòñÿ ñëåâà
íàïðàâî è îñòàíàâëèâàåòñÿ ïåðåä ñâåòîôîðîì, ðàñïîëîæåííûì ïðèáëèçèòåëüíî â
ñåðåäèíå îêíà íàä ïàðîâîçîì. Ïîëüçîâàòåëü èìååò âîçìîæíîñòü ðåãóëèðîâàòü öâåòîì
ñâåòîôîðà íàæàòèåì êëàâèøü ‘ê’, ‘ç’, ‘æ’,
ñîîòâåòñòâóþùèì öâåòàì ñâåòîôîðà – êðàñíîìó, çåëåíîìó, æ¸ëòîìó. Åñëè ïàðîâîç
ïîäúåçæàåò ê ñâåòîôîðó, à ó ñâåòîôîðà àêòèâíûì ÿâëÿåòñÿ çåë¸íûé öâåò, îí
ïðîäîëæàåò ñâî¸ äâèæåíèå.  ïðîòèâíîì ñëó÷àå, ïàðîâîç îñòàíàâëèâàåòñÿ. Ïðè
äîñòèæåíèè ïðàâîé ñòåíêè, ïàðîâîç ïîÿâëÿåòñÿ ó ëåâîé ñòåíêè, à àêòèâíûì öâåòîì
ñâåòîôîðà ñòàíîâèòñÿ æ¸ëòûé öâåò. Èç âåðõíåé ÷àñòè ïàðîâîçà ïîñòîÿííî
ïîäíèìàþòñÿ â âåðõíþþ ÷àñòü îêíà îêðóæíîñòè, ïðåäñòàâëÿþùèå ñîáîé êëóáíè äûìà,
êîòîðûå óâåëè÷èâàþòñÿ ïðè ïîäú¸ìå. Ïðîãðàììà
âûïîëíåíà â ñòèëå îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ, èñïîëüçîâàííà
áèáëèîòåêà MFC. Ñàìà ïðîãðàììà - ïðèëîæåíèå Windows. Äëÿ
âûâîäà ãðàôè÷åñêèõ îáúåêòîâ èñïîëüçóþòñÿ ôóíêöèè: Elliplse, Rectangle. Ïðîãðàììîé îáðàáàòûâàþòñÿ ñîáûòèÿ îò òàéìåðà, íàæàòèÿ êëàâèøü íà
êëàâèàòóðå, âûáðà ñîîòâåòñòâóþùèõ ïóíêòîâ ìåíþ, à òàêæå ñîáûòèå WM_PAINT äëÿ ïåðåðèñîâêè ðàáî÷åé îáëàñòè. CApp - êëàññ
ïðèëîæåíèÿ, ïîðîæäàåòñÿ êëàññîì CWinApp
áèáëèîòåêè MFC îáåñïå÷èâàåò
èíèöèàëèçàöèþ , âûïîëíåíèå è çàâåðøåíèå Windows ïðîãðàììû
: ðåãèñòðèðóåò , ñîçäà¸ò è îòîáðàæàåò îñíîâíîå îêíî ïðèëîæåíèÿ . ×ëåí-
ôóíêöèè êëàññà CApp : InitInstance – âèðòóàëüíàÿ
ôóíêöèÿ, ïåðåîïðåäåëÿåòñÿ â êëàññå CApp CMainWnd - êëàññ
ãëàâíîãî îêíà ïðèëîæåíèÿ , íàñëåäóåòñÿ èç êëàññà CFrameWnd áèáëèîòåêè MFC .) ×ëåí
- äàííûå êëàññà ÑMainWnd
: CRect
wnd; /*ðàçìåð îêíà*/ CRect
kol1,kol2,korp,kr,temp; /*ïðÿìîóãîëüíèêè*/ CRect
svet,ball1,ball2,ball3;/*ïðÿìîóãîëüíèêè*/ CBrush
br1[3],br2; /*êèñòè*/ CBrush
sv[4]; /*öâåòà ñâåòîôîðà*/ CRect
noga; /*íîãà ñâåòîôîðà*/ CRect
balls[5]; /*øàðèêè äûìà*/ CRect
kr2; //êàáèíà int
numball; //íîìåð äûìà int
live[5]; //ïðèçíàê æèçíè äûìà bool
game; /*ïðèçíàê èãðû èëè âíå èãðû*/ int
color; /*íîìåð öâåòà ïàðîâîçà*/ int
ns; /*íîìåð óâåòà ñâåòîôîðà*/ int
move; /*ôëàã äâèæåíèÿ ïàðîâîçà* /×ëåí
- ôóíêöèè êëàññà ÑMainWnd
: CmainWnd(); - êîíñòðóêòîð êëàññà îêíà afx_msg
void OnBegin();îáðàáîò÷èê ñîáûòèÿ íà âûáîð ïóíêòà ìåíþ «ñòàðò» afx_msg
void OnRed(); - îáðàáîò÷èê ñîáûòèÿ íà âûáîð ïóíêòà ìåíþ «Red» afx_msg
void OnGreen(); - îáðàáîò÷èê ñîáûòèÿ íà âûáîð ïóíêòà ìåíþ «Green» afx_msg
void OnBlue(); - îáðàáîò÷èê ñîáûòèÿ íà âûáîð ïóíêòà ìåíþ «Blue» afx_msg void
OnPaint(); - ô-èÿ ïåðåðèñîâêè afx_msg void
OnTimer( UINT nIDEvent ); - îáðàá-÷èê òàéìåðà afx_msg
void OnExit(); - îáðàáîò÷èê ñîáûòèÿ íà âûáîð ïóíêòà ìåíþ «Exit» afx_msg void
OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ); - ðåàêöèÿ íà íàæàòèå êëàâèøè
êëàâèàòóðû DECLARE_MESSAGE_MAP() - êàðòà
ñîîáùåíèé BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd) ON_COMMAND(IDM_EXIT,OnExit) ON_COMMAND(IDM_BEGIN,OnBegin) ON_COMMAND(IDM_RED,OnRed) ON_COMMAND(IDM_GREEN,OnGreen) ON_COMMAND(IDM_BLUE,OnBlue) ON_WM_PAINT() ON_WM_TIMER() ON_WM_CHAR() END_MESSAGE_MAP()
Ðèñ. 1. Ãëàâíîå îêíî ïîñëå âûáîðà ïóíêòà «ñòàðò»
Ðèñ. 2. Ãëàâíîå îêíî äî âûáîðà ïóíêòà «ñòàðò» /* â ýòîì ôàéëå íàõîäÿòñÿ îïèñàíèÿ âñåõ ôóíêöèé */ #include
<afxwin.h> #include
"main.h" #include
"menu1.h" CMainWnd::CMainWnd() /*êîíñòðóêòîð
ãë. îêíà*/ { wnd.SetRect(0,0,400,355);//óñòàí-êà
ðàçìåðîâ îêíà Create(NULL,"parovoz",WS_DLGFRAME
,wnd,NULL,"MAINMENU"); game=false; /*íåò
èãðû*/ color=0; /*íà÷.
öâåò ïîåçäà*/ ns=0; /*íà÷.
öâåò ñâåòîôîðà*/ br1[0].CreateSolidBrush(RGB(255,0,0));//ñîçäàíèå
êèñòåé br1[1].CreateSolidBrush(RGB(0,255,0)); br1[2].CreateSolidBrush(RGB(0,0,255)); sv[0].CreateSolidBrush(RGB(255,0,0));//ñîçäàíèå
êèñòåé sv[1].CreateSolidBrush(RGB(0,255,0));//ñâåòîôîðà sv[2].CreateSolidBrush(RGB(255,255,0)); sv[3].CreateSolidBrush(RGB(128,128,128)); br2.CreateSolidBrush(RGB(1,1,1));/*÷¸ðíûé
öâåò*/ for(numball=0;numball<5;numball++)
{//îáíóëåíèå
ïðèçíàêîâ æèçíè äûìà live[numball]=0; } } BOOL CApp::
InitInstance()/*ô-èÿ èíèöèàëèçàöèè îêíà*/ { m_pMainWnd=new
CMainWnd; /*ñîçä îáúåêòà îêíà*/ m_pMainWnd->ShowWindow(m_nCmdShow); /*ïîêàçàòü
îêíî*/ return
true; /*óäà÷íîå çàâåðøåíèå*/ } afx_msg void
CMainWnd::OnPaint() /*ô-èÿ ïåðåðèñîâêè*/ { CPaintDC
dc(this); /*ñîçäàíèåå êîíòåêñòà îêíà*/ dc.SelectObject(&br2); /*âûáîð
êèñòè äëÿ ñâåòîôîðà*/ dc.Rectangle(svet); //ðèñîâàíèå
êîðï. ñâåòîôîðà dc.Rectangle(noga); //ðèñîâàíèå
íîãè for(numball=0;numball<5;numball++) {//ðèñîâàíèå
äûìà if(live[numball]==1)//åñëè
äûì àêòèâåí { dc.Ellipse(balls[numball]); } } switch(ns) /*ïåðåêëþ÷åíèå
ìåæäó öâåòàìè ñâåòîôîðà*/ { case
0: /*åñëè êðàñíûé*/ { dc.SelectObject(sv[0]); dc.Ellipse(ball1); dc.SelectObject(sv[3]); dc.Ellipse(ball2); dc.Ellipse(ball3); break; } case
1: /*åñëè æ¸ëòûé*/ { dc.SelectObject(sv[2]); dc.Ellipse(ball2); dc.SelectObject(sv[3]); dc.Ellipse(ball1); dc.Ellipse(ball3); break; } case
2:/*ååñëè çåëåíûé*/ { dc.SelectObject(sv[1]); dc.Ellipse(ball3); dc.SelectObject(sv[3]); dc.Ellipse(ball1); dc.Ellipse(ball2); break; } } dc.SelectObject(br1[color]); /*ðèñîâàíèå
ïàðîâîçà*/ dc.Rectangle(korp); //êîðïóñ dc.SelectObject(&br2); dc.Rectangle(kr); //òðóáà dc.Rectangle(kr2); //êàáèíà dc.Ellipse(kol1); //êîëåñà dc.Ellipse(kol2); char
*s="âûáåðåòå ìåíþ ñòàðò.";//íà÷àëüíàÿ íàäïèñü if(game==0)
dc.TextOut(50,100,s,strlen(s)); } void
CMainWnd::OnExit() /*ðåàêöèÿ íà âûõîä*/ { SendMessage(WM_CLOSE); /*ïîñëàòü
ñîîáùåíèå î çàêðûòèè îêíà*/ } afx_msg void
CMainWnd::OnTimer( UINT nIDEvent ) {/*îáðàáîò÷èê
òàéìåðà*/ if(game) /*åñëè
íàõîäèìñÿ â èãðå*/ { if(nIDEvent==2)//çàïóñê
äûìà { for(numball=0;numball<5;numball++) {//åñëè
äûì íå àêòèâåí, àêòèâèçèðîâàòü if(live[numball]==0) { live[numball]=1; balls[numball].SetRect(korp.left+35,kr.top-10,kr.right-5,korp.top); break; } } } for(numball=0;numball<5;numball++) {//ñîõðàíèòü
ïðåäûäóù. ïîëîæåíèå äûìà temp.CopyRect(balls[numball]); if(live[numball]==1)//åñëè
äûì àêòèâåí { balls[numball].OffsetRect(1,-6);//ñìåñòèòü
äûì balls[numball].top--; //èçìåíèòü
ðàçìåðû balls[numball].right++; InvalidateRect(temp); //ïåðåðèñîâàòü InvalidateRect(balls[numball]); if(balls[numball].top<=0)
live[numball]=0;//óáèòü } } if(
(korp.right<=svet.left)||(korp.left>=svet.left+3)||(move==1)) { /*åñëè
íå îêîëî ñâåòîôîðà èëè çåëåíûé öâåò*/ if(korp.left<400)/*åñëè
íå ñòåíà*/ { temp.CopyRect(korp); /*ñîõðàíèòü
ïðåäûäóùèå êîîðäèíàòû*/ //ñìåñòèòü
âñþ ìàøèíó korp.OffsetRect(3,0); InvalidateRect(temp); InvalidateRect(korp); temp.CopyRect(kol1); kol1.OffsetRect(3,0); InvalidateRect(temp); InvalidateRect(kol1); temp.CopyRect(kol2); kol2.OffsetRect(3,0); InvalidateRect(temp); InvalidateRect(kol2); temp.CopyRect(kr); kr.OffsetRect(3,0); InvalidateRect(temp); InvalidateRect(kr); temp.CopyRect(kr2); if(kr2.top==270) { kr2.top=275; } else
kr2.top=270; kr2.OffsetRect(3,0); InvalidateRect(temp); InvalidateRect(kr2); } else/*âîçâðàò
â ëåâóþ ñòåíêó*/ { korp.SetRect(0,288,50,300); kr.SetRect(30,280,40,288); kr2.SetRect(10,270,25,288); kol1.SetRect(5,295,15,305); kol2.SetRect(35,295,45,305); ns=1; move=0; InvalidateRect(ball1); InvalidateRect(ball2); InvalidateRect(ball3); } } } } afx_msg void
CMainWnd::OnRed() {/*ðåàêöèÿ íà
âûáîð êðàñíîãî öâåòà*/ color=0; } afx_msg void
CMainWnd::OnGreen() {/*âûáîð çåëåíîãî
öâåòà*/ color=1; } afx_msg void
CMainWnd::OnBlue() { color=2; } afx_msg void
CMainWnd::OnBegin() { game=true; color=0; move=0; svet.SetRect(200,100,240,230); noga.SetRect(210,230,230,250); ball1.SetRect(210,110,230,140); ball2.SetRect(210,150,230,180); ball3.SetRect(210,190,230,220); korp.SetRect(0,288,50,300); kr.SetRect(30,280,40,288); kr2.SetRect(10,270,25,288); kol1.SetRect(5,295,15,305); kol2.SetRect(35,295,45,305); SetTimer(1,100,NULL); SetTimer(2,1000,NULL); InvalidateRect(NULL); } BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd) ON_COMMAND(IDM_EXIT,OnExit) ON_COMMAND(IDM_BEGIN,OnBegin) ON_COMMAND(IDM_RED,OnRed) ON_COMMAND(IDM_GREEN,OnGreen) ON_COMMAND(IDM_BLUE,OnBlue) ON_WM_PAINT() ON_WM_TIMER() ON_WM_CHAR() END_MESSAGE_MAP() afx_msg void
CMainWnd::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ) { if(game) { switch(nChar) { case
234: { ns=0; break; } case
231: {ns=2; move=1; break; } case
230: {ns=1; } } InvalidateRect(ball1); InvalidateRect(ball2); InvalidateRect(ball3); } } CApp app; class CMainWnd:
public CFrameWnd /*êëàññ îêíà*/ { public: CRect
wnd; /*ðàçìåð îêíà*/ CRect
kol1,kol2,korp,kr,temp; /*ïðÿìîóãîëüíèêè*/ CRect
svet,ball1,ball2,ball3;/*ïðÿìîóãîëüíèêè*/ CBrush
br1[3],br2; /*êèñòè*/ CBrush
sv[4]; /*öâåòà ñâåòîôîðà*/ CRect
noga; /*íîãà ñâåòîôîðà*/ CRect
balls[5]; /*øàðèêè äûìà*/ CRect
kr2; //êàáèíà int
numball; //íîìåð äûìà int
live[5]; //ïðèçíàê æèçíè äûìà bool
game; /*ïðèçíàê èãðû èëè âíå èãðû*/ int
color; /*íîìåð öâåòà ïàðîâîçà*/ int
ns; /*íîìåð óâåòà ñâåòîôîðà*/ int
move; /*ôëàã äâèæåíèÿ ïàðîâîçà*/ CMainWnd(); /*êîíñòðóêòîð
ãëàâíîãî. îêíà*/ afx_msg
void OnRed(); /*ïóíóòû ìåíþ öâåòà*/ afx_msg
void OnGreen(); afx_msg
void OnBlue(); afx_msg
void OnPaint(); /*ô-èÿ ïåðåðèñîâêè*/ afx_msg
void OnTimer( UINT nIDEvent ); /*îáðàá-÷èê òàéìåðà*/ afx_msg
void OnExit();//âûõîä afx_msg
void OnBegin();//ïåðåñòàðòîâàòü afx_msg
void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ); DECLARE_MESSAGE_MAP()//êàðòà
ñîîáùåíèé }; class CApp: public
CWinApp { public: BOOL
InitInstance(); }; #define IDM_BEGIN 100 #define IDM_RED 101 #define IDM_GREEN
102 #define IDM_BLUE
103 #define IDM_EXIT
104 #include <afxres.h> #include "menu1.h" BEGIN POPUP "GAME" BEGIN POPUP
"COLOR" BEGIN MENUITEM "RED", IDM_RED MENUITEM "GREEN", IDM_GREEN MENUITEM "BLUE", IDM_BLUE END MENUITEM SEPARATOR MENUITEM "START", IDM_BEGIN MENUITEM "EXIT",
IDM_EXIT END END | ||||||||||||||||