|
Программирование для PSP Вы программист? Welcome сюда... |
03.10.2006, 16:12
|
Сообщение: #1 (212288)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Кротчайший путь для поиска кораблей и тотальное уничтожение
Сегодня узнал о том, что pspowner программирует "Морской бой" как сингл, тоесть для одного игрока, а в роли другого учавствует AI (тоесть искусственный интелект ЗЫЗы )
Желаем удачи pspowner'у !
И вот какую тему хотелось бы затронуть: "Кротчайший путь для поиска кораблей и тотальное уничтожение"
У нас имеется матрица 10х10 (ну это для примера). В неизвестных, для нас и AI, точках находятся корабли 1-4 палуб. Мы знаем, что корабли не могут соприкосаться друг с другом, минимальный интервал между бортами двух кораблей - одна клетка.
Какой механизм поиска верного пути вы бы предложили попадая с первого выстрела во вражеский корабль (если он не однопалубный) ?
добавлено через 41 минуту
Я бы предложил следующее:
Оганизуем структуру:
typedef struct _war_ {
int x; // координаты точки поражения
int y;
int direction; //направление удара
int count; //подсчитаем кол-во палуб
} sea_war;
sea_war target;
После этого начинаем палить. Для начала мы палим по рандомной точке:
target.x = 10;
target.y = 10;
target.direction = 0;
target.count = 0;
Если target.direction нулевой, то продолжаем определять другую координату для стрельбы (это может быть простым рандомом)
И вот, при очередной стрельбе мы попадаем. Если корабль 1 балуба. убили его. Если не убит то нацеливаемся дальше.
Нацелить можно по следующей схеме:
if (target.direction == 1 ) target.next.x++;
if (target.direction == 2 ) target.next.x--;
if (target.direction == 3 ) target.next.y++;
if (target.direction == 4 ) target.next.y--;
target.direction достаточно инкреиментировать или декрементировать, чтобы выбрать другой путь при ошибочном направлении от предыдущего выстрела.
Если на пути target.direction встречается промах, а target.count > 2, то нам достаточно инвентировать target.direction и откатить координату на target.count, что бы продолжить в другом направлении от начальной точки выстрела.
Вот вобщем-то и всё!
Последний раз редактировалось mushue; 03.10.2006 в 16:12.
Причина: добавил подумав
|
|
|
03.10.2006, 20:17
|
Сообщение: #2 (212520)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Я сегодня утром успел только, пока не припахали, написать начало графики. Даже полной расстановки кораблей пока нет. И нужно избавиться от мелких багов и упорядочить текст, а то каша пока
добавлено через 52 минуты
Да, вот чё хотел спросить: ReadBufferPositive - у меня гадина отрабатывает по 5 раз на нажатие(ну в цикле когда), приходится лепить холостые циклы. Обнуление Buttons ничего не даёт. SamplingCycle(1) - я так понимаю что-то вроде typematic rate - помогает на 1.5, а как делать на 2.71-2.80? Онаж там не размечена...
Fur die freiheit zu kampfen um jeden preis
Последний раз редактировалось pspowner; 03.10.2006 в 20:27.
Причина: добавил подумав
|
|
|
04.10.2006, 09:17
|
Сообщение: #3 (212847)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
В своем СДК я определил SamplingCycle, но его работоспособность не проверял.
В своих программах я использовал простейший путь решения проблемы:
int i;
while(1){
if ((i % 10) == 0) {
//тут обрабатываем кнопки
}
i++;
}
Смысл именно модульности. Тоесть i по модулю 10. Клава обрабатывается каждый 10 тиков.
|
|
|
Этот пользователь сказал Спасибо mushue за это полезное сообщение:
|
|
04.10.2006, 10:34
|
Сообщение: #4 (212883)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Сейчас уже разобрался со случайными числами, почти...
Во первых, имперически выяснил, что int rand(), не возвращает отрицательных значений. Соответственно, возможный диапазон 0-32767.
Собственно, случайное расположение кораблей ЦПУ я делаю примерно так:
int Randomize9() {
int r=rand();
if (r>0 && r<=3500) r=1;
if (r>3500 && r<=7000) r=2;
if (r>7000 && r<=10500) r=3;
if (r>10500 && r<=14000) r=4;
if (r>14000 && r<=17500) r=5;
if (r>17500 && r<=21000) r=6;
if (r>21000 && r<=24500) r=7;
if (r>24500 && r<=28000) r=8;
if (r>28000 && r<=31500) r=9;
if (r>31500) r=0;
return r;
}
int ThrowCoin() {
int r=rand();
if (r>16383) return 1; else return 0;
}
void DefineCPUShips() {
int cntx, cnty;
int px,py, cnt;
int isOK=0;
int deck=4, Left=1;
int direction=0;
while (!isOK) {
px=Randomize9();
py=Randomize9();
direction=ThrowCoin();
if (!direction && px<=6 || direction && py<=6) isOK=1;
}
for (cnt=0; cnt<3; cnt++) if (!direction) fieldCPU[px+cnt][py]=1;
else fieldCPU[px][py+cnt]=1;
RepaintGrid(CPU);
}
Fur die freiheit zu kampfen um jeden preis
|
|
|
04.10.2006, 10:47
|
Сообщение: #5 (212890)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Если ты не будешь инициализировать генератор случайного числа то по дефолту srand(1), это значит, что твои корабли все время буду выстраиваться в одну и туже позицию. =)
Что бы этого избежать иницализируй генератор вот таким образом: srand(time(0))
Для низиализации r используй простую вещь как return (rand() % 9)
В ThrowCoin() тоже самое return (rand() % 1)
|
|
|
04.10.2006, 10:53
|
Сообщение: #6 (212892)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Сообщение от mushue
Если ты не будешь инициализировать генератор случайного числа то по дефолту srand(1), это значит, что твои корабли все время буду выстраиваться в одну и туже позицию. =)
|
Как ни странно, этого не происходит. При повторном запуске, караблик уже в другом месте Кроме того, srand() опять таки не присутсвует в tiffsdk.
Сообщение от mushue
Для низиализации r используй простую вещь как return (rand() % 9)
В ThrowCoin() тоже самое return (rand() % 1)
|
Мда, так проще. Спасиб
Fur die freiheit zu kampfen um jeden preis
|
|
|
04.10.2006, 12:25
|
Сообщение: #7 (212896)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Насчет rand() конечно мне не понятно, ведь поидеи нужно сначало инициализировать генератор, возможно это уже реализовано автоматически.
добавлено через 1 час 7 минут
void DefineCPUShips() { Как я понимаю, то это функция расставляет кораблики
int cntx, cnty;
int px,py, cnt;
int isOK=0;
int deck=4, Left=1;
int direction=0;
while (!isOK) {
px=Randomize9();
py=Randomize9();
direction=ThrowCoin(); <-- тут получаем направление
if (!direction && px<=6 || direction && py<=6) isOK=1; <-- Это вообще сомнительно всё. А если этому условию не будет соответствовать примерно n-ое кол-во раз? Как я понял ты старался сделать условия так, чтобы при генерации корабля, он не выпал за рамки самого поля.
}
for (cnt=0; cnt<3; cnt++) <-- Ясное дело заполняем поле, но почему 3-х палубным корабликом?
if (!direction) fieldCPU[px+cnt][py]=1;
else fieldCPU[px][py+cnt]=1;
RepaintGrid(CPU);
}
Я бы сделал это при помощи рекурсивной функции.
Последний раз редактировалось mushue; 04.10.2006 в 12:25.
Причина: добавил подумав
|
|
|
04.10.2006, 12:37
|
Сообщение: #8 (212919)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
void DefineCPUShips() { Как я понимаю, то это функция расставляет кораблики
Это прототип, уже выглядит подругому.
if (!direction && px<=6 || direction && py<=6) isOK=1; <-- Это вообще сомнительно всё. А если этому условию не будет соответствовать примерно n-ое кол-во раз? Как я понял ты старался сделать условия так, чтобы при генерации корабля, он не выпал за рамки самого поля.
А пофиг сколько не соответствует, будет кидать случайные числа пока не попадёт куда надо. Добавил ещё ИФов - , конечно, выглядит зловеще.
<-- Ясное дело заполняем поле, но почему 3-х палубным корабликом?
Ну что ты цепляешься к пустякам там >= для 4 палубного. Этож не дописано ещё
Я бы сделал это при помощи рекурсивной функции.
|
Э?
Fur die freiheit zu kampfen um jeden preis
|
|
|
04.10.2006, 12:44
|
Сообщение: #9 (212922)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Прости что так критично.. больше небуду =)
Да, рекурсия простой способ получить нужный результат. Ну например:
int SetOneShip(int x, int y) {
if (fieldCPU[x][y] > 0 ) return SetOneShip(Randomize9(),Randomize9());
fieldCPU[x][y] = 1;
return 0;
}
Данная функция пытается поставить однопалубный кораблик в то место где еще не занято и будет это делать до тех пор пока не поставит =)
Для многопалубных рекурсия немного сложнее.
|
|
|
04.10.2006, 12:50
|
Сообщение: #10 (212927)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Да ничё, я ж не профи. Меня критиковать можно...
Спасиб, но я уже так расставил по своему.
Когда закончу, пришлю те исходник. Для критики
Fur die freiheit zu kampfen um jeden preis
|
|
|
04.10.2006, 12:52
|
Сообщение: #11 (212929)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Сообщение от pspowner
Да ничё, я ж не профи. Меня критиковать можно...
Спасиб, но я уже так расставил по своему.
Когда закончу, пришлю те исходник. Для критики
|
Я стараюсь всегда оптимизировать, незнаю.. иногда это бывает лишним, но моя натура такая =)
Исходник конечно ждём =) Ох, я в предвкушении критики =)))))
|
|
|
04.10.2006, 13:37
|
Сообщение: #12 (212949)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Ню вот, с расстановкой кораблей я вроде закончил
(слева - расставил я в запущенной программе. справа - ЗЫЗа, САМА!)
По крайней мере 2 раза подряд никаких багов в расстановке нет.
Теперича переходим к самому интересному - стрельбе
Fur die freiheit zu kampfen um jeden preis
|
|
|
Эти 2 пользователя(ей) сказали Спасибо pspowner за это полезное сообщение:
|
|
04.10.2006, 13:47
|
Сообщение: #13 (212954)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Сообщение от pspowner
Ню вот, с расстановкой кораблей я вроде закончил
(слева - расставил я в запущенной программе. справа - ЗЫЗа, САМА!)
По крайней мере 2 раза подряд никаких багов в расстановке нет.
Теперича переходим к самому интересному - стрельбе
|
Зергуд. Выглядит неплохо =)
|
|
|
04.10.2006, 16:31
|
Сообщение: #14 (213092)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Ну вот, собственно. Ранняя бета (не релиз, просто для показа). Не распространяйте на форуме - пока не дописано.
Ограничения:
- Пользователь сам отвечает за корректную расстановку своих кораблей.
- Логика стрельбы ПСП пока не написана(т.е. никаких добиваний).
Палит наугад.
- Убитые/раненые не обозначаются.
- Могут быть баги...
Управление:
Стрелки - (движение кораблей при расстановке, движение целеуказателя)
R - Поворот корабля при расстановке
Крест - Выстрел.
Start - выход
Select - Чит. Показывает корабли врага.
2.71 - Работает, 2.80 - Должна
Fur die freiheit zu kampfen um jeden preis
Последний раз редактировалось pspowner; 04.10.2006 в 16:40.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо pspowner за это полезное сообщение:
|
|
04.10.2006, 16:33
|
Сообщение: #15 (213093)
|
Регистрация: 12.01.2006
Возраст: 43
Сообщений: 3,858
Вы сказали Спасибо: 1,035
Поблагодарили 2,671 раз(а) в 1,047 сообщениях
Сила репутации: 10Репутация: 741 
(луч света в тёмном царстве)
|
оффтоп - о, смотрю и вложениями начали пользоваться
|
|
|
04.10.2006, 16:34
|
Сообщение: #16 (213096)
|
Регистрация: 12.01.2006
Возраст: 43
Сообщений: 3,858
Вы сказали Спасибо: 1,035
Поблагодарили 2,671 раз(а) в 1,047 сообщениях
Сила репутации: 10Репутация: 741 
(луч света в тёмном царстве)
|
а зачем ты все время лоадбинари в корень ФОТО бросаешь? сделай для удобства как мишуе
|
|
|
04.10.2006, 16:38
|
Сообщение: #17 (213099)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Ну а как? Могу запихнуть в туже папку что и seafight... Сейчас сделать?
Да, сегодня уже врятли буду доделывать - устал
Fur die freiheit zu kampfen um jeden preis
|
|
|
04.10.2006, 16:40
|
Сообщение: #18 (213101)
|
Регистрация: 12.01.2006
Возраст: 43
Сообщений: 3,858
Вы сказали Спасибо: 1,035
Поблагодарили 2,671 раз(а) в 1,047 сообщениях
Сила репутации: 10Репутация: 741 
(луч света в тёмном царстве)
|
запихни или если это можно и мне сделать то лучше я сам, по дороге домой потестю
|
|
|
04.10.2006, 16:47
|
Сообщение: #19 (213117)
|
Прошивка: 3.02 ОE-B
Регистрация: 17.08.2006
Сообщений: 171
Вы сказали Спасибо: 17
Поблагодарили 132 раз(а) в 38 сообщениях
Сила репутации: 1Репутация: 4 
(с надеждой на лучшее)
|
Браво!!! Работает прекрасно. Багов пока не увидел, есть только недоделки =)
|
|
|
Этот пользователь сказал Спасибо mushue за это полезное сообщение:
|
|
04.10.2006, 16:48
|
Сообщение: #20 (213119)
|
Прошивка: Slim&Light 3.90 M33
Другие консоли: SONY PLAYSTATION THREE & Nintendo Wii
Регистрация: 10.03.2006
Адрес: Москва
Сообщений: 2,407
Вы сказали Спасибо: 810
Поблагодарили 2,294 раз(а) в 756 сообщениях
Сила репутации: 1Репутация: 1508 
(обеспечено прекрасное будущее)
|
Что-то я не понял... Запихиваю в туже папку - виснет. Mushue, как это правильно делать не подскажешь?
Я имею в виду как лучше по папкам пихать.
2вАСТ: Если сам будешь править, название проги находится в loadbinary.tiff по смещению 0DBA (если понадобится)
Fur die freiheit zu kampfen um jeden preis
Последний раз редактировалось pspowner; 04.10.2006 в 16:56.
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 22:48. Часовой пояс GMT +3.
Powered by vBulletin® Version 3.8.7 Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.
|
|
|