Реферат: Курсовая работа по основам программирования. Игра Паровоз
Название: Курсовая работа по основам программирования. Игра Паровоз Раздел: Рефераты по информатике, программированию Тип: реферат | |||||
Государственный комитет Российской Федерации по высшему образованию Казанский государственный технический университет имени А.Н. Туполева -------------------------------------------------------------- Кафедра АСОИУ КУРСОВАЯ РАБОТА по основам программирования ИГРА «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.1. Запуск программы.Запуск программы необходимо производить , находясь в среде Windows 95 : запускаемый файл – parovoz.exe . 1.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; /*размер окна*/ 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() - карта сообщений 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()
Листинг файла 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=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; Листинг файла main.hclass 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(); }; Листинг файла menu1.h#define IDM_BEGIN 100 #define IDM_RED 101 #define IDM_GREEN 102 #define IDM_BLUE 103 #define IDM_EXIT 104 Листинг файла menu1.rc#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 |