#include #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(100,150,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(4,0); InvalidateRect(temp); InvalidateRect(korp); temp.CopyRect(kol1); kol1.OffsetRect(4,0); InvalidateRect(temp); InvalidateRect(kol1); temp.CopyRect(kol2); kol2.OffsetRect(4,0); InvalidateRect(temp); InvalidateRect(kol2); temp.CopyRect(kr); kr.OffsetRect(4,0); InvalidateRect(temp); InvalidateRect(kr); temp.CopyRect(kr2); if(kr2.top==270) { kr2.top=275; } else kr2.top=270; kr2.OffsetRect(4,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=0; 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;