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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mikhail1990
14 / 14 / 3
Регистрация: 22.03.2014
Сообщений: 197
#1

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

15.05.2014, 23:58. Просмотров 443. Ответов 6
Метки нет (Все метки)

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

НО!!

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

Подскажите алгоритм пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2305 / 1021 / 232
Регистрация: 30.11.2013
Сообщений: 3,396
16.05.2014, 00:39     Пакман на Си. Не могу реализовать корректное передвижение по массиву #2
добрый вечер, сделайте скрин отрисовки того, что получается
Mikhail1990
14 / 14 / 3
Регистрация: 22.03.2014
Сообщений: 197
16.05.2014, 00:46  [ТС]     Пакман на Си. Не могу реализовать корректное передвижение по массиву #3
Добрый! Вот
Кликните здесь для просмотра всего текста

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


На последней картинке видно как точка появилась не на своем месте.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2305 / 1021 / 232
Регистрация: 30.11.2013
Сообщений: 3,396
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
14 / 14 / 3
Регистрация: 22.03.2014
Сообщений: 197
16.05.2014, 11:36  [ТС]     Пакман на Си. Не могу реализовать корректное передвижение по массиву #5
Проверка на столкновение приведения с игроком реализована. Проблема в передвижение приведения по полю. Алгоритм уже додумал.
При передвижении приведения на клетку вперед должна запомнится эта целевая клетка и только после передвижения на вторую клетку мы возвращаем значение первой клетки и запоминаем содержимое следующей третьей при передвижении на третью запомнили четвертую и заполонили вторую (а стоим на третьей). То есть сначала запомнили переставили потом запомнили следующую и только потом заполнили первую потом запомнили третью переставили на третью запомнили четвертую и заполнили вторую. То есть заметаем следы как бы за собой.
Я думал сделать глобальный массив чтоб запоминались координаты ячеек и их содержимое. Может есть какой то другой вариант?

Добавлено через 7 минут
Передвижение монстра происходит в файле find_path.cpp в самом конце. Проблема там.
Кликните здесь для просмотра всего текста
[cut]
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 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++ Пакман на Си. Реализация таймера
C++ Не могу реализовать метод visit() класса List
Не могу разобраться как реализовать функцию инициализации даты по веденному массиву char C++

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

Или воспользуйтесь поиском по форуму:
Mikhail1990
14 / 14 / 3
Регистрация: 22.03.2014
Сообщений: 197
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     Пакман на Си. Не могу реализовать корректное передвижение по массиву
Ответ Создать тему
Опции темы

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