Тем, кто шарит в С++
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Господа профессионалы С++ и любители разминок для мозгов. Позвольте представить вам проблему поинтереснее вывода кириллицы на экран и самозакрывающейся командной строки. Подозреваю и надеюсь, вам она покажется не сложнее! :-)
Составил программу, не могу найти причину её не стабильной работы.
Описание программы: Хищник (‘V’) бегает по полю, поедая рандомно появляющуюся добычу (‘P’), выбирая ближайшую (‘A’). Координаты хищника и добычи записаны попарно в вектор – чётный элемент – х-координата, нечётный – у-координата. Программа выбирает ближайшую цель, и записывает в её координаты в векторе максимальные значения (длина и ширина поля * 2) для исключения их из следующего поиска.
При уничтожении хищником добычи, рандомно появляются от ноля до двух новых. Их координаты записываются в вектор в первую очередь в максимальные значения, если их нет – то пуш.бэкаются в конец вектора.
Максимально возможное количество добычи – 9 штук, плюс сам хищник. Итого, 10 пар координат – 20 элементов в векторе максимум.
Но время от времени столь же рандомно запись максимальных значений в вектор не происходит и новые координаты начинают писаться сверх лимита.
Косяк может вылезти в первый же момент игры, а может не проявлять себя минуты 2-3.
Косяк прячется в районе функции compare_coor() в первом цикле. Если первый цикл совсем убрать, всё работает идеально. Если же в его условии вместо переменной count, хранящей размер вектора прописать функцию vector.size() получаем Stack overflow при первом же проявлении косяка.
Второе подозрительное место — функция replace(), задача которой записать максимальные значения в координаты выбранной цели. Потому что, когда программа начинает пуш.бэкать лишние элементы в вектор, максимальных значений в векторе нет, независимо от его размера.
Внешне, косяк проявляет себя в появлении лишней добыче на экране, невидимой для хищника и накоплении элементов в векторе.
Циклической рекурсии в программе нет.
Может, у кого появится желание разобраться в моей писанине и подскажет в чём дело!?
Фото: На экране 11 единиц добычи, вместо 9. Целью выбрана не ближайшая. Координаты ближайшей в выборе не участвуют, хотя по идее в векторе они есть!
// main.cpp
// map.h
// map.cpp
// game.h
// game.cpp
// coordinates.h
// coordinates.cpp
Вариант исправления:
ИМХО, лучше вообще сделать без рекурсии. Например так:
У меня остался только один вопрос.
где обещанная проблема, которая интереснее вывода кириллицы?
Спасибо большое! Всё работает.
Вот поди догадайся. Функция никаких других функций не вызывает. Рекурснулась бы разок, другие координаты подобрала и благополучно завершилась бы. Но нет!
Зато вызывает сама себя.