|
2 / 2 / 1
Регистрация: 31.10.2008
Сообщений: 54
|
||||||
Консольный морской бой. Stack overflow17.05.2014, 19:45. Показов 2150. Ответов 10
Метки нет (Все метки)
Вечер добрый! Очень надеюсь на помощь.
Мучаюсь уже который день, уйму часов потратил, а результата нет. Пытаюсь написать консольный морской бой. Завис на функции ИИ. А именно, чтобы компьютер добивал корабли, по которым он попал (рандомно). Программу прокомментил, переопределил ключи через дефайны, чтобы не путаться. Метод set(), единственно, может показать сложным для понимания. Часть кода в мэйн, отведенную ходу игрока, закомментил.
В 33% случаев программа зависает. Обычно это происходит потому, что происходит попадание по кораблю, но вместо того, чтобы добить, опять ищется радномноя точка (!), и при повторном попадании по этому кораблю, программа все-таки уже пытается добить, но добивает, из-за описанного ранее, – в середине. (По алгоритму такое невозможно, добивающий выстрел всегда будет "сбоку" корабля.) И все. Отладчик Visual 2013 говорит вот что: -> does_he_shot_me() Необработанное исключение по адресу 0x00205D29 в ConsoleApplication1_BattleShip.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x003B2F58). Выглядит так, что второй параметр в функцию передается какой-то абсолютно левый, хотя в другом окошке Вижуала показано, что параметры нормальные, от 0 до 9. если нажать "Продолжить": ->funcAI() Необработанное исключение по адресу 0x00205D29 в ConsoleApplication1_BattleShip.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x003B0FA0. Помимо этого, почему-то на 100 итерации цикла в мэйн иногда остаются точки, в которые не производись выстрелы (если увеличить число итераций, то все точки добьются). А один раз цикл остановился на 99 итерации. Пробовал убирать рекурсивные вызовы функции (заместо этого лишнюю итерации проводил), вместо статических переменных использовал указатели, но результат не менялся. По идее (не факт, по-моему), это стек переполняется. Но каким боком это выходит при такой простой программе?
0
|
||||||
| 17.05.2014, 19:45 | |
|
Ответы с готовыми решениями:
10
Консольный морской бой Консольный морской бой |
|
Модератор
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
|
|
| 17.05.2014, 19:52 | |
|
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 17.05.2014, 19:55 | |
|
вы пробовали по стеку вызовов подняться вверх и дойти до вашего кода и посмотреть, где именно происходит фейл и при каких значениях переменных?
0
|
|
|
2 / 2 / 1
Регистрация: 31.10.2008
Сообщений: 54
|
||||||||
| 17.05.2014, 20:15 [ТС] | ||||||||
|
Даже если сделать дополнительно проверку в начале, то ничего не меняется.
Значения, как писал вышел, в нормальные, на скрине видно: Увеличив размер стека в несколько раз в свойствах проекта, тоже не помогло.
0
|
||||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 17.05.2014, 20:19 | |
|
небольшой ликбез по дебагу. нажимаете на кнопку продолжить из картинки.
студия остановится в непонятном месте. идете на вкладочку стек вызовов. на картинке эта вкладочка есть в окошке "Вывод" (внизу, самая первая). вот там каждая строка - это вызов какой-то функции. потыкайте по этим строкам. студия будет перекидывать вас на исходники и желтой стрелкой показывать откуда был сделан этот вызов. наводя курсор мыши на переменные, можно видеть их значения.
0
|
|
|
2 / 2 / 1
Регистрация: 31.10.2008
Сообщений: 54
|
|
| 17.05.2014, 20:43 [ТС] | |
|
DU, окошко Вывод просто с обычным текстом, никаких гиперссылок.
Да функции стрелочкой указываются и при самом появлении ошибки (или предупреждение), как и параметры переданные в функцию, но, однако, в другом окошке параметры отображаются нормальные. Суть сказанного нарисовал на картинке: Я даже не представляю, как там в функцию может такое число передаться. Я даже ставил условие с паузой перед вызовом этой функции, если координаты выйдут из 0–9, но это условие никогда не выполнялось.
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 17.05.2014, 20:46 | |
|
на последней картинке смотрите вниз окошка, где у вас зеленым все обведено. там есть вкладки
стек вызовов, точки останова и прочие. вам нужен стек вызовов.
1
|
|
|
2 / 2 / 1
Регистрация: 31.10.2008
Сообщений: 54
|
|
| 17.05.2014, 21:25 [ТС] | |
|
DU, вот так действительно, стек переполняется из-за очень огромного количества вызовов рекурсивной функции.
Если поменять рекурсию на цикл, то он также бесконечный (ошибки не будет, но не многим лучше). Эх, видимо, в алгоритме самого ИИ ошибка. Хотя я был в нем довольно-таки уверен. .... Хотя, я, кажется, нашел уязвимое место. Надеюсь, добавление здесь условий проверки выхода координат за границы 0–9 спасет ситуацию.
0
|
|
|
2 / 2 / 1
Регистрация: 31.10.2008
Сообщений: 54
|
|||||||||||
| 18.05.2014, 23:40 [ТС] | |||||||||||
|
Наконец-то! Можно заняться другими функциями.
Поставив проверку на выход из 0–9 в функцию killorhit():
Только что закончил, т.е. код не оптимизировал, в плане объема (есть однотипные куски кода и ненужные паузы с выводами сообщений). Выложил здесь, может кому пригодится.
0
|
|||||||||||
| 19.05.2014, 01:29 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 4
|
|
| 11.12.2015, 23:29 | |
|
А полный код программы, вы случайно, не можете выставить?
0
|
|
| 11.12.2015, 23:29 | |
|
Помогаю со студенческими работами здесь
11
Консольный морской бой Консольный морской бой. Расстановка кораблей Консольный морской бой, реализация циклами Написать консольный морской бой с использованием ООП
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|