Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.12.2010
Репутация: нет Всего: нет
|
Народ подскажите игра тетрис надо сохранить и загрузить игру. Сохранение идет норм а вот загрузка нет. Я не знаю как надо загрузить циклы. | Код |
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char filename[100];// указатель на строку, содержащую // имя файла диалога int txt_length; // длина текста DWORD written; // количество записанных байтов в файл int countx,county; HDC hdc ; /* контекст устройства */ PAINTSTRUCT ps ; //содержит информацию для приложения для закрашивания COLORREF colorbrick; //цыет HBRUSH hBrush ; //опpеделяет тип описателя для сpедств pисования кистью. RECT rect ; DWORD fsize; // размер файла DWORD read; // количество прочитанных байтов switch (iMsg)/* обработка соообщений */ {
case WM_COMMAND : switch (LOWORD(wParam)) { case ID_EXIT: // завершение программы SendMessage(hwnd,WM_CLOSE,0,0L); break; case ID_NEW: //новая игра scores=0; speed=300; game=TRUE; endgame=FALSE; oldspeed=speed; SetTimer(hwnd, idTimer = 1, speed, NULL); SetWindowText(hwnd,"Tetris"); initscreen(); newfigure(); Bind(deltax,deltay,0); break;
case ID_Pause: //пауза Pause(hwnd); break; case ID_Load: //загрузка
if (pause==FALSE) Pause(hwnd); // выделение памяти под строку для имени файла // иниц-ция строки lstrcpy(filename,"");
// иниц-ция структуры memset(&ofn, 0, sizeof(ofn)); // установка указателя на буфер для имени файла ofn.lpstrFile=filename; // максимальное количество символов в пути ofn.nMaxFile=100; // задаем размер структуры ofn.lStructSize = sizeof(OPENFILENAME); // вызываем диалог открытия файла if (GetOpenFileName(&ofn)) { // открываем файл hSrc = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // определяем размер файла fsize=GetFileSize(hSrc,NULL);
//очищаем массив memset(pBuffer,0, sizeof(pBuffer)); // читаем строку из файла ReadFile(hSrc, pBuffer, fsize, &read, NULL);
// закрываем файл CloseHandle(hSrc); // удаляем выделенную память // загружаем очки,жизни и координаты sscanf(pBuffer,"%d %d %d %d %d %d %d", &deltax , &deltay, &scores, &screen[16][18], &oldscreen[16][18], &cup[16][18], &figure[4][4], &oldfigure[4][4]); game=TRUE;
MessageBox(NULL, pBuffer, "Загр выполняется правильно", 0);
InvalidateRect(hwnd,NULL,TRUE); SendMessage(hwnd,WM_COMMAND,ID_Pause,0); } break; case ID_Save: //сохранение if (game==TRUE) { if (pause==FALSE) Pause(hwnd); // выделение памяти под строку для имени файла // инициализация строки lstrcpy(filename,"");
// иниц-ция структуры memset(&ofn, 0, sizeof(ofn));
// установка указателя на буфер для имени файла ofn.lpstrFile=filename; // максимальное количество символов в пути ofn.nMaxFile=100; // задаем размер структуры ofn.lStructSize = sizeof(OPENFILENAME); // вызываем диалог сохранения if (GetSaveFileName(&ofn)) { // открытие файла для записи hDest = CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); memset(&pBuffer,0, sizeof(pBuffer)); wsprintf(pBuffer,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", deltax , deltay, scores, // screen[16][18],
//oldscreen[16][18], cup[16][18], cup[0][1],cup[0][2],cup[0][3], figure[0][0], figure[0][1], figure[0][2], figure[0][3], figure[0][4], figure[1][0], figure[1][1], figure[1][2], figure[1][3], figure[1][4], figure[2][0], figure[2][1], figure[2][2], figure[2][3], figure[2][4], figure[3][0], figure[3][1], figure[3][2], figure[3][3], figure[3][4], figure[4][0], figure[4][1], figure[4][2], figure[4][3], figure[4][4], //oldfigure[4][4] );
txt_length=lstrlen(pBuffer); // запись в файл текста WriteFile(hDest, pBuffer, txt_length+1, &written, NULL); /* закрытие файла */ CloseHandle(hDest); /* удаление динамически созданного элемента*/ } } break; default: /* позволяет Windows обрабатывать любые сообщения неуказанные в предыдущем случае */ return DefWindowProc(hwnd, iMsg,wParam,lParam); } return 0;
case WM_SIZE: //размер cxClient=LOWORD (lParam)/10; cyClient=HIWORD (lParam)/16; return 0;
case WM_PAINT: //отрисовка графических объектов
hdc = BeginPaint (hwnd, &ps) ;
for (countx=0;countx<10;countx++) { for (county=0;county<16;county++) { if(screen[countx][county]!=0) { switch(screen[countx][county]) { case 0: colorbrick=RGB(0,0,0); break; case 1: colorbrick=RGB(255,0,0); break; case 2: colorbrick=RGB(0,255,0); break; case 3: colorbrick=RGB(0,0,255); break; case 4: colorbrick=RGB(0,255,255); break; case 5: colorbrick=RGB(255,0,255); break; case 6: colorbrick=RGB(255,255,0); break; break; } //прямоугольник SetRect (&rect, countx*cxClient,county*cyClient, countx*cxClient+cxClient,county*cyClient+cyClient) ; hBrush = CreateSolidBrush (colorbrick);
hBrush = CreateSolidBrush (colorbrick); FillRect (hdc, &rect, hBrush) ; DeleteObject (hBrush) ; } } } EndPaint (hwnd, &ps) ; return 0 ;
case WM_KEYDOWN: //Обработка нажатия клавиши switch (LOWORD(wParam)) { case VK_ESCAPE: //ESCAPE SendMessage(hwnd,WM_CLOSE,0,0L); break;
case VK_LEFT: //LEFT deltax=deltax-1; Bind(deltax,deltay,4); break;
case VK_RIGHT://RIGHT deltax=deltax+1; Bind(deltax,deltay,6); break;
case VK_UP://UP rotate(); Bind(deltax,deltay,5); break;
case VK_DOWN://DOWN oldspeed=speed; speed=100; SetTimer(hwnd, idTimer = 1, speed, NULL); break; } return 0;
case WM_TIMER: //таймер deltay=deltay+1; Bind(deltax,deltay,2); return 0;
case WM_DESTROY : //сообщение выхода KillTimer(hwnd, 1); PostQuitMessage (0) ; //Посылаем сообщение выхода с кодом 0 - нормальное завершение return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; //освобождаем очередь приложения от нераспознаных } |
|