Помогите пожалуйста
Пишу морской бой на js. Я новичок. В общем не могу придумать алгоритмы. Корабли записаны в двумерном массиве. 0 - пустая клетка, в которой нет корабля и в нее не попадали. 1 - корабль. -1 - раненый корабль, -2 - убитый корабль, 2 - попадание мимо. Правильно ли я вообще мыслю? Я не могу сообразить как:
1. При обстреле понят уже убит корабль или нет??? 2. Какие проверки сделать при рандомной расстановке??? Вообще как рандомную расстановку сделать. |
Цитата:
При выстреле нужно знать "ранил" или "подбил". Твоя "привязка" к игровому полю не верна. Вообще "Морской бой" это программка т.с. на тест именно "организации данных", а не умении составлять алгоритмы... Цитата:
Значит рано тебе еще такие программки писать. Начни с чего-то более простого... Например "Угадай число". ;) |
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Но все решаемо, люди сто раз делали, даже на этом форуме, просто поищи. А вообще, как я понимаю, этот раздел для готовых скриптов. |
Цитата:
Цитата:
|
Цитата:
*** и * * * разными кораблями и рандомно выбирать тип. Создай функции типа add_korably_3_gorizontal(x,y) и add_korably_3_vertikal(x,y), где x, y крайняя точка корабля. Эта точка берется рандомно до тех пор, пока все клетки корабля, и примыкающие к ним, не лягут на свободные клетки (и не вылазиют за поле). При этом сразу заполняешь массив занятыми клетками: Цитата:
|
Цитата:
![]() |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Ну еще подумав, можно добавить еще один логический аргумент )) и тогда хватит одной функции на все корабли ))) просто это все приходит уже при разработке. Не все сразу ))
|
Цитата:
![]() |
Цитата:
Итак, три массива. Первый массив, например, корабли 0000001100 2220000003 0000000000 и т.д. Второй - свободные клетки (цифра 0) , 1 - занято. Этот массив нужен только на этапе рандомного заполнения кораблями: 1111011111 1111011111 1111000011 Третий массив- выстрелы. В начале он полностью дублирует ПЕРВЫЙ массив. При попадании в пустое поле меняешь циферку на -1 ( и соотв. рисунок ) При попадании в корабль меняешь циферку на -2 ( соотв. рисунок ). Об убийстве корабля позже. Ты сначала это сделай )) |
Цитата:
|
Цитата:
Цитата:
Если 5-рок не осталось, то корабль убит. Пробегаешь по первому массиву ищешь там 5-ки. При нахождении оных меняешь соответствующие поля на картинкИ "убит". Все. Осталось писать руками. Возможно, по пути придумаются упрощения. |
Цитата:
|
Цитата:
|
Цитата:
А до этого само хранение... |
Цитата:
Зато алгоритм достаточно простой и легко реализуемый, и повода плакать я тут не вижу. Если же у тебя есть по существу соображения, поделись. |
Цитата:
Цитата:
Это настоящее тестовое задание для новичков. Я его даю при приеме на работу новичкам т.с. с потенцией. Как правило на эту игру у них уходит не меньше месяца. И смысл мне тут показавать варианты решений этого теста? :) |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Т.е. понятие "проектирование" тому мозгу не знакомо? :D Цитата:
Почитаем, что скажут другие форумчане. :D Цитата:
|
Цитата:
Я же не перед дядей на приеме на работу сижу, чтобы от и до проектировать. Тем более это не такая и сложная задача. Ее быстрее сделать, чем расписать |
Цитата:
Цитата:
|
Цитата:
Умныя мысля приходит опосля - народная мудрость )) |
Цитата:
|
Цитата:
Я бы наверное сделал так: (написал первое что пришло в голову, не ругаца) var map = { "a": { 1: 0, 2: 0, 3: 2, 4: 0 ... }, "b": { 1: 0, 2: 0, 3: 2, 4: 0 ... } ... } Вот решил игрок стрельнуть по координатам a3, сразу смотрим попал или нет? если нет то отмечаем "мимо", если да то узнаем сколько палуб у корабля по значению 1 == 1 палубному, 2 == 2х палубному и тд. если однапалубный то просто отмечаем что убили, с дргуими чуть сложнее. Например как в данной карте, при выстреле в a3 (или b3) мы проверяем что попали, определили 2х палубный корабль и тупо проверяем значения вокруг. то есть сначала по тому же самому обьекту сверяем a3 - 1 с a3 и a3 + 1 с а3 если не нашли то проверяем в соседних обьектах в данном случае b3, так как "a" - граница. Когда находим элемент просто присваиваем ему значение на 1 меньше (чтобы потом он не проверял окрестности). Что касается генерации кораблей то тут нужно подумать но вполне решается 1 функцией, но я уже в пижаме) |
Цитата:
Только нужно развивать дальше это "направление". |
Вопрос:
Цитата:
Ответ: Цитата:
Цитата:
Цитата:
Цитата:
Неудобно как-то перед Cerfuck - ом )) Да и занят я был. Сорокопятку еще свою переделывал ) Ладно, согласен с тобой, три дня мало )) чтоб нормально сделать, с графикой, с эффектами, а не с кружочками ) Неделя нужна )) Как будет время, стартую, и сразу тебе отпишу, ок? Поверишь надеюсь на слово, что пока не начинал )) |
Цитата:
|
Кстати вчера посидел чуток, там по сути для начала нужно отслеживать попадания и строить корабли научится, аи компа можно просто заставить рэндомно стрелять по клеточкам.
window.onload = init; function init() { var _map = { "a": { 1: 0, 2: 0, 3: { 'allDecks':3, 'otherDecks': {"b":3, "c":3} }, 4: 0, 5: 0 }, "b": { 1: 0, 2: 0, 3: { 'allDecks':3, 'otherDecks': {"a":3, "c":3} }, 4: 0, 5: 0 }, "c": { 1: 0, 2: 0, 3: { 'allDecks':3, 'otherDecks': {"b":3, "a":3} }, 4: 0, 5: 0 } }; var core = new GameCore(_map); core.onFire("a", 3);//выстрел в нас } function GameCore(_map) { this.onFire = function(symb, num){ if(typeof _map[symb][num] == 'object') {//все корабли - обьекты if(_map[symb][num].allDecks == 1) {//определяем разряд корабля alert(symb + num + ' убит!'); _map[symb][num] = 0; } else { replaceShip(_map[symb][num], symb); } } else{ alert('не попал!'); } }; function replaceShip(coordHit, s) { for(var i in coordHit.otherDecks) { var obj = _map[i][coordHit.otherDecks[i]]; delete obj.otherDecks[s];//удаляем координаты убитых палуб obj.allDecks--;//уменьшаем разряд корабля } } }Отслеживает попадания (ранил, убил) норм, но как их по джедайски делать(корабли) я не придумал. Если захочу то засяду потом |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Да и за тачку ведь никто корабли не расставит. :) Причем замечу про собственно результат... Задача ставится сделать программку т.с. "на продажу". А не "лабораторку" так, "чтобы отстал препод"... :D У нас ведь контора занимается производством ПО на продажу... Таки там другого не делают. :D |
Цитата:
|
Цитата:
ну а ты напиши функцию чтобы расставлял корабли, или хотя бы пихал их в мапу без визуализации. и чтобы корабли не касались друг друга.) эт сложнее) убил сегодня часа 3 на нее) |
Часовой пояс GMT +3, время: 16:22. |