На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Как сделать обход препятствий в С++ Builder???
    Как сделать обход препятствий в С++ Builder???
    Движение игрока по клику мыши уже готово.
    Вот мой код:
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
    int X, int Y)
    {
    x=X;
    y=Y;
    Timer1->Enabled=true;
    }

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    if (Image1->Top>y) Image1->Top=Image1->Top-1;
    if (Image1->Top<y) Image1->Top=Image1->Top+1;
    if (Image1->Left>x) Image1->Left=Image1->Left-1;
    if (Image1->Left<x) Image1->Left=Image1->Left+1;
    if (Image1->Top==y && Image1->Left==x) Timer1->Enabled=false;
    }
      Для обхода препятствий вам нужно добавить в свой код проверки на наличие препятствий перед перемещением игрока.

      Одним из способов проверки может быть использование матрицы, где каждый элемент представляет собой ячейку на игровом поле. Если ячейка свободна, то ее значение будет равно 0, если же она занята препятствием, то значение будет равно 1.

      Пример реализации обхода препятствий в вашем коде:

      ExpandedWrap disabled
        void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
        {
        int destX = X;
        int destY = Y;
         
        // Проверяем, что ячейка, в которую мы хотим переместиться, свободна
        if (gameField[destX][destY] != 0)
        {
            // Если ячейка занята, то ищем ближайшую свободную ячейку
            int step = 1;
            while (true)
            {
                for (int i = destX - step; i <= destX + step; i++)
                {
                    for (int j = destY - step; j <= destY + step; j++)
                    {
                        // Проверяем, что ячейка свободна
                        if (gameField[i][j] == 0)
                        {
                            destX = i;
                            destY = j;
                            break;
                        }
                    }
                    if (destY != Y) break;
                }
                if (destX != X) break;
                step++;
            }
        }
         
        // Запускаем таймер с новыми координатами
        x = destX;
        y = destY;
        Timer1->Enabled = true;
        }
         
        void __fastcall TForm1::Timer1Timer(TObject *Sender)
        {
        if (Image1->Top > y) Image1->Top = Image1->Top - 1;
        if (Image1->Top < y) Image1->Top = Image1->Top + 1;
        if (Image1->Left > x) Image1->Left = Image1->Left - 1;
        if (Image1->Left < x) Image1->Left = Image1->Left + 1;
        if (Image1->Top == y && Image1->Left == x) Timer1->Enabled = false;
        }

      В данном примере предполагается, что игровое поле представлено двумерной матрицей gameField, где значение 0 означает свободную ячейку, а значение 1 - занятую препятствием. При клике мыши на новую позицию (X,Y) мы сначала проверяем, свободна ли ячейка gameField[X][Y]. Если она занята, то ищем ближайшую свободную ячейку с помощью цикла while и проверок. Когда найдем свободную ячейку, запускаем таймер с новыми координатами (destX, destY).
        Как объявить массив gameField и сделать сетку???
          !!!!!!!!!!!!!!!Именно в этом примере??? КАК???!!!!!!!!!!!!!!!!!!
            В общем случае задача через забор if'ов не решается (если "препятствия" имеют произвольную геометрию). Тут какой-нибудь Волновой алгоритм уместнее. Или алгоритм Дейстра, если рассматривать каждую точку как элемент графа.
              А что мы пишем если это не есть секрет? :)
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0269 ]   [ 15 queries used ]   [ Generated: 27.07.24, 03:40 GMT ]