// Game_Lab_16.cpp : Определяет точку входа для приложения. // #include #include "framework.h" #include "Game_Lab_16.h" #define MAX_LOADSTRING 100 #define N 10 #define M 15 #define WIDTH 30 #define HEIGHT 20 int steps = 0; int gold = 0; int map[N][M] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2}, {0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0}, {0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 3, 2, 0, 2, 0}, {0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0}, {0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 2, 0}, {0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0}, {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0} }; void drawMap(HDC hdc) { HBRUSH hBrushEmptyCell = CreateSolidBrush(RGB(200, 200, 200)); HBRUSH hBrushGold = CreateSolidBrush(RGB(255, 255, 0)); HBRUSH hBrushWall = CreateSolidBrush(RGB(0, 0, 0)); HBRUSH hBrushMan = CreateSolidBrush(RGB(120, 120, 255)); HBRUSH brush[4] = { hBrushEmptyCell, hBrushMan, hBrushWall, hBrushGold }; int i; int j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { int x1 = j * WIDTH; int x2 = (j + 1) * WIDTH; int y1 = i * HEIGHT; int y2 = (i + 1) * HEIGHT; RECT r = { x1, y1, x2, y2 }; FillRect(hdc, &r, brush[map[i][j]]); } } for (i = 0; i < 4; i++) DeleteObject(brush[i]); } void Left() { int i, j; for (i = 0; i < N; i++) { for (j = 1; j < M; j++) { if (map[i][j] == 1) { if (map[i][j - 1] == 0) { map[i][j - 1] = 1; map[i][j] = 0; steps++; } else if (map[i][j - 1] == 3) { map[i][j - 1] = 1; map[i][j] = 0; steps++; gold++; } } } } } void del() { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { if (map[i][j] == 1) { map[i][j] = 0; } } } } void Right() { int i, j; for (i = 0; i < N; i++) { for (j = M - 2; j >= 0; j--) { if (map[i][j] == 1) { if (map[i][j + 1] == 0) { map[i][j + 1] = 1; map[i][j] = 0; steps++; } else if (map[i][j + 1] == 3) { map[i][j + 1] = 1; map[i][j] = 0; steps++; gold++; } } } } } void Up() { int i, j; for (i = 1; i < N; i++) { for (j = 0; j < M; j++) { if (map[i][j] == 1) { if (map[i - 1][j] == 0) { map[i - 1][j] = 1; map[i][j] = 0; steps++; } else if (map[i - 1][j] == 3) { map[i - 1][j] = 1; map[i][j] = 0; steps++; gold++; } } } } } void Down() { int i, j; for (i = N - 2; i >= 0; i--) { for (j = 0; j < M; j++) { if (map[i][j] == 1) { if (map[i + 1][j] == 0) { map[i + 1][j] = 1; map[i][j] = 0; steps++; } else if (map[i + 1][j] == 3) { map[i + 1][j] = 1; map[i][j] = 0; steps++; gold++; } } } } } void wall() { int i, j; for (i = 1; i < N - 1; i++) { for (j = 1; j < M - 1; j++) { if (map[i][j] == 1) { //if (map[i][j + 1] == 2 || map[i][j - 1] == 2 || map[i + 1][j] == 2 || map[i - 1][j] == 2) { map[i][j + 1] = 3; map[i][j - 1] = 3; map[i + 1][j] = 3; map[i - 1][j] = 3; /*}*/ } } } } void golden() { int i, j; for (i = 0; i < N; i++) { for (j = 1; j < M - 1; j++) { if (map[i][j] == 1) { map[i][j + 1] = 3; } } } } void g(int i, int j) { if (map[i][j] == 2) { map[i][j] = 3; if (i > 0) { g(i - 1, j); } if (i < N - 1) { g(i + 1, j); } if (j > 0) { g(i, j - 1); } if (j > M - 1) { g(i, j + 1); } } } void goldenMidas() { int i, j; for (i = 0; i < N; i++) { for (j = 1; j < M - 1; j++) { if (map[i][j] == 1 && map[i][j + 1] == 2) { g(i, j + 1); } } } } void destroyWall() { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { if (map[i][j] == 1) { for (int k = j + 1; k < M; k++) { if (map[i][k] == 2) { map[i][k] = 0; } } } } } } void Save() { FILE* file1; errno_t error_code; error_code = fopen_s(&file1, "D:\\C\\gamedata.txt", "w+"); if (error_code != 0) { printf("Error! Failed to open file in r mode!"); return; } fprintf(file1, "%d ", N); fprintf(file1, "%d\n", M); int i, j; for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { if (!(map[i][j] == 1)) { fprintf(file1, "%d ", map[i][j]); } else { fprintf(file1, "%d ", 1); } } fprintf(file1, "\n"); } fprintf(file1, "%d ", steps); fprintf(file1, "%d", gold); fclose(file1); } void Load() { FILE* fin; errno_t error_code; error_code = fopen_s(&fin, "D:\\C\\gamedata.txt", "r"); if (error_code != 0) { printf("Error! Failed to open file in r mode!"); return; } int n, m; fscanf_s(fin, "%d", &n); fscanf_s(fin, "%d", &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { fscanf_s(fin, "%d", &map[i][j]); } } fscanf_s(fin, "%d ", &steps); fscanf_s(fin, "%d", &gold); fclose(fin); } HINSTANCE hInst; WCHAR szTitle[MAX_LOADSTRING]; WCHAR szWindowClass[MAX_LOADSTRING]; ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_GAMELAB16, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance(hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GAMELAB16)); MSG msg; while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW 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_GAMELAB16)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_GAMELAB16); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(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_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); drawMap(hdc); EndPaint(hWnd, &ps); } break; case WM_KEYDOWN: switch (wParam) { case VK_DOWN: Down(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_LEFT: Left(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_UP: Up(); InvalidateRect(hWnd, NULL, TRUE); break; case VK_RIGHT: Right(); InvalidateRect(hWnd, NULL, TRUE); break; case 0x53: Save(); break; case 0x4c: Load(); InvalidateRect(hWnd, NULL, TRUE); break; case 0x44: wall(); InvalidateRect(hWnd, NULL, TRUE); break; case 0x55: golden(); InvalidateRect(hWnd, NULL, TRUE); break; case 0x5A: goldenMidas(); InvalidateRect(hWnd, NULL, TRUE); break; } 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; }