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

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

Войти
Регистрация
Восстановить пароль
 
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
#1

Составить алгоритм обхода игрового поля - C++

29.07.2014, 13:53. Просмотров 596. Ответов 11
Метки нет (Все метки)

Вобщем, такая тема:

Дан двумерный массив чисел 12х12, который содержит числа от 0 до 5.
0 - дырка
1 - мое местоположение( при запуске приложения )
2 - черный ящик( -здоровье )
3 - красный ящик( +здоровье )
4 - зеленый ящик( +защита )
5 - положение противника( противник, как и сам игрок, один ).

Проблема в следующем: как реализовать алгоритм поиска нужного количества определенный ящиков для того, чтобы победить противника?
Схема работы приложения следующая:
* массив задается в массиве интов
* количество здоровья противника и игрока задаются тоже в виде переменных.
* после сбора всех ящиков игрок должен вернуться к противнику( просто прийти на точку 5 ) и начать битву( алгоритм битвы уже реализован ).

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

заранее благодарен.

Добавлено через 2 минуты
забыл дописать, что в массиве исходных чисел еще есть числа 7 - нормальная "земля", по которой ходит игрок..
противник стоит на месте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2014, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составить алгоритм обхода игрового поля (C++):

алгоритм обхода поля кубиком - C++
народ - никому не попадалась задачка такого вида: есть поле n*n - начало в координате 0*0(верхний левый угол). есть кубик с 1 красной...

Алгоритм обхода лабиринта - C++
Помогите реализовать алгоритм обхода лабиринта, на примере матрицы nxn, где 1 (единицы) это проходимые элементы, а 0 (нули) это...

Необходимо написать программу обхода конем всего шахматного поля - C++
Доброго времени суток! Необходимо написать программу обхода конем всего шахматного поля. Конь должен посещать каждую клетку только...

Жадный алгоритм для определения последовательности обхода городов. - C++
Здравствуйте! Изучаю разные транспортные алгоритмы и возник следующий вопрос. На основе данных, полученных из txt-файла формирую...

Автоматическое построение игрового поля - C++
есть такой код: #include <iostream> #include <conio.h> int main(){ //переменные int move = 1; char f ={}; unsigned...

Разработать алгоритм и написать программу прошивания дерева при симметричном порядке обхода его - C++
Народ интересует такое задание нужно срочно или что по быстрому почитать, чтоб сделать это.

11
XRoy
853 / 703 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
29.07.2014, 15:52 #2
alexmay,
Примите за вес "дырки" и черного ящика бесконечность, красного и зеленого ящика -1, и ищите кратчайший путь.
1
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 16:12  [ТС] #3
Это понятно, но все не так просто, как кажется.
Расположение игрока и противника может быть совсем рядом и, если я буду просто искать кратчайший путь, то не наберу нужного количества здоровъя и защиты, чтобы победить в схватке..
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
29.07.2014, 16:24 #4
alexmay, перебирайте пути по кратчайтости пока не наберете нужного количества ящиков.
1
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 16:42  [ТС] #5
SatanaXIII,
так а как начать идти?
ведь есть ящики, которые, мягко говоря, не желательны( -здоровъе )..
и если я буду таким образом перебирать,то попаду в точку сражения все равно без необходимых ящиков и проиграю.
0
XRoy
853 / 703 / 217
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
29.07.2014, 16:53 #6
alexmay,
пометьте ящики с -здоровье, бесконечностью, или лучше кол-во здоровья которое отбирают +1,так вы на них попадете в крайнем случае
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
29.07.2014, 16:56 #7
кто понял задачу, скажите, сколько должно быть здоровья и защиты в конце? можно ли ходить 2 раза по одной клетке?
0
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 17:32  [ТС] #8
например, в игрока 1% зд
в противника 100%.
При попадании на ящик со здоровьем - +10% к текущему

Ходить по одной клетке можно много раз
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
29.07.2014, 17:37 #9
цель прйити в клетку с противником с наибольшим количеством здоровья?
0
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 18:35  [ТС] #10
SlavaSSU,
не обязательно с наибольшим. просто с бОльшим, нежели в противника.
но тут еще есть один минус: защита тоже необходима, т.к наносимый урон после каждого удара противника в разы больше от начального значения защиты игрока. о защите тоже не стоит забывать.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
30.07.2014, 08:46 #11
Цитата Сообщение от alexmay Посмотреть сообщение
защита тоже необходима, т.к наносимый урон после каждого удара противника в разы больше от начального значения защиты игрока. о защите тоже не стоит забывать.
Как можно четче попробуйте расписать сколько чего вообще необходимо, что от этого изменится, что с чем как взаимодействует и на чем отражается. А-то откуда мы знаем все вот эти тонкости? Табличку составьте.

Что до алгоритма:
1) Найдите кратчайший путь
2) Поглядите хватает ли вам ящиков даже при условии, что будут собраны и негативные, находящиеся на этом пути
3) Если не хватает, то берите следующий по длине путь и переходите к пункту 2.

Но это в лоб.
Волновой алгоритм тут вообще мало пригоден. Вам нужно что-то гораздо умнее. Какой-то рекурсивный волновой (только что придумал термин), который будет мало того находить кратчайший путь, так еще и от каждого шага пути искать ответвления наименьшей длины, но приносящие наибольшее количество плюшек.
К примеру, если можно пройти по прямой до противника, собрав при этом пять полезных ящиков, но отвернув в середине пути под девяносто градусов в бок, пройти пару шагов и собрать шестой, затем вернуться в точку схода с пути и продолжить его будет ли это оптимальнее? Можно ли жертвовать ходами в угоду количества собранных ящиков?
Тут куча тонкостей, которые вы объяснять застрелитесь.
0
alexmay
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 16:36  [ТС] #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Как можно четче попробуйте расписать сколько чего вообще необходимо, что от этого изменится, что с чем как взаимодействует и на чем отражается. А-то откуда мы знаем все вот эти тонкости? Табличку составьте.
Что до алгоритма:
1) Найдите кратчайший путь
2) Поглядите хватает ли вам ящиков даже при условии, что будут собраны и негативные, находящиеся на этом пути
3) Если не хватает, то берите следующий по длине путь и переходите к пункту 2.
Но это в лоб.
Волновой алгоритм тут вообще мало пригоден. Вам нужно что-то гораздо умнее. Какой-то рекурсивный волновой (только что придумал термин), который будет мало того находить кратчайший путь, так еще и от каждого шага пути искать ответвления наименьшей длины, но приносящие наибольшее количество плюшек.
К примеру, если можно пройти по прямой до противника, собрав при этом пять полезных ящиков, но отвернув в середине пути под девяносто градусов в бок, пройти пару шагов и собрать шестой, затем вернуться в точку схода с пути и продолжить его будет ли это оптимальнее? Можно ли жертвовать ходами в угоду количества собранных ящиков?
Тут куча тонкостей, которые вы объяснять застрелитесь.

ок.

когда игрок приходит в клетку с противником, в фоновом режиме начинается "бой", после которого просто в консоль выводится сообщение кто выиграл.
расчет исхода производится по неким формулам, которые выполняются после каждого ударара...
Урон(игрок) = здоровье( противник ) - защита( противник ) * коэфф.
Урон(противник ) = здоровье( игрок) - защита( игрок) * коэфф.

это происходит в самом конце. после того, как игрок пройдет по всем нужным банкам, после чего сможет убить противника. чтобы взять ящик, нужно просто прийти в нужную точку. влгоритм повышения здоровья и защити реализован. главная задача туда дойти "не руками", а придумать алгоритм.


жертвовать ходами можно.. но это не значит, что нужно тупо пройтись по всем точкам вдоль и поперек.. нужен наиболее оптмальный алгоритм при различных входных условиях.
да, я думаю можно жертвовать ходами, чтобы добрать недостающие ящики. в противному случае игры смысла не будет - игрок проиграет.

пример входных данных может быть самым разнообразным ( при этом учтено, что количество нужных ящиков для победы всегда более,чем достаточно ).

Добавлено через 5 минут
ходить дальше после того как вы пришли в клетку в противником, уже нельзя. будете драться с тем количеством здоровъя и защиты, с которым пришли. так что все обойти необходимо до прихода к противнику( если будет стоять на самом начале игры, его нужно обойти, чтобы добрать нужные ящики..
0
30.07.2014, 16:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 16:36
Привет! Вот еще темы с ответами:

Алгоритм обхода диагонали параллельной главной диагонали матрицы - C++
Как обработать каждый элемент матрицы, находящийся на диагонали параллельной главной диагонали? Понимаю, что надо ввести какую-то...

Пройти по любому разрешенному пути игрового поля от верхнего левого угла до правого нижнего - C++
Всем привет! Решаю вот такую простую задачку: Ссылка на нее: Задача Вот мой код:

Алгоритм обхода в игре "точки" - C++
пишу игру "точки" на с++ в VS form, по клику заполняю два вектора с точками, vector<MyPoint> One; vector<MyPoint> Two; мне нужно найти...

Алгоритм рандомизации поля - C++
Вот я нашел алгоритм, но тупо вставлять в проект я его не хочу, если вам не составит труда помогите понять алгоритм рандомизации. Задача о...


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

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

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