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

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


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

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

Рассылка №38

Visual C++. MFC. Примеры. Lines. Урок 1. Постановка задачи.
Visual C++. MFC. Примеры. Lines. Урок 2. Делаем заготовку с AppWizard.
Visual C++. MFC. Примеры. Lines. Урок 3. Изменения в коде AppWizard'а.
Visual C++. MFC. Примеры. Lines. Урок 4. Добавление переменных в класс документа.
Visual C++. MFC. Примеры. Lines. Урок 5. Кидаем три шарика (метод Throw3Balls).
Visual C++. MFC. Примеры. Lines. Урок 6. Ставим шарик на клеточку (метод SetField).

Полные версии уроков (с картинками) можно найти по адресам
Урок 1. Постановка задачи.
Урок 2. Делаем заготовку с AppWizard.
Урок 3. Изменения в коде AppWizard'а.
Урок 4. Добавление переменных в класс документа.
Урок 5. Кидаем три шарика (метод Throw3Balls).
Урок 6. Ставим шарик на клеточку (метод SetField).

Игра Lines (Visual C++. MFC). Урок 1. Постановка задачи

В этой серии уроков мы напишем игру Lines. Правила просты - на поле 9 на 9 клеток компьютер кидает каждый ход три шарика случайных цветов на три случайных поля. Игрок может передвигать шарики по свободным клеточкам (по горизонтали и по вертикали). Если пять или более шариков выстраиваются в ряд (по горизонтали, вертикали или диагонали), то они уничтожаются (если это произошло в результате хода игрока, то ему начисляются очки и ход не передается компьютеру.

Из дополнений в игре будет звук, возможность сохранения игры, задание параметров (количество цветов, уровень сложности и др.) и возможность многократной отмены хода.

Игра будет развиваться постепенно. Это означает, что некоторые куски кода, которые будут присутствовать сначала, потом могут измениться или вообще замениться на что-нибудь совсем другое.

Наверх

Игра Lines (Visual C++. MFC). Урок 2. Делаем заготовку с AppWizard

Запускаем Visual C++. Делаем новый проект используя MFC AppWizard (EXE).

В качестве типа проекта пишем Lines.

Нажимаем на OK. В появившемся окне мастера выбираем Single Document и оставляем галочку Document/View architecture support.

Нажимаем Next. В шагах 2 и 3 мастера ничего не меняем, а просто нажимаем на Next. На шаге 4 убираем галочку Printing and print preview и нажимаем в этом же окне на кнопку Advanced. В появившемся окне Advanced Options на вкладке Document Template Strings пишем в качестве расширения файла lns, а на вкладке Window Styles убираем галочки Thick frame, Minimize box, Maximize box.

Это мы сделали для того, чтобы у нашего окна нельзя было менять размеры. Нажимаем на Close, и в окне AppWizard - на Next. На шагах 5 и 6 ничего не меняем, а нажимаем на Next и Finish. В появившемся окне с информацией о проекте нажимаем на OK.

С заготовкой для программы все!

Наверх

Игра Lines (Visual C++. MFC). Урок 3. Изменения в коде AppWizard'а

Сейчас при запуске наша программа показывается в окне большого размера. Мы же хотим уменьшить начальный размер нашего окна. Делается это в методе PreCreateWindow класса CMainFrame (не выберите класс CLinesView. В нем тоже есть метод PreCreateWindow). Внесите в этот метод следующий код:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    ...
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    //размер по горизонтали
    cs.cx = 226;
    //размер по вертикали
    cs.cy = 226+(::GetSystemMetrics(SM_CYMENU)+::GetSystemMetrics(SM_CYCAPTION));
    ...

Структура cs, передаваемая в наш метод, позволяет задавать многие параметры нашего окна (кроме начального размера можно задавать ещё и его начальное положение, стили, заголовок и др.).

Внесем еще изменения. Сейчас у нас показываются StatusBar и ToolBox. Временно мы их отключим. После того, как мы разберемся с другими вещами, StatusBar и ToolBox вновь появятся в нашем проекте. Пока же просто закомментируйте следующий код:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
    /*
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    ...
    DockControlBar(&m_wndToolBar);
    */
    return 0;
}

Теперь при запуске программы StatusBar и ToolBox показываться не будут.

И, наконец, последнее изменение. Удалите из нашего меню Edit пункты Cut, Copy, Paste и разделитель. Они в нашей программе не понадобятся.

Наверх

Игра Lines (Visual C++. MFC). Урок 4. Добавление переменных в класс документа

