Ãîñóäàðñòâåííûé êîìèòåò Ðîññèéñêîé Ôåäåðàöèè
ïî âûñøåìó îáðàçîâàíèþ
Êàçàíñêèé ãîñóäàðñòâåííûé òåõíè÷åñêèé óíèâåðñèòåò
èìåíè À.Í. Òóïîëåâà
--------------------------------------------------------------
Êàôåäðà ÀÑÎÈÓ
ÊÓÐÑÎÂÀß ÐÀÁÎÒÀ
ïî îñíîâàì ïðîãðàììèðîâàíèÿ
ÈÃÐÀ «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
1.Îïèñàíèå ïðèìåíåíèÿ .
Çàïóñê ïðîãðàììû
íåîáõîäèìî ïðîèçâîäèòü , íàõîäÿñü â ñðåäå Windows 95 :
çàïóñêàåìûé ôàéë – parovoz.exe
.
Ïîñëå çàïóñêà èãðû, íà ýêðàíå ïîÿâëÿåòñÿ îêíî ñ
íàäïèñüþ «âûáåðèòå ïóíêò ñòàðò». Îêíî èìååò ìåíþ, ñîñòîÿùåå èç íåñêîëüêèõ
ïóíêòîâ. Ñ ïîìîùüþ ïóíêòîâ ìåíþ ìîæíî: èçìåíÿòü öâåò äâèæóùåãîñÿ îáúåêòà
(ïàðîâîçèêà â êðàñíûé, ñèíèé, çåë¸íûé), íà÷àòü (ïåðåçàïóñòèòü), îñóùåñòâèòü
âûõîä èç èãðû. Ïîñëå âûáîðà ïóíêòà ìåíþ «ñòàðò», â ëåâîì íèæíåì óãëó îêíà
ïîÿâëÿåòñÿ ïàðîâîç, ïðåäñòàâëÿþùèé ñîáîé ñîâîêóïíîñòü ãåîìåòðè÷åñêèõ ôèãóð –
ýëëèïñîâ (êîë¸ñà) è ïðÿìîóãîëüíèêîâ (êàáèíà, òðóáû). Ïàðîâîç äâèæåòñÿ ñëåâà
íàïðàâî è îñòàíàâëèâàåòñÿ ïåðåä ñâåòîôîðîì, ðàñïîëîæåííûì ïðèáëèçèòåëüíî â
ñåðåäèíå îêíà íàä ïàðîâîçîì. Ïîëüçîâàòåëü èìååò âîçìîæíîñòü ðåãóëèðîâàòü öâåòîì
ñâåòîôîðà íàæàòèåì êëàâèøü ‘ê’, ‘ç’, ‘æ’,
ñîîòâåòñòâóþùèì öâåòàì ñâåòîôîðà – êðàñíîìó, çåëåíîìó, æ¸ëòîìó. Åñëè ïàðîâîç
ïîäúåçæàåò ê ñâåòîôîðó, à ó ñâåòîôîðà àêòèâíûì ÿâëÿåòñÿ çåë¸íûé öâåò, îí
ïðîäîëæàåò ñâî¸ äâèæåíèå.  ïðîòèâíîì ñëó÷àå, ïàðîâîç îñòàíàâëèâàåòñÿ. Ïðè
äîñòèæåíèè ïðàâîé ñòåíêè, ïàðîâîç ïîÿâëÿåòñÿ ó ëåâîé ñòåíêè, à àêòèâíûì öâåòîì
ñâåòîôîðà ñòàíîâèòñÿ æ¸ëòûé öâåò. Èç âåðõíåé ÷àñòè ïàðîâîçà ïîñòîÿííî
ïîäíèìàþòñÿ â âåðõíþþ ÷àñòü îêíà îêðóæíîñòè, ïðåäñòàâëÿþùèå ñîáîé êëóáíè äûìà,
êîòîðûå óâåëè÷èâàþòñÿ ïðè ïîäú¸ìå.
2. Îïèñàíèå ïðîãðàììû .
Ïðîãðàììà
âûïîëíåíà â ñòèëå îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ, èñïîëüçîâàííà
áèáëèîòåêà MFC. Ñàìà ïðîãðàììà - ïðèëîæåíèå Windows. Äëÿ
âûâîäà ãðàôè÷åñêèõ îáúåêòîâ èñïîëüçóþòñÿ ôóíêöèè: Elliplse, Rectangle. Ïðîãðàììîé îáðàáàòûâàþòñÿ ñîáûòèÿ îò òàéìåðà, íàæàòèÿ êëàâèøü íà
êëàâèàòóðå, âûáðà ñîîòâåòñòâóþùèõ ïóíêòîâ ìåíþ, à òàêæå ñîáûòèå WM_PAINT äëÿ ïåðåðèñîâêè ðàáî÷åé îáëàñòè.
CApp - êëàññ
ïðèëîæåíèÿ, ïîðîæäàåòñÿ êëàññîì CWinApp
áèáëèîòåêè MFC îáåñïå÷èâàåò
èíèöèàëèçàöèþ , âûïîëíåíèå è çàâåðøåíèå Windows ïðîãðàììû
: ðåãèñòðèðóåò , ñîçäà¸ò è îòîáðàæàåò îñíîâíîå îêíî ïðèëîæåíèÿ .
×ëåí-
ôóíêöèè êëàññà CApp :
InitInstance – âèðòóàëüíàÿ
ôóíêöèÿ, ïåðåîïðåäåëÿåòñÿ â êëàññå CApp
2.2.2. CÌainWnd- êëàññ ãëàâíîãî îêíà .
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()
2.3. Îáðàç
ãëàâíîãî îêíà.
Íà ðèñóíêàõ 1, 2 ïðåäñòàâëåíûîñíîâíûå îáðàçû îêíà ïðèëîæåíèÿ.
|
|
Ðèñ. 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"
MAINMENU
MENU DISCARDABLE
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