// game.cpp: определяет точку входа для приложения.

//



#include "stdafx.h"

#include "game.h"

#include <cstdlib>

using std::srand;

using std::rand;

#include <time.h>



#define MAX_LOADSTRING 100



// Глобальные переменные:

HINSTANCE hInst;								// текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];					// Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];			// имя класса главного окна





// Отправить объявления функций, включенных в этот модуль кода:

ATOM				MyRegisterClass(HINSTANCE hInstance);

BOOL				InitInstance(HINSTANCE, int);

LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);

bool gamebegin(int [11][11], int&);

void DrawDiagram(HWND hWnd, HDC hdc,int [11][11]);

INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

void left(int [11][11],int [2], bool&);

void right(int [11][11],int [2], bool&);

void up(int [11][11],int [2], bool&);

void down(int [11][11],int [2], bool&);

void DrawCursor(HWND hWnd, HDC hdc,int [2]);

int Mas[11][11];	// массив шариков

int pustie=100;

bool flag=true;

bool vzyl=false;

int kursor[3]={0,5,6};

	

//char* lpBitmapName={"C:\Figter.bmp"};



	        	



int APIENTRY _tWinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPTSTR    lpCmdLine,

                     int       nCmdShow)

{

	UNREFERENCED_PARAMETER(hPrevInstance);

	UNREFERENCED_PARAMETER(lpCmdLine);

	

 	// TODO: разместите код здесь.

	MSG msg;

	HACCEL hAccelTable;



	// Инициализация глобальных строк

	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

	LoadString(hInstance, IDC_GAME, szWindowClass, MAX_LOADSTRING);

	MyRegisterClass(hInstance);



	// Выполнить инициализацию приложения:

	if (!InitInstance (hInstance, nCmdShow))

	{

		return FALSE;

	}



	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GAME));



	// Цикл основного сообщения:

	while (GetMessage(&msg, NULL, 0, 0))

	{

		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

		{

			TranslateMessage(&msg);

			DispatchMessage(&msg);

		}

	}



	return (int) msg.wParam;

}







//

//  ФУНКЦИЯ: MyRegisterClass()

//

//  НАЗНАЧЕНИЕ: регистрирует класс окна.

//

//  КОММЕНТАРИИ:

//

//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

//    был совместим с системами Win32, не имеющими функции RegisterClassEx'

//    которая была добавлена в Windows 95. Вызов этой функции важен для того,

//    чтобы приложение получило "качественные" мелкие значки и установило связь

//    с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

	WNDCLASSEX wcex;



	wcex.cbSize = sizeof(WNDCLASSEX);



	wcex.style			= CS_HREDRAW | CS_VREDRAW;

	wcex.lpfnWndProc	= WndProc;

	wcex.cbClsExtra		= 0;

	wcex.cbWndExtra		= 0;

	wcex.hInstance		= hInstance;

	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GAME));

	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);

	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);

	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_GAME);

	wcex.lpszClassName	= szWindowClass;

	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));



	return RegisterClassEx(&wcex);

}

//

//загрузка картинки

//

//HBITMAP LoadBitmapA(

    //HINSTANCE hInstance,  // дескриптор экземпляра приложения

	//LPCTSTR lpBitmapName  // имя ресурса рисунка

//);



//

//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

//   КОММЕНТАРИИ:

//

//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

//        создается и выводится на экран главное окно программы.

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;



   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной



   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);



	



   if (!hWnd)

   {

      return FALSE;

   }



   ShowWindow(hWnd, nCmdShow);

   UpdateWindow(hWnd);



   return TRUE;

   

   

}



//

//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.

//

//  WM_COMMAND	- обработка меню приложения

//  WM_PAINT	-Закрасить главное окно

//  WM_DESTROY	 - ввести сообщение о выходе и вернуться.

//

//







LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

	 

	int wmId, wmEvent;

	PAINTSTRUCT ps;

	HDC hdc;

	SetTimer(hWnd, 1, 500, NULL);

	RECT rect;

	

	switch (message)

	{

	case WM_COMMAND:

		wmId    = LOWORD(wParam);

		wmEvent = HIWORD(wParam);

		// Разобрать выбор в меню:

		switch (wmId)

		{

		case IDM_ABOUT:

			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

			break;

		case IDM_EXIT:

			DestroyWindow(hWnd);

			break;

		default:

			return DefWindowProc(hWnd, message, wParam, lParam);

		}

		break;

	case WM_KEYDOWN:

		switch (LOWORD(wParam))

		{

		case VK_ESCAPE:

			SendMessage(hWnd,WM_CLOSE,0,0L);

			break;

		case VK_LEFT:

			left(Mas, kursor, vzyl);



			GetClientRect(hWnd, &rect);  //получаем рабочую область

			InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной

			UpdateWindow(hWnd); //перерисовываем окно		

			break;

		case VK_RIGHT:

			right(Mas, kursor, vzyl);



			GetClientRect(hWnd, &rect);  //получаем рабочую область

			InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной

			UpdateWindow(hWnd); //перерисовываем окно

			break;

		case VK_UP:

			up(Mas, kursor, vzyl);



			GetClientRect(hWnd, &rect);  //получаем рабочую область

			InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной

			UpdateWindow(hWnd); //перерисовываем окно

			break;

		case VK_DOWN:

			down(Mas, kursor, vzyl);

			GetClientRect(hWnd, &rect);  //получаем рабочую область

			InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной

			UpdateWindow(hWnd); //перерисовываем окно

			break;

		case VK_SPACE:

			if (vzyl==false)

				vzyl=true;

			else

				vzyl=false;

			break;

		}

		return 0;

	case WM_TIMER:

		if(flag)

			flag=gamebegin(Mas, pustie);

		GetClientRect(hWnd, &rect);  //получаем рабочую область

		InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной

        UpdateWindow(hWnd); //перерисовываем окно

		break;

	case WM_PAINT:

		hdc = BeginPaint(hWnd, &ps);

		// TODO: добавьте любой код отрисовки...

		DrawDiagram( hWnd, hdc, Mas);

		DrawCursor( hWnd, hdc, kursor);

		EndPaint(hWnd, &ps);

		break;

	case WM_DESTROY:

		PostQuitMessage(0);

		break;

	default:

		return DefWindowProc(hWnd, message, wParam, lParam);

	}

	return 0;

}



