Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://progs.biz

Рассылка №40

Visual C++. MFC. Примеры. Lines. Урок 13. Метод CalcPoints.
Visual C++. MFC. Примеры. Lines. Урок 14. Метод Delete5InLine.
Visual C++. MFC. Примеры. Lines. Урок 15. Метод StopGame.
Visual C++. MFC. Примеры. Lines. Урок 16. Оживляем шарики.
Visual C++. MFC. Примеры. Lines. Урок 17. Сохранение партии.

Полные версии уроков (с картинками) можно найти по адресам
Урок 13. Метод CalcPoints.
Урок 14. Метод Delete5InLine.
Урок 15. Метод StopGame.
Урок 16. Оживляем шарики.
Урок 17. Сохранение партии.

Игра Lines (Visual C++. MFC). Урок 13. Метод CalcPoints

В этом уроке мы добавим функцию для вычисления количества очков, прибавляемых при уничтожении некольких идущих подряд шариков.

Добавьте в заголовочный файл для класса CLinesDoc следующий заголовок функции:

    ...
    int CalcPoints(int iNumDeletedBalls);
    ...

В заготовку для нашей функции внесите следующий код:

int CLinesDoc::CalcPoints(int iNumDeletedBalls)
{
    int iRes;
    if(iNumDeletedBalls<5){
        return 0;
    }
    else{
        iRes = 2* iNumDeletedBalls*iNumDeletedBalls
            -20*iNumDeletedBalls+60;
    }
    return iRes;
}

Теперь раскомментируйте строчку с написанным ранее вызовом метода CalcPoints:

bool CLinesDoc::Is5InLine(int x, int y, bool bAddPoints){
    ...
    if(bAddPoints){
        m_iNumOfPoints+=CalcPoints(iWasNumOfBalls-m_iNumOfBalls);
    }
    ...
}

Этот метод, пожалуй, самый простой в этой программе.

Наверх

Игра Lines (Visual C++. MFC). Урок 14. Метод Delete5InLine

В этом уроке мы, наконец-то, добавим метод для уничтожения пяти или более одноцветных шариков.

Внесите в заголовочный файл для класса CLinesDoc прототип для нашего метода Delete5InLine:

    ...
    void Delete5InLine(int x1, int y1, int x2, int y2);
    ...

Добавьте для нашего метода следующий код (в файле реализации класса CLinesDoc):

void CLinesDoc::Delete5InLine(int x1, int y1, int x2, int y2)
{
    //удаляет 5 шариков, расположенных в ряд
    //от поля (x1, y1) до поля (x2, y2).
    int i;
 //удаление по горизонтали
    if(y1==y2){
        for(i=x1;i<=x2;i++){
            if(m_field[i][y1]!=0){
                SetField(i,y1,0);
            }
        }
    }
    //удаление по вертикали
    if(x1==x2){
        for(i=y1;i<=y2;i++){
            if(m_field[x1][i]!=0){
                SetField(x1,i,0);
            }
        }
    }
    //удаление по диагонали сверху-слева - снизу-справа
    if((x1<x2) && (y1<y2)){
        for(i=x1;i<=x2;i++){
            if(m_field[i][y1-x1+i]!=0){
                SetField(i,y1-x1+i,0);
            }
        }
    }
    //удаление по диагонали снизу-слева - сверху-справа
    if((x1>x2) && (y1<y2)){
        for(i=y1;i<=y2;i++){
            if(m_field[x1+y1-i][i]!=0){
                SetField(x1+y1-i,i,0);
            }
        }
    }
}

Теперь раскомментируйте четыре вызова нашего метода в методе Is5InLine. Вызов MessageBox'а при этом можно удалить. Вот так должен выглядеть перый вызов (остальные три - аналогично):

    ...
    if(iS+iN+1>=5){//есть 5 в ряд
        Delete5InLine(x,y-iN,x,y+iS);
        bRes=true;
    }
    ...

Запустите программу. Наша игра уже полностью работоспособна. Шарики появляются и изчезают, очки начисляются. Все отлично.

На последующих уроках мы будем усовершенствовать нашу программу.

Наверх

Игра Lines (Visual C++. MFC). Урок 15. Метод StopGame

На этом совсем коротком уроке мы с вами добавим в нашу программу метод StopGame. Как ясно из названия, он будет выполняться при завершении игры.

Добавьте в заголовочный файл класса CLinesDoc строку

    ...
    void StopGame();
    ...

Далее в файл реализации (LinesDoc.cpp) добавьте следующий код:

void CLinesDoc::StopGame()
{
    AfxMessageBox("Игра закончена!");
}

Пока наш метод ничего кроме MessageBox'а не показывает, но в дальнейшем мы сможем записать в него и что-нибудь более интересное.

Теперь вызовем наш метод. Для этого в методе OnLButtonDown класса CLinesView добавьте строчку

                    ...
                    if(pDoc->m_iNumOfRows*pDoc->m_iNumOfRows
                        ==pDoc->m_iNumOfBalls){
                        pDoc->StopGame();
                    }
                    ...

Теперь в конце игры будет появляться наш MessageBox.

С этим уроком все.

Наверх

Игра Lines (Visual C++. MFC). Урок 16. Оживляем шарики

В этом уроке мы с вами слегка оживим нашу игру, а именно сделаем так, чтобы при щелчке на шарике он начал пульсировать.

