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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Алгоритмы и структуры данных, графы http://www.cyberforum.ru/cpp-beginners/thread1177497.html
Определить, является ли связанным граф. Задана система односторонних дорог. Найти путь, соединяющий города А и В и не проходящий через заданное множество городов. Помогите решить пожалуйста,...
C++ Прокомментировать Можно прокомментировать не большую программу? #include <fcntl.h> #include <io.h> #include <stdlib.h> int main() { int fd = _open("\\\\.\\F:", O_WRONLY); if (fd < 0) { http://www.cyberforum.ru/cpp-beginners/thread1177496.html
Компьютер при исчислениях ненадолго виснет и иногда выбивает число nan C++
Доброго времени суток! Помогите, пожалуйста, оптимизировать код. Дело в том, что компьютер при исчислениях ненадолго виснет и иногда выбивает число nan. Сама функция: float mySin(double xrad) { ...
Запись файла в string C++
Здравствуйте. Помогите пожалуйста с решением вопроса. Мне нужно чтобы все содержимое файла (пробелы, табуляция, символы) записались в переменную класса string. Конструкция while(in) { ...
C++ Создать скрипт http://www.cyberforum.ru/cpp-beginners/thread1177461.html
В линуксе нужно сделать следующие задание, кто шарит хелп!!! Разработать скрипт, отыскивающий в текущем каталоге файл с заданным именем. Имя искомого файла вводится в командной строке.
C++ Разработать имитацию функции parse Функция parse(s,t) - разделение строки s на две части, до символа t и после него. Прошу помощи в написании такой программы. Нужно сделать именно имитацию работы этой функции, без использования... подробнее

Показать сообщение отдельно
Mikhail1990
17 / 17 / 3
Регистрация: 22.03.2014
Сообщений: 218
16.05.2014, 19:16  [ТС]
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru