Реферат: Курсовая работа по основам программирования. Игра "Паровоз"
Государственный комитет Российской Федерации
по высшему образованию
Казанский государственныйтехнический университет
имени А.Н. Туполева
--------------------------------------------------------------
Кафедра АСОИУ
КУРСОВАЯ РАБОТА
по основам программирования
ИГРА «Parovoz»
ИСПОЛНИТЕЛЬ:студентка группы 4221
ПетроваЕ.Г.
РУКОВОДИТЕЛЬ: Вафин Р.Р.
Оценка____________________________
Подпись___________________________
"____"________________________2001г.
КАЗАНЬ
2001г.
<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">СОДЕРЖАНИЕ
TOC o «1-3»
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
<span Times New Roman",«serif»;mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA">1.Описание применения .
1.1.Запуск программы.Запуск программы необходимопроизводить, находясь в среде Windows 95 : запускаемый файл – parovoz.exe .
1.2.Правила игры.После запуска игры, наэкране появляется окно с надписью «выберите пункт старт». Окно имеет меню,состоящее из нескольких пунктов. С помощью пунктов меню можно: изменять цветдвижущегося объекта (паровозика в красный, синий, зелёный), начать(перезапустить), осуществить выход из игры. После выбора пункта меню «старт», влевом нижнем углу окна появляется паровоз, представляющий собой совокупностьгеометрических фигур – эллипсов (колёса) и прямоугольников (кабина, трубы).Паровоз движется слева направо и останавливается перед светофором,расположенным приблизительно в середине окна над паровозом. Пользователь имеетвозможность регулировать цветом светофора нажатием клавишь ‘к’, ‘з’, ‘ж’, соответствующим цветам светофора – красному, зеленому, жёлтому. Еслипаровоз подъезжает к светофору, а у светофора активным является зелёный цвет,он продолжает своё движение. В противном случае, паровоз останавливается. Придостижении правой стенки, паровоз появляется у левой стенки, а активным цветомсветофора становится жёлтый цвет. Из верхней части паровоза постоянноподнимаются в верхнюю часть окна окружности, представляющие собой клубни дыма,которые увеличиваются при подъёме.
<span Times New Roman",«serif»;mso-fareast-font-family: «Times New Roman»;mso-ansi-language:EN-US;mso-fareast-language:RU;mso-bidi-language: AR-SA">
2. Описаниепрограммы .2.1.Метод решения задачи .
Программа выполнена в стилеобъектно-ориентированного программирования, использованна библиотека MFC.Сама программа — приложение Windows.Для вывода графических объектов используются функции:Elliplse, Rectangle. Программой обрабатываются события от таймера, нажатия клавишь наклавиатуре, выбра соответствующих пунктов меню, а также событие WM_PAINT дляперерисовки рабочей области.
2.2.Описание используемых классов, структур и функций.2.2.1. CApp — класс приложения .CApp — классприложения, порождается классом CWinApp библиотекиMFC обеспечивает инициализацию,выполнение и завершение Windows программы: регистрирует,создаёт и отображает основное окно приложения .
Член- функции класса CApp:
InitInstance– виртуальнаяфункция, переопределяется в классе CApp
2.2.2. CМainWnd- класс главного окна .
CMainWnd- классглавного окна приложения, наследуется из класса CFrameWnd библиотекиMFC .)
Член — данныекласса СMainWnd:
CRect wnd; /*размерокна*/
CRectkol1,kol2,korp,kr,temp; /*прямоугольники*/
CRectsvet,ball1,ball2,ball3;/*прямоугольники*/
CBrushbr1[3],br2; /*кисти*/
CBrushsv[4]; /*цветасветофора*/
CRectnoga; /*ногасветофора*/
CRectballs[5]; /*шарики дыма*/
CRectkr2; //кабина
intnumball; //номер дыма
intlive[5]; //признакжизни дыма
boolgame; /*признак игры или вне игры*/
intcolor; /*номер цвета паровоза*/
intns; /*номер уветасветофора*/
intmove; /*флаг движения паровоза*
/Член — функции класса СMainWnd :
CmainWnd(); - конструктор класса окна
afx_msgvoid OnBegin(); обработчик события на выбор пункта меню «старт»
afx_msg void OnRed();- обработчик событияна выбор пункта меню «Red»
afx_msgvoid OnGreen(); - обработчик события на выбор пунктаменю «Green»
afx_msgvoid OnBlue(); - обработчик события на выбор пунктаменю «Blue»
afx_msg void OnPaint(); - ф-ия перерисовки
afx_msg void OnTimer( UINT nIDEvent); - обраб-чик таймера
afx_msgvoid OnExit();- обработчик события на выбор пункта меню «Exit»
afx_msg void OnChar( UINT nChar,UINT nRepCnt, UINT nFlags ); — реакция на нажатие клавиши клавиатуры
DECLARE_MESSAGE_MAP() - картасообщений
2.2.3. Карта сообщений.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()
<span Times New Roman",«serif»;mso-fareast-font-family: «Times New Roman»;mso-ansi-language:EN-US;mso-fareast-language:RU;mso-bidi-language: AR-SA">2.3. Образ главного окна.
<img src="/cache/referats/7000/image002.jpg" v:shapes="_x0000_s1032">
На рисунках 1, 2 представленыосновные образы окна приложения.
<div v:shape="_x0000_s1027">
Рис. 1. Главное окно после выбора пункта «старт»
<img src="/cache/referats/7000/image004.jpg" v:shapes="_x0000_s1033">
<div v:shape="_x0000_s1029">
Рис. 2. Главное окно до выбора пункта «старт»
ПриложениеЛистинг файлаmain.cpp
/* в этом файле находятся описания всех функций */
#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=newCMainWnd; /*созд объекта окна*/
m_pMainWnd->ShowWindow(m_nCmdShow); /*показать окно*/
returntrue; /*удачное завершение*/
}
afx_msg void CMainWnd::OnPaint() /*ф-ия перерисовки*/
{
CPaintDCdc(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) /*переключение между цветамисветофора*/
{
case0: /*если красный*/
{
dc.SelectObject(sv[0]);
dc.Ellipse(ball1);
dc.SelectObject(sv[3]);
dc.Ellipse(ball2);
dc.Ellipse(ball3);
break;
}
case1: /*если жёлтый*/
{
dc.SelectObject(sv[2]);
dc.Ellipse(ball2);
dc.SelectObject(sv[3]);
dc.Ellipse(ball1);
dc.Ellipse(ball3);
break;
}
case2:/*еесли зеленый*/
{
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;
}
elsekr2.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, UINTnRepCnt, UINT nFlags )
{
if(game)
{
switch(nChar)
{
case234:
{
ns=0;
break;
}
case231:
{ns=2;
move=1;
break;
}
case230:
{ns=1;
}
}
InvalidateRect(ball1);
InvalidateRect(ball2);
InvalidateRect(ball3);
}
}
CApp app;
Листинг файлаmain.h
class CMainWnd: public CFrameWnd /*класс окна*/
{
public:
CRectwnd; /*размер окна*/
CRectkol1,kol2,korp,kr,temp; /*прямоугольники*/
CRectsvet,ball1,ball2,ball3;/*прямоугольники*/
CBrushbr1[3],br2; /*кисти*/
CBrushsv[4]; /*цветасветофора*/
CRectnoga; /*нога светофора*/
CRectballs[5]; /*шарики дыма*/
CRectkr2; //кабина
intnumball; //номер дыма
intlive[5]; //признакжизни дыма
boolgame; /*признак игры или вне игры*/
intcolor; /*номер цвета паровоза*/
intns; /*номер уветасветофора*/
intmove; /*флаг движения паровоза*/
CMainWnd(); /*конструктор главного. окна*/
afx_msgvoid OnRed();/*пунуты меню цвета*/
afx_msgvoid OnGreen();
afx_msgvoid OnBlue();
afx_msgvoid OnPaint(); /*ф-ияперерисовки*/
afx_msgvoid OnTimer( UINT nIDEvent ); /*обраб-чик таймера*/
afx_msgvoid OnExit();//выход
afx_msgvoid OnBegin();//перестартовать
afx_msgvoid OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );
DECLARE_MESSAGE_MAP()//картасообщений
};
class CApp: public CWinApp
{
public:
BOOLInitInstance();
};
Листинг файлаmenu1.h#define IDM_BEGIN 100
#define IDM_RED 101
#define IDM_GREEN102
#define IDM_BLUE 103
#define IDM_EXIT 104
Листинг файлаmenu1.rc#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