Для начала добавьте в папку res нашего проекта еще 7 файлов (red1.bmp, rose1.bmp, green1.bmp, blue1.bmp, brown1.bmp, yellow1.bmp и black1.bmp). Размеры эти картинок - 24 на 24. На картинках изобразите, скажем, уменьшенные копии шариков соответствующих цветов. Наши новые картинки будут меняться местами с соответствующими оригинальными по таймеру, в результате чего и будет казаться, что наши шарики пульсируют. После добавления файлов с рисунками в папку res вызовите контекстное меню для пункта bitmap вкладки ResourceView, в котором выберите пункт Import.

В появившемся диалоге Import Resource в Files of Type укажите все типы файлов, выделите необходимые файлы и нажмите на кнопку Import.

Измените идентификаторы картинок на IDB_BLACK1, IDB_BLUE1 и т. д..

Теперь начинаем вносить изменения и дополнения в наш код.

Во-первых, добавьте в класс вида три переменные:

class CLinesView : public CView
{
    ...
public:
    ...
    int m_iBallSize; //Текущий размер шарика (0 или 1)
    int x0, y0; //кординаты текущего выбранного шарика
    ...

Переменной m_iBallSize задаем начальное значение в конструкторе:

CLinesView::CLinesView() { ... m_iBallSize=1; }

Переменные x0 и y0 мы уже завели ранее в методе OnLButtonUp. Теперь мы их перетащили в переменные класса, так как они понадобятся нам еще и в других методах. В методе же OnLButtonUp их надо убрать:

void CLinesView::OnLButtonUp(UINT nFlags, CPoint point)
{
    ...
    static int x0; //эти две строчки удаляем
    static int y0;
    ...

Далее добавляем в класс CLinesView обработчик для сообщения WM_TIMER. В его заготовке для кода пишем следующие строки:

void CLinesView::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    if(m_iBallSize==0){
        m_iBallSize=1;
    }
    else{
        m_iBallSize=0;
    }
    InvalidateRect(CRect(24*x0,24*y0,24*(x0+1),24*(y0+1)), FALSE);
    MessageBeep(0xFFFFFFFF);
    CView::OnTimer(nIDEvent);
}

В этом обработчике мы просто изменяем значение переменной m_iBallSize на другое и издаем звуковой сигнал.

Далее измените метод OnDraw следующим образом:

void CLinesView::OnDraw(CDC* pDC)
{
            ...
            switch(pDoc->m_field[i][j]){
            case 1:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BLACK1);
                else
                    bitmap.LoadBitmap(IDB_BLACK);
                break;
            case 2:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BLUE1);
                else
                    bitmap.LoadBitmap(IDB_BLUE);
                break;
            case 3:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BROWN1);
                else
                    bitmap.LoadBitmap(IDB_BROWN);
                break;
            case 4:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_GREEN1);
                else
                    bitmap.LoadBitmap(IDB_GREEN);
                break;
            case 5:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_RED1);
                else
                    bitmap.LoadBitmap(IDB_RED);
                break;
            case 6:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_ROSE1);
                else
                    bitmap.LoadBitmap(IDB_ROSE);
                break;
            case 7:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_YELLOW1);
                else
                    bitmap.LoadBitmap(IDB_YELLOW);
                break;
            default:
                bitmap.LoadBitmap(IDB_NO_COLOR);
                break;
            }
            ...
        }
    }
}

Далее внесите в метод OnLButtonUp класса CLinesView следующие изменения:

void CLinesView::OnLButtonUp(UINT nFlags, CPoint point)
{       ...
        x0=x;//запоминем выбраный шарик
        y0=y;
        SetTimer(1,370,0);
    }
    else{//т. е. щелкаем не на шарике
        if(bMove){//если шарик выбран
            if(pDoc->IsPath(x0, y0, x, y)){
                KillTimer(1);
                pDoc->MoveBall(x0, y0, x, y);
        ...
    }

Теперь можно нашу программу в очередной раз запускать. При щелчке на любом шарике он будет пульсировать и издавать звук.

Наверх

Игра Lines (Visual C++. MFC). Урок 17. Сохранение партии

Пока, несмотря на наличие пунктов меню Save и Save As... и появления соответствующих диалогов, наши партии не сохраняются на диске. Сейчас мы исправим это.

Найдите в классе документа метод Serialize и внесите в него следующие изменения:

void CLinesDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())

    {
        // TODO: add storing code here
        ar<<m_iNumOfColors;
        ar<<m_iNumOfRows;
        ar<<m_iNumOfPoints;
        ar<<m_iNumOfBalls;
        for(int j=0;j<m_iNumOfRows;j++){
            for(int i=0;i<m_iNumOfRows;i++){
                ar<<m_field[i][j];
            }
        }
    }
    else
    {
        // TODO: add loading code here
        ar>>m_iNumOfColors;
        ar>>m_iNumOfRows;
        ar>>m_iNumOfPoints;
        ar>>m_iNumOfBalls;
        for(int j=0;j<m_iNumOfRows;j++){
            for(int i=0;i<m_iNumOfRows;i++){
                ar>>m_field[i][j];
            }
        }
    }
}

Это все! Теперь при выборе пункта меню Save (или Save As...) наша партия будет сохраняться в заданном файле. Разумеется, сохраненную партию потом можно будет из файла и прочитать.

Наверх

Другие рассылки с сайта progs.biz:

Рассылки Subscribe.Ru
Visual Basic. Уроки.
Новости сайта progs.biz
  • Уроки по Visual Basic с сайта progs.biz по различным темам. Создание элементов ActiveX, примеры и исходники, FAQ, VB.NET и многое другое
  • Краткое описание всех новых уроков и материалов на сайте progs.biz. Основные направления - языки программирования (Visual C++, Visual Basic.NET, C#, Delphi, Java), WEB-дизайн (HTML, PHP, PhotoShop, SSI), базы данных.

Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное