Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка игры 
:(
    Опции темы
kolyann
Дата 17.1.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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) ; //освобождаем очередь приложения от нераспознаных
}


PM MAIL   Вверх
Dem_max
Дата 18.1.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



дык у тебя pBuffer пустой, ибо это просто указатель в никуда, как у тебя еще приложение не падает с ошибкой.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Estranged
Дата 18.1.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: 3
Всего: 3



Ну так даже если посмотреть на количество загружаемых данных и сохраняемых, то становится понятно, то сохраняется куда больше, чем загружается. Мало того, даже разные переменные сохраняем и загружаем.

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]); 

Это что такое? В позицию screen[16][18] прочитать целое число, 4-е по счету, а 4-е по счету что сохранили? cup[16][18]! И это как бы нелогично, потому что cup[16][18] тоже участвует в загрузке, 6-й по счету, что было cup[0][2] при сохранении.

Для начала согласуйте список загружаемых и сохраняемых переменных.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.