IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Проблемки с "восприятием" кода, Не могу разобраться как работает..
dron4ik
сообщение 18.05.2009 15:53
Сообщение #1


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Привет всем) Помогите пожалуйста кто нибудь разобраться в коде программы... не понимаю..(((. как она работает??

Суть проги:


После запуска игры, на экране появляется окно с надписью «выберите пункт старт». Окно имеет меню, состоящее из нескольких пунктов. С помощью пунктов меню можно: изменять цвет движущегося объекта (паровозика в красный, синий, зелёный), начать (перезапустить), осуществить выход из игры. После выбора пункта меню «старт», в левом нижнем углу окна появляется паровоз, представляющий собой совокупность геометрических фигур – эллипсов (колёса) и прямоугольников (кабина, трубы). Паровоз движется слева направо и останавливается перед светофором, расположенным приблизительно в середине окна над паровозом. Пользователь имеет возможность регулировать цветом светофора нажатием клавишь ‘к’, ‘з’, ‘ж’, соответствующим цветам светофора – красному, зеленому, жёлтому. Если паровоз подъезжает к светофору, а у светофора активным является зелёный цвет, он продолжает своё движение. В противном случае, паровоз останавливается. При достижении правой стенки, паровоз появляется у левой стенки, а активным цветом светофора становится жёлтый цвет. Из верхней части паровоза постоянно поднимаются в верхнюю часть окна окружности, представляющие собой клубни дыма, которые увеличиваются при подъёме.

исходники

Листинг файла 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));                             - что за 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));--- почему какие то 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.h

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();
};

Листинг файла 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"

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 28.07.2025 1:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"