// Обработчик сообщений для окна "О программе".

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

	UNREFERENCED_PARAMETER(lParam);

	switch (message)

	{

	case WM_INITDIALOG:

		return (INT_PTR)TRUE;



	case WM_COMMAND:

		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

		{

			EndDialog(hDlg, LOWORD(wParam));

			return (INT_PTR)TRUE;

		}

		break;

	}

	return (INT_PTR)FALSE;

}





//

//наша рисовальня

//

void DrawDiagram(HWND hWnd, HDC hdc,int [11][11])

{

RECT rect;

GetClientRect(hWnd, &rect);



const int xVE = rect.right - rect.left;

const int yVE = rect.bottom - rect.top;

int x,y;



SetMapMode(hdc, MM_ISOTROPIC);

SetWindowExtEx(hdc, xVE, yVE, NULL);

SetViewportExtEx(hdc, xVE, -yVE, NULL);  //ctnrf

SetViewportOrgEx(hdc, 0, yVE, NULL);



HPEN hPen0 = CreatePen(PS_SOLID, 3, RGB(0, 160, 0));

HPEN hOldPen = (HPEN)SelectObject(hdc, hPen0);



for(int t = 0; t <= 10; ++t)

{	

		x=xVE*t/10;

		y=yVE*t/10;

    	MoveToEx(hdc, x, 0, NULL); //перемещаемся в заданную точку

		LineTo(hdc, x, yVE);         //рисуем туда линию

        MoveToEx(hdc, 0, y, NULL); //перемещаемся в заданную точку

		LineTo(hdc, xVE, y);         //рисуем туда линию        

}



for (int i=0; i<=9; i++)

	for (int j=0; j<=9; j++)

	{

		HPEN hPen1 = CreatePen(PS_SOLID, 30, RGB(0, 10+Mas[i+1][j+1]*75, 0));

		HPEN hOldPen1 = (HPEN)SelectObject(hdc, hPen1);



		x=xVE*j/10+xVE/20;

		y=yVE*i/10+xVE/25;

    	MoveToEx(hdc, x, y, NULL); //перемещаемся в заданную точку

		LineTo(hdc, x, y);         //рисуем туда линию 

	}

}



void DrawCursor(HWND hWnd, HDC hdc,int [2])

{

RECT rect;

GetClientRect(hWnd, &rect);



const int xVE = rect.right - rect.left;

const int yVE = rect.bottom - rect.top;





SetMapMode(hdc, MM_ISOTROPIC);

SetWindowExtEx(hdc, xVE, yVE, NULL);

SetViewportExtEx(hdc, xVE, -yVE, NULL);  //ctnrf

SetViewportOrgEx(hdc, 0, yVE, NULL);



HPEN hPen0 = CreatePen(PS_SOLID, 2, RGB(225, 80, 150));

HPEN hOldPen = (HPEN)SelectObject(hdc, hPen0);



	int x1=xVE*kursor[1]/10-2;

	int y1=yVE*kursor[2]/10-2;

	int x2=xVE*(kursor[1]-1)/10+2;

	int y2=yVE*(kursor[2]-1)/10+2;

		

   	MoveToEx(hdc, x1, y1, NULL); //перемещаемся в заданную точку

	LineTo(hdc, x1, y2);         //рисуем туда линию 

	MoveToEx(hdc, x1, y1, NULL); //перемещаемся в заданную точку

	LineTo(hdc, x2, y1);         //рисуем туда линию 

	MoveToEx(hdc, x2, y2, NULL); //перемещаемся в заданную точку

	LineTo(hdc, x2, y1);         //рисуем туда линию 

	MoveToEx(hdc, x2, y2, NULL); //перемещаемся в заданную точку

	LineTo(hdc, x1, y2);         //рисуем туда линию 



}

bool gamebegin(int [11][11], int&)

{

	srand(time(NULL)); // Инициализируем генератор текущим временем.

	for (int c=1; c<=3; c++)

	{

		int f=0;

		int rand_3 = rand()%3+1; // Случайное число в пределах от 1 включительно до 3 всключительно.

		int rand_1 = rand()%pustie+1; // Случайное число в пределах от 1 включительно до pustie всключительно.

		for (int j=10; j>=1; j--)

			for (int i=10; i>=1; i--)

			{

				if(Mas[j][i]==0)

				{				

					f++;

					if (f==rand_1)

					{



						Mas[j][i]=rand_3;	

						i=0;

						j=0;

					}

				}

			}

		pustie--;

		if (pustie==0)

		{

			c=4; 

			return false;

		}

	}

return true;

}

void left(int [11][11],int [2], bool&)

{

if (vzyl==false)

