C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 12. Метод Is5InLine / Lines / Примеры разработки

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

Сейчас в нашей игре если пять или более шариков одного цвета оказываются расположенными подряд, то они не исчезают. Начнем исправлять это. Сейчас мы напишем метод Is5InLine класса CLinesDoc, который будет отвечать на вопрос, есть ли ряд из пяти или более одноцветных шариков.

Добавьте метод со следующим прототипом

    bool Is5InLine(int x, int y, bool bAddPoints);

в заловочный файл класса CLinesDoc. В тело метода внесите следующий код:

bool CLinesDoc::Is5InLine(int x, int y, bool bAddPoints){
    //проверяет, есть ли 5 или более шариков подряд
    //int x1=x, y1=y;//координаты поля справа, слева и т.п.
    int i;//смещение относительно точки (x, y)
    bool bSeeFuther;//смотрим ли далее
    //число совпадений вправо, влево, вверх и вниз
    int iO=0, iW=0, iN=0, iS=0;
    //число совпадений вправо-вверх, влево-вверх, вправо-вниз и влево-вниз
    int iNO=0, iNW=0, iSO=0, iSW=0;
    bool bRes =false;//возвращемое значение
    
    //смотрим вправо
    bSeeFuther=true;
    i=1;
    while(x+i<iNumOfRows &amp;&amp; bSeeFuther){//если поле справа существует
        bSeeFuther=false;
        if(m_field[x+i][y]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iO++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //смотрим влево
    bSeeFuther=true;
    i=1;
    while(x-i>=0 && bSeeFuther){//если поле справа существует
        bSeeFuther=false;
        if(m_field[x-i][y]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iW++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //смотрим вниз
    bSeeFuther=true;
    i=1;
    while(y+i<iNumOfRows && bSeeFuther){//если поле справа существует
        bSeeFuther=false;
        if(m_field[x][y+i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iS++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //вмотри вверх
    bSeeFuther=true;
    i=1;
    while(y-i>=0 && bSeeFuther){//если поле справа существует
        bSeeFuther=false;
        if(m_field[x][y-i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iN++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    /////////////проверки диагоналей/////////////
    //смотрим вправо-вниз
    bSeeFuther=true;
    i=1;
    //если поле справа внизу существует
    while(x+i<iNumOfRows && y+i<iNumOfRows && bSeeFuther){
        bSeeFuther=false;
        if(m_field[x+i][y+i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iSO++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //смотрим вверх-влево
    bSeeFuther=true;
    i=1;
    while(x-i>=0 && y-i>=0 && bSeeFuther){//если поле слева вверху существует
        bSeeFuther=false;
        if(m_field[x-i][y-i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iNW++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //смотрим вправо-вверх
    bSeeFuther=true;
    i=1;
    while(x+i<iNumOfRows && y-i>=0 && bSeeFuther){//если поле справа вверху существует
        bSeeFuther=false;
        if(m_field[x+i][y-i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iNO++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //смотрим вниз-влево
    bSeeFuther=true;
    i=1;
    while(x-i>=0 && y+i<iNumOfRows && bSeeFuther){//если поле слева внизу существует
        bSeeFuther=false;
        if(m_field[x-i][y+i]==m_field[x][y]){//и его цвет совпадает с цветом (x,y)
            iSW++;//увеличиваем счётчик совпадений вправо
            bSeeFuther=true;
        }
        i++;
    };
    
    //запоминаем, сколько шариков было до удаления
    int iWasNumOfBalls = m_iNumOfBalls;
    if(iS+iN+1>=5){//есть 5 в ряд
        AfxMessageBox("5 в ряд по вертикали", NULL, NULL);
        //Delete5InLine(x,y-iN,x,y+iS); (пока закомментируем)
        bRes=true;
        //return true;
    }
    if(iO+iW+1>=5){//есть 5 в ряд
        AfxMessageBox("5 в ряд по горизонтали", NULL, NULL);
        //Delete5InLine(x-iW,y,x+iO,y); (пока закомментируем)
        bRes=true;
        //return true;
    }
    
    //есть 5 в ряд по диагонали слева-сверху справа-снизу
    if(iNW+iSO+1>=5){
        AfxMessageBox("5 в ряд по диагонали слева-сверху справа-снизу", NULL, NULL);
        //Delete5InLine(x-iNW,y-iNW,x+iSO,y+iSO); (пока закомментируем)
        bRes=true;
        //return true;
    }
    
    //есть 5 в ряд по диагонали справа-сверху слева-снизу
    if(iSW+iNO+1>=5){
        AfxMessageBox("5 в ряд по диагонали справа-сверху слева-снизу", NULL, NULL);
        //Delete5InLine(x+iNO,y-iNO,x-iSW,y+iSW); (пока закомментируем)
        bRes=true;
        //return true;
    }
    
    if(bAddPoints){
        //(пока закомментируем)
        //m_iNumOfPoints+=CalcPoints(iWasNumOfBalls-m_iNumOfBalls);
    }
    return bRes;//нет 5 в ряд
}

Обратите внимание, что наш метод вызывает другой метод - Delete5InLine, который удаляет пять или более шариков, идущих подряд. Этот метод мы пока не написали, поэтому пока соответствующие места у нас закомментированы. Но для того, чтобы было видно, что наш метод все-таки обнаруживает несколько идущих подряд шариков, мы вставили строчки типа

    ...
    AfxMessageBox("5 в ряд по вертикали", NULL, NULL);
    ...

которые просто будут показывать соответствующий MessageBox. Потом мы эти строчки уберем за ненадобностью.

Аналогично с методом CalcPoints в строке

    ...
    if(bAddPoints){
        //m_iNumOfPoints+=CalcPoints(iWasNumOfBalls-m_iNumOfBalls);//(пока закомментируем)
    }

Этот метод нужен для подсчета очков. Его мы тоже напишем позже.

Теперь найдите в методе OnLButtonDown класса CLinesView заглушку

                ...
                //если нет пяти в ряд
                if(/*!pDoc->Is5InLine(x, y, true)*/!false){   //ставим временную заглушку,
                ...

и замените ее на

                ...
                //если нет пяти в ряд
                if(!pDoc->Is5InLine(x,y,true)){
                ...

Значение последнего параметра (true) в методе Is5InLine означает, что игроку будут начислятся очки.

И осталось еще мелкое изменение. Понятно, что шарики могут изчезать не только при ходе игрока, но и при ходе компьютера. Найдите метод Throw3Balls класса CLinesDoc и внесите в него следующие изменения:

            ...
            iColor=rand()%m_iNumOfColors+1;
            SetField(x,y,iColor); //ставим шарик нужного цвета
            Is5InLine(x, y, false);
        }
        ...

Значение последнего параметра (false) означает, что очки игроку начислятся не будут.

Если в теперь запустите программу, то при образовании ряда из пяти (или более) шариков одного цвета по горизонтали (или по другим направлениям) возникнет соответствующий MessageBox:

MessageBox

Правда сами шарики при этом исчезать не будут. Но этим мы займемся позже.