Для того, чтобы не писать каждый раз конкретные числа для максимального количества шариков и для размера игрового поля, добавьте в класс CLinesDoc следующие константы:

...
const int iNumOfColors=5;//количество цветов (7 максимум)
const int iNumOfRows=9;//количество рядов (9 в классическом варианте)

class CLinesDoc : public CDocument
{
 ...

Далее добавим несколько переменных-членов в класс CLinesDoc:

class CLinesDoc : public CDocument
{
    ...
    // Attributes
public:
    int m_iNumOfRows; // количество рядов игрового поля
    int m_iNumOfColors; //максимальное количество цветов
    int m_iNumOfPoints; //количество очков
    int m_iNumOfBalls; //количество шариков на поле
    int m_field[iNumOfRows][iNumOfRows]; //массив, задающий игровое поле
    ...

Массив m_field задает игровое поле. Ноль будет означать, что поле свободно, а цифры от 1 до 7 - что поле занято (каждое число будет означать шарик определенного цвета).

Теперь добавим в конструктор класса CLinesDoc инициализацию переменных:

CLinesDoc::CLinesDoc()
{
 // TODO: add one-time construction code here
    m_iNumOfColors=7;//количество цветов (7 максимум)
    m_iNumOfRows=9;
}

Переходим теперь в метод OnNewDocument класса CLinesDoc. В него добавьте следующий код:

BOOL CLinesDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)
    m_iNumOfBalls=0; //Шариков на поле пока нет
    m_iNumOfPoints=0;//Количество очков (пока ноль)
    srand(GetTickCount()%32000); //Инициализируем датчик случайных чисел
    for(int j=0;j<m_iNumOfRows;j++){
        for(int i=0;i<m_iNumOfRows;i++){
            m_field[i][j]=0; //заполняем поле нулями
        }
    }
    ...
Наверх

Игра Lines (Visual C++. MFC). Урок 5. Кидаем три шарика (метод Throw3Balls)

Нам нужна функция, которая выкидывает на поле три шарика случайных цветов. Добавим её в наш класс CLinesDoc. Для этого вызываем контекстном меню для класса CLinesDoc и выбираем в нем Add Member Function.

В появившемся диалоге Add Member Function вводим тип функции (bool) и её имя с параметрами.

Нажмите OK. Новая функция появится на вкладке ClassView.

Сделайте на ней двойной щелчок для перехода в окно редактора. В сгенерированную заготовку введите следуюший код:

bool CLinesDoc::Throw3Balls(int iNum)
{
    int x, y; //место, в которое кидаем шарик
    int iColor; //цвет шарика
    if(iNum!=0){
        for(int i=0;i<iNum;i++){
            //выбор свободного места
            do{
                x=rand()%m_iNumOfRows;
                y=rand()%m_iNumOfRows;
            }while(m_field[x][y]!=0);
            //выбор цвета
            iColor=rand()%m_iNumOfColors+1;
            SetField(x,y,iColor); //ставим шарик нужного цвета
        }
        return true;
    }
    else{
        AfxMessageBox("Игра закончена!");
        return false;
    }
}

Этот метод возвратит true, если шарик удалось кинуть на поле хотя бы один шарик, и false, если свободных клеточек нет. В качестве параметра он принимает iNum - сколько шариков надо кидать (чаще всего оно равно трём, но в начале игры - пяти, а в самом конце игры может оказаться равным и двум или одному, в зависимости от того, сколько свободных клеточек осталось).

Обратите внимание, что для установки шарика на поле вызывается метод SetField:

            ...
            SetField(x,y,iColor); //ставим шарик нужного цвета
            ...

Этого метода пока нет. Его мы напишем в следующем уроке.

Наверх

Игра Lines (Visual C++. MFC). Урок 6. Ставим шарик на клеточку (метод SetField)

Добавьте в класс CLinesDoc метод SetField:

void CLinesDoc::SetField(int x, int y, int iColor)
{
    //устанавливает шарик цвета iColor
    m_field[x][y]=iColor;
    switch(iColor){
    case 1://увеличиваем счётчик количества шариков на поле
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
        m_iNumOfBalls++;
        break;
    default:    //уменьшаем счётчик расположенных на поле шариков
        m_iNumOfBalls--;
        break;
    }
    SetModifiedFlag();//устанавливаем флаг изменения документа

}

Переменную m_iNumOfBalls мы уменьшаем или увеличиваем на 1, в зависимости от того, ставим ли мы шарик (iColor больше нуля) или убираем его (iColor равно нулю).

Наверх

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

Copyright cайт progs.biz, 2002



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

В избранное