1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
1

Первая игра. Pacman

03.10.2014, 23:38. Показов 15044. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Пишу свою первую игру. Выбор пал на Pacman. В процессе разработки я где-то затупил(предполагаю, что в функции передвижения врагов). И в определенный момент программа зависает. Ошибку не могу найти.
В процессе ходьбы по карте каждый представитель класса в массиве карты записывает в ячейку на которую ступил, символ характерный для его класса(char _mark_map_pos). в определенный момент игра зависает(где-то на 900 - 2000 такте( в низу экрана) ). Помогите разобраться где я затупил, или хотя бы ткните носом в каком направлении копать.

ЗЫ: игра конечно не допилена, и смотрится коряво. Сначала хочется хотя-бы ее сделать, что-бы работала. А потом и привести код в более-менее приличный вид. Проект Visual studio 13.
Вложения
Тип файла: zip Curs 1.0.zip (6.0 Кб, 226 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2014, 23:38
Ответы с готовыми решениями:

игра pacman
Всем добрый день. Задали задание.Написать игру типа пакмэн. цель игры заключается в том чтобы...

Первая игра на C++
Всем доброго времени суток. Решил попробовать написать первую игру (тетрис/змейка), подскажите с...

Моя первая консольная игра :D
Всем доброго времени суток! Сегодня я хочу показать вам свою первую игру, правда пока она работает...

Игра PacMan
В общем такая ситуация. Мне нужно написать игру на Паскале. Он назывется "Лабиринт" и вот условие:...

7
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
03.10.2014, 23:49 2
C++
1
2
for (int i = 0; i < 6; i++){
        r1[i]->~Runner();
не нужно для каждого элемента массива r1 явно вызывать деструктор, нужно же сделать вызов delete для каждого элемента (потому что деструктор вызовется неявно и если не делать delete, то будет утечка памяти)
C++
1
2
for (int i = 0; i < 6; i++){
        delete r1[i];
А вообще, нужно несколько раз подумать перед тем, как явно вызвать деструктор.

Добавлено через 6 минут
Зачем функция GetPos сделана дружественной классу Map? Ее же можно было объявить как функцию-член этого класса, если только это улучшит, а не навредит задуманной логике приложения.
0
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
04.10.2014, 00:25  [ТС] 3
Да, можно. Но, когда писал, почему-то решил ее сделать как отдельную. Сделаю ее методом. Логике не навредит, так как ее предназначение возвращать символ координаты массива, чтобы контролировать столкновения с "барьерами".
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
04.10.2014, 00:34 4
L3xx__, еще было бы неплохо целиком архив с проектом скинуть + в текущем архиве нету MapLoading.h
0
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
04.10.2014, 09:50  [ТС] 5
MapLoading.h и MapLoading.срр не нужны. Я перенес с этих файлов в GameClass.h, GameClass.cpp. И загрузку поля с конструктора перенес в метод void Map::SetMap(); MapLoading.h и MapLoading.cpp я забыл удалить с проекта. Спасибо, что указали на это. В общем он не нужен.
0
GetHelp
04.10.2014, 13:44
  #6

Не по теме:

а что собственно такое Pacman? я лично не знаю такую...

0
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
04.10.2014, 14:03  [ТС] 7
https://ru.wikipedia.org/wiki/Pac-Man
0
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
08.10.2014, 22:31  [ТС] 8
Я исправил баг, с зависанием программы(заключался в том, что когда призрак блокировался, он начинал искать свободный путь и начинал вечный цикл.)
Но почему, призраки двигаются рывками? Хотя в методе я записал запоминание последнего направления и избегание его при выборе нового. Вот код метода:
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
void Runner::Move(int t, Map & m){
    if (clock() % t)// accept move by tick
        return;
    
    HANDLE handle;
    //COORD posit;
    COORD cNext;// next position
    handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetTextColorWhite();
    
    srand(clock());
 
    static int direction ;
    int temp_dir;
    static bool freemove = true;
    static bool first_use = true;
    
    if (first_use){
        direction = 1 + rand() % (5 - 1);
        first_use = false;
    }
    do{
        if (!freemove){//if unite blocked, cycle don't work
            if (m._map[_pos.Y + 1][_pos.X] != ' ' && m._map[_pos.Y - 1][_pos.X] != ' ' && m._map[_pos.Y][_pos.X + 1] != ' ' && m._map[_pos.Y][_pos.X - 1] != ' ')
                return;
 
            temp_dir = direction;
            do{
                direction = 1 + rand() % (5 - 1);
            } while (temp_dir == direction);
            freemove = true;
        }
        switch (direction){
        case UP_DIR: SetConsoleCursorPosition(handle, _pos);
            if (m.GetPos(_pos.Y - 1, _pos.X) != ' '){
                freemove = false;
                break;
            }
            m._map[_pos.Y][_pos.X] = ' ';
            std::cout << ' ';
            --_pos.Y;
            if (_pos.Y < 0){
                _pos.Y++;
            }
            SetConsoleCursorPosition(handle, _pos);
            std::cout << static_cast<char>(_body);
            m._map[_pos.Y][_pos.X] = _mark_map_pos;
 
            break;
        case RIGHT_DIR: SetConsoleCursorPosition(handle, _pos);
            if (m.GetPos(_pos.Y, _pos.X + 1) != ' '){
                freemove = false;
                break;
            }
            m._map[_pos.Y][_pos.X] = ' ';
            std::cout << ' ';
            ++_pos.X;
            if (_pos.X > m._width - 2){
                _pos.X--;
            }
            SetConsoleCursorPosition(handle, _pos);
            std::cout << static_cast<char>(_body);
            m._map[_pos.Y][_pos.X] = _mark_map_pos;
 
            break;
        case DOWN_DIR: SetConsoleCursorPosition(handle, _pos);
            if (m.GetPos(_pos.Y + 1, _pos.X) != ' '){
                freemove = false;
                break;
            }
            m._map[_pos.Y][_pos.X] = ' ';
            std::cout << ' ';
            ++_pos.Y;
            if (_pos.Y > m._heigth - 2){
                _pos.Y--;
            }
            SetConsoleCursorPosition(handle, _pos);
            std::cout << static_cast<char>(_body);
            m._map[_pos.Y][_pos.X] = _mark_map_pos;
            break;
        case LEFT_DIR:  SetConsoleCursorPosition(handle, _pos);
            if (m.GetPos(_pos.Y, _pos.X - 1) != ' '){
                freemove = false;
                break;
            }
            m._map[_pos.Y][_pos.X] = ' ';
            std::cout << ' ';
            --_pos.X;
            if (_pos.X < 0){
                _pos.X++;
            }
            SetConsoleCursorPosition(handle, _pos);
            std::cout << static_cast<char>(_body);
            m._map[_pos.Y][_pos.X] = _mark_map_pos;
            break;
            /*default:
                continue;*/
        }
    } while (!freemove);
}
ниже прикрепляю весь проект. Если кто-то подскажет, что я сделал не так или даст пару дельных советов, то я заранее благодарю. Или просто было интересно и просмотрели, то тоже благодарность за внимание ^_^.
Вложения
Тип файла: 7z Curs 1.0.7z (8.12 Мб, 298 просмотров)
1
08.10.2014, 22:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2014, 22:31
Помогаю со студенческими работами здесь

Игра PacMan на Android
я делаю игру пэкмэн под андроид,это моя курсовая.. запоролся полностью с построением самой игры...

Движение мобов в лабиринте (Игра наподобие PacMan'a)
В общем есть игруля моя и противники, сталкиваясь друг с другом или со стеной, меняют направление...

Ошибка при попытке совместить программы (игра Pacman)
Не получается совместить две программы первая и вторая по отдельности работают отлично если...

Первая игра
Делаю 2D игру. На сцене несколько персонажей, нужно выбрать персонажа мышкой и отправить его к...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru