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

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

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

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

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

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

НО!!

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

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

Не могу разобраться как реализовать функцию инициализации даты по веденному массиву char - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

Передвижение по массиву в MASM32 - Assembler
Как менять числа в массиве на следующий в masm32? .486 к примеру в .data мы задали массив array dd 5,4,3,2,1 затем в .code ...

Как реализовать программное передвижение круга? - Java
Как сдвинуть круг ( я новичок, простите. import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import...

Реализовать корректное наложение одного элемента на другой - C#
Добрый день. Возникла проблема с формой, неправильный порядок объектов на ней. Вообщем, есть Label сверху него находится pictureBox....

Реализовать циклическое передвижение строки в компоненте Edit. - Delphi
Всем доброго времени суток. Есть такое задание: Ввести строку в компонент Edit. Реализовать циклическое передвижение строки в...

Лабиринт, не могу придумать передвижение - Delphi
Привет всем. Мне нужно написать игру "лабиринт", ничего так сложного то нету тут... создал лабиринт на основе 2Д массива, заполнил...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
16.05.2014, 00:39 #2
добрый вечер, сделайте скрин отрисовки того, что получается
0
Mikhail1990
17 / 17 / 3
Регистрация: 22.03.2014
Сообщений: 211
16.05.2014, 00:46  [ТС] #3
Добрый! Вот
Кликните здесь для просмотра всего текста

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


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

Добавлено через 7 минут
Передвижение монстра происходит в файле find_path.cpp в самом конце. Проблема там.
Кликните здесь для просмотра всего текста
[cut]
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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;
}
0
Mikhail1990
17 / 17 / 3
Регистрация: 22.03.2014
Сообщений: 211
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]]);
        }
    }
    
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 19:16
Привет! Вот еще темы с ответами:

Реализовать итерацию по массиву объектов - Java SE
Есть 3 класса, минимально описывающих 3 разных объекта (дом, машина, ноутбук). Напишите код, который реализует итерацию по массиву из этих...

Как реализовать замену по всему массиву? - C (СИ)
Подскажите пожалуйста как реализовать замену по всему массиву? Дан массив, который содержит строки, заменяться должны слова в каждой...

Не могу найти среднее по массиву в VB! - Visual Basic
HELP!!!!Помогите написать програмку дла вычисления среднего по массиву в VB.

Не могу присвоить значения массиву - PHP
Доброго вечера, дороги пользователи! Надеюсь на ваше понимание и помощь) В общем, у меня возникла проблема при импорте данных в php-файл,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.05.2014, 19:16
Ответ Создать тему
Опции темы

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