Форум программистов, компьютерный форум CyberForum.ru

Пакман на Си. Не могу реализовать корректное передвижение по массиву - C++

Восстановить пароль Регистрация
 
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
15.05.2014, 23:58     Пакман на Си. Не могу реализовать корректное передвижение по массиву #1
Пишу пакмана на экзамен по Си. Столкнулся с проблемой отображения приведения которое бегает за игроком. Проблема заключается в следующем:
Есть текущая координата и координата на которую надо перейти приведению.
При переходе я запоминаю содержимое координаты на которую надо перейти приведению.
Перемещаю приведение на координату на которую надо перейти приведению.
А на предыдущее место ставлю сохраненное содержимое. То есть меняю содержимое двух соседних клеток местами.

НО!!

Точки которые должен есть пакман после прохода монстра становятса не на свои первоначальные места.

Подскажите алгоритм пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2014, 23:58     Пакман на Си. Не могу реализовать корректное передвижение по массиву
Посмотрите здесь:

C++ Не могу реализовать
не могу найти ошибку в поиске по массиву структур C++
Не могу реализовать программу из ЕГЭ, ошибка на вводе. C++
C++ Пытаюсь вывести латинские буквы но не могу реализовать затею
Не могу реализовать класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
16.05.2014, 00:39     Пакман на Си. Не могу реализовать корректное передвижение по массиву #2
добрый вечер, сделайте скрин отрисовки того, что получается
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
16.05.2014, 00:46  [ТС]     Пакман на Си. Не могу реализовать корректное передвижение по массиву #3
Добрый! Вот
Кликните здесь для просмотра всего текста

Пакман на Си. Не могу реализовать корректное передвижение по массиву
Пакман на Си. Не могу реализовать корректное передвижение по массиву
Пакман на Си. Не могу реализовать корректное передвижение по массиву


На последней картинке видно как точка появилась не на своем месте.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
16.05.2014, 01:04     Пакман на Си. Не могу реализовать корректное передвижение по массиву #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
char field[7][7] = {Z, Z, Z, Z, Z, Z, Z
                          Z, Z, Z, Z, Z, Z, Z,
                          Z, Z, Z, Z, O, Z, Z,
                          Z, Z, Z, Z, Z, Z, Z,
                          Z, Z, Z, Z, Z, Z, Z,
                          Z, Z, Z, Z, Z, Z, Z}
 
int Player[2] = {3, 5};
int Privedeniya[4][2] = { {2, 1}, {4,2}, {5,5}, {3,3} };
 
while(game_over )
{
     Проверяем_на_нажатие_кнопок(тут проверяем может ли плеер сделать этот ход и меняем значение x = Player[0] и y= Player[1]);
     Приведение_ход(   for(...){Privedeniya[i][2] }   );
// фактически в данный момент на одной и той же ячейке и приведение и и его содержимое,
// но потому что отрисовка приведений после отрисовки поля, то на экране будет приведение
// по логике плеер становясь на ячейку проверяет не приведение ли это, если нет ищет там монетку - если находит то норм
     game_over = Проверка_столкновение(  
 
if ( arr[Player[0]][Player[1]] == Z) coins++
for(...)
{
     if ( Privedeniya[i][0] = Player[0] && Privedeniya[i][1] = Player[1] )
      *game_over = true;
}
 
 
 )
 
     drawField();
     drawPlayer();
     drawEnemy( setCursorPosition заменить отрисованые на тех позициях монетки или что там было на приведение);
     if(game_over == true) drawGAMEOVER();
 
     
}
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
16.05.2014, 11:36  [ТС]     Пакман на Си. Не могу реализовать корректное передвижение по массиву #5
Проверка на столкновение приведения с игроком реализована. Проблема в передвижение приведения по полю. Алгоритм уже додумал.
При передвижении приведения на клетку вперед должна запомнится эта целевая клетка и только после передвижения на вторую клетку мы возвращаем значение первой клетки и запоминаем содержимое следующей третьей при передвижении на третью запомнили четвертую и заполонили вторую (а стоим на третьей). То есть сначала запомнили переставили потом запомнили следующую и только потом заполнили первую потом запомнили третью переставили на третью запомнили четвертую и заполнили вторую. То есть заметаем следы как бы за собой.
Я думал сделать глобальный массив чтоб запоминались координаты ячеек и их содержимое. Может есть какой то другой вариант?

Добавлено через 7 минут
Передвижение монстра происходит в файле find_path.cpp в самом конце. Проблема там.
Кликните здесь для просмотра всего текста
[cut]
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.05.2014, 12:30     Пакман на Си. Не могу реализовать корректное передвижение по массиву #6
по-моему, неподвижные клетки вообще никак не должны изменяться в массиве. То есть поле это одно, а привидения это другое. Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char field[width][height];//поле
struct unit{
  int x, y;//привидение
  char name;
}ghosts[ghost_num];
void DrawGame(){
for (int i=0; i<height; ++i){
  for (int j=0; j<width; ++j)
    for (int k=0; k<ghost_num; ++k)
      if (ghosts[k].x==i && ghosts[k].y==j)
         cout<<ghosts[k].name;
      else
         cout<<field[i][j];
  cout<<endl;
}
}
void DrawSingleMove(int ghost_id, dir_x, dir_y){
  COORD pos;
  pos.x=ghosts[ghost_id].x;
  pos.y=ghosts[ghost_id].y;
  SetConsoleCursorPosition(ConsoleHandle, Pos);
  cout<<field[i][j];
  
  pos.x=(ghosts[ghost_id].x+=dir_x);
  pos.y=(ghosts[ghost_id].y+=dir_y);
  SetConsoleCursorPosition(ConsoleHandle, Pos);
  cout<<ghosts[ghost_id].name;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 19:16     Пакман на Си. Не могу реализовать корректное передвижение по массиву
Еще ссылки по теме:

Не могу реализовать очередь (модель дозаправки самолетов в воздухе) C++
C++ Пакман на Си. Реализация таймера
C++ Не могу реализовать метод visit() класса List

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
16.05.2014, 19:16  [ТС]     Пакман на Си. Не могу реализовать корректное передвижение по массиву #7
Kuzia domovenok, первая ф-ция понятна. Вы предлагаете отрисовывать монстра виртуально то есть просто выводить в определенную координату монстра, а сама координата будет иметь совсем другое содержимое, верно?
А вторая делает тоже самое только через позицию курсора?

Но тогда не получится вести учет когда монстр натолкнулся на игрока. Так как нужно каждый раз при каждом шаге заново искать путь от монстра к игроку. По средству построчной проверки игрового поля и присваиванием определенных значений в рабочее поле. А если будем просто накладывать изображение без физического подкрепления то не получиться найти путь от точки А в точку Б или путь будет всегда одинаковым.

Вот прикреплю ф-цию поиска и с отрисовкой.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
void Find_path (int maze[][col], bool &stop, int grid[row][col])
{
    int Ni=0;                   //счетчик распространения волны
    const int Nk=64;            //рaвна мaксимaльно возможному числу итерaций Ni не должно быть больше Nk
    bool chek=false;            //для выхода из циклов фор которые распространяют волну
 
    do {
        for (int i=0; i<row; i++)           //кaждому элементу рaбочего поля [i][j] присвaивaем знaчение в зaвисимости от свойств квадрата [i][j] по следующим правилам
        {
            for (int j=0; j<col; j++)
            {
                if (grid[i][j]==Ni)         //поиск идет с финиша. клетки по которым идет волна увеличиваются от финиша пока не дойдет до старта
                {
                    if (grid [i+1][j]==253 || grid [i-1][j]==253 || grid [i][j+1]==253 || grid [i][j-1]==253)  //если равно стартовой позиции то переход к этaпу построения мaршрута перемещения
                    {
                        chek=true;
                        break;
                    }
                    if (grid [i+1][j]==254)  //если равно проходимой позиции то присваиваем
                        grid [i+1][j]=Ni+1;
 
                    if (grid [i-1][j]==254)  //если равно проходимой позиции то присваиваем
                        grid [i-1][j]=Ni+1;
 
                    if (grid [i][j+1]==254)  //если равно проходимой позиции то присваиваем
                        grid [i][j+1]=Ni+1;
 
                    if (grid [i][j-1]==254)  //если равно проходимой позиции то присваиваем
                        grid [i][j-1]=Ni+1;
                }
            }
            if (chek==true)
            {
                //chek=false;
                break;
            }
        }
 
        Ni+=1;                      //По зaвершению построчного просмотрa всего мaссивa увеличивaем волну Ni нa 1.
 
        if (Ni>Nk)                  //если Ni>Nk то поиск мaршрутa признаётся неудачным 
        {
            system ("cls");
            cout<<"(Ni>Nk)"<<endl;
            stop=true;              //выходит из игры в мейне
            return;
        }
    }while (chek==false);           //пускаем волну пока grid [i][j] не равно стартовой позиции
 
 
    //---------------------------------------------Этaп построения мaршрутa перемещения---------------------------------
    
    int x=0;                        //знaчения координaт стaртовой позиции
    int y=0;
    int x1=0;                       //для поиска наименьшего значения в окрестности рабочего поля [x][y]
    int y1=0;   
 
    for (int i=0; i<row; i++)       //поиск стартовой позиции
    {
        for (int j=0; j<col; j++)
        {
            if (grid[i][j]==253)    //если квадрат рабочего поля [i][j] равен стартовой позиции то
            {
                x=i;                //присваиваем координаты
                y=j;
                break;
            }
        }
    }
 
    SetConsoleCursorPosition(0, 33);
    cout<<'['<<setw(2)<<x<<' '<<setw(2)<<y<<']'<<endl;
 
    if (grid[x+1][y]<grid[x][y])    //поиск наименьшего значения Ni в окрестности рабочего поля [x][y] для перемещения монстра
    {
        x1=x+1;
        y1=y;
    }
    if (grid[x-1][y]<grid[x][y])
    {
        x1=x-1;
        y1=y;
    }
    if (grid[x][y+1]<grid[x][y])
    {
        x1=x;
        y1=y+2;
    }
    if (grid[x][y-1]<grid[x][y])
    {
        x1=x;
        y1=y-2;
    }
    if (grid[x1][y1]==0)            //если монстр догнал игрока то 
    {
        //int tmp=maze[x][y];
        SetConsoleCursorPosition(y1, x1);
        maze[x1][y1]=maze[x][y];
        printf("%c", maze[x1][y1]);
 
        SetConsoleCursorPosition(y, x);
        maze[x][y]=255;
        printf("%c", maze[x][y]);
 
        system ("cls");
        cout<<"You Loose!!"<<endl;
        stop=true;                  //выходит из игры в мейне
        return;
    }
 
    //----------------------------------------------Передвижение монстра Р-----------------------------
 
    _getch ();
 
    /*int tmp=maze[x1][y1];
    SetConsoleCursorPosition(y1, x1);
    maze[x1][y1]=maze[x][y];
    printf("%c", maze[x1][y1]);
 
    SetConsoleCursorPosition(y, x);
    maze[x][y]=tmp;
    printf("%c", maze[x][y]);*/
 
    int tmp=maze[x1][y1];
    SetConsoleCursorPosition(y1, x1);
    maze[x1][y1]=maze[x][y];
    printf("%c", maze[x1][y1]);
 
    SetConsoleCursorPosition(y, x);
    maze[x][y]=tmp;
    printf("%c", maze[x][y]);
    
    SetConsoleCursorPosition(0, 35);
    cout<<'['<<setw(2)<<x1<<' '<<setw(2)<<y1<<']'<<endl;
}


Добавлено через 5 часов 26 минут
Все решено! Всем спасибо за идеи.
Вот код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
 
int count=0;
 
void Move_monsters (int maze[][col], int x, int y, int x1, int y1, moving &M)
{
    if (count>1)
        count=0;
    if (count==0)
    {
        M.mas[count]=maze[x1][y1];
        M.cord[count][count]=x1;
        M.cord[count][count+1]=y1;
        count+=1;
    }
    else if (count==1)
    {
        M.mas[count]=maze[x1][y1];
        M.cord[count][count-1]=x1;
        M.cord[count][count]=y1;
        count+=1;
    }
 
    SetConsoleCursorPosition(y1, x1);
    maze[x1][y1]=maze[x][y];
    printf("%c", maze[x1][y1]);
 
    SetConsoleCursorPosition(y, x);
    if (x1==13 && y1==24)
    {
        maze[x][y]=255;
        printf("%c", maze[x][y]);
    }
    else
    {
        if (count-1==1)
        {
            maze[M.cord[0][0]][M.cord[0][1]]=M.mas[0];
            printf("%c", maze[M.cord[0][0]][M.cord[0][1]]);
        }
        else if (count==1)
        {
            maze[M.cord[1][0]][M.cord[1][1]]=M.mas[count];
            printf("%c", maze[M.cord[1][0]][M.cord[1][1]]);
        }
    }
    
}
Yandex
Объявления
16.05.2014, 19:16     Пакман на Си. Не могу реализовать корректное передвижение по массиву
Ответ Создать тему
Опции темы

Текущее время: 23:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru