Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Помогите пожалуйста (https://javascript.ru/forum/project/42862-pomogite-pozhalujjsta.html)

Cerfuck 12.11.2013 13:41

Помогите пожалуйста
 
Пишу морской бой на js. Я новичок. В общем не могу придумать алгоритмы. Корабли записаны в двумерном массиве. 0 - пустая клетка, в которой нет корабля и в нее не попадали. 1 - корабль. -1 - раненый корабль, -2 - убитый корабль, 2 - попадание мимо. Правильно ли я вообще мыслю? Я не могу сообразить как:
1. При обстреле понят уже убит корабль или нет???
2. Какие проверки сделать при рандомной расстановке??? Вообще как рандомную расстановку сделать.

ksa 12.11.2013 14:37

Цитата:

Сообщение от Cerfuck
Правильно ли я вообще мыслю?

Нет.
При выстреле нужно знать "ранил" или "подбил". Твоя "привязка" к игровому полю не верна.

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

Цитата:

Сообщение от Cerfuck
Вообще как рандомную расстановку сделать.

ППЦ! :blink:
Значит рано тебе еще такие программки писать. Начни с чего-то более простого...
Например "Угадай число". ;)

Cerfuck 12.11.2013 14:47

Цитата:

Сообщение от ksa (Сообщение 280598)
Нет.
При выстреле нужно знать "ранил" или "подбил". Твоя "привязка" к игровому полю не верна.

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

ППЦ! :blink:
Значит рано тебе еще такие программки писать. Начни с чего-то более простого...
Например "Угадай число". ;)

Подскажи пожалуйста тогда, как правильно организовать данные? А по поводу рандома я имею представление, пару лет назад писал пятнашки на delphi, но именно в данной ситуации не могу придумать проверки для правильной расстановки и наверное опять же из-за не правильной организации данных.

ksa 12.11.2013 14:50

Цитата:

Сообщение от Cerfuck
Подскажи пожалуйста тогда, как правильно организовать данные?

Тогда в чем смысл именно твоего участия? :D

Цитата:

Сообщение от Cerfuck
но именно в данной ситуации не могу придумать проверки для правильной расстановки

Вот я и пишу
Цитата:

Сообщение от ksa
рано тебе еще такие программки писать


alexan0308 12.11.2013 15:14

Цитата:

Сообщение от Cerfuck (Сообщение 280584)
Вообще как рандомную расстановку сделать.

Цитата:

Сообщение от ksa (Сообщение 280598)
Значит рано тебе еще такие программки писать. Начни с чего-то более простого...

Тут на самом дела не так просто. Нужно же чтобы разные корабли не задевали друг друга. Нужно затылок почесать.

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

ksa 12.11.2013 15:25

Цитата:

Сообщение от alexan0308
Тут на самом дела не так просто.

Так и пишу - начни с чего по-проще... :D Если эта генерация сложна.

Цитата:

Сообщение от alexan0308
А вообще, как я понимаю, этот раздел для готовых скриптов.

Именно так. :yes:

alexan0308 12.11.2013 16:08

Цитата:

Сообщение от alexan0308 (Сообщение 280614)
Но все решаемо

Мне сначала показалось сложным, потому что кажется, что нужно крутить эти корабли. Но ничто не мешает считать корабли вида
***
и

*
*
*
разными кораблями и рандомно выбирать тип.
Создай функции типа add_korably_3_gorizontal(x,y) и add_korably_3_vertikal(x,y), где x, y крайняя точка корабля. Эта точка берется рандомно до тех пор, пока все клетки корабля, и примыкающие к ним, не лягут на свободные клетки (и не вылазиют за поле).

При этом сразу заполняешь массив занятыми клетками:

Цитата:

Сообщение от Cerfuck (Сообщение 280584)
Корабли записаны в двумерном массиве. 0 - пустая клетка, в которой нет корабля и в нее не попадали. 1 - корабль. -1 - раненый корабль, -2 - убитый корабль, 2 - попадание мимо. Правильно ли я вообще мыслю?

Удобнее наверно сделать ТРИ таких массива. В одном хранить свободные клетки, во втором корабли, а в третьем выстрелы.

ksa 12.11.2013 16:26

Цитата:

Сообщение от alexan0308
Создай функции типа add_korably_3_gorizontal(x,y) и add_korably_3_vertikal(x,y), где x, y крайняя точка.

Пипец!

alexan0308 12.11.2013 16:28

Цитата:

Сообщение от ksa (Сообщение 280648)
Пипец!

Ну дык же я нубу новичку объяснял. Чтобы понятнее было.

Cerfuck 12.11.2013 16:34

Цитата:

Сообщение от alexan0308 (Сообщение 280649)
Ну дык же я нубу новичку объяснял. Чтобы понятнее было.

Ну я же не настолько нуб. Работаю верстальщиком. Опыт есть.

alexan0308 12.11.2013 16:35

Цитата:

Сообщение от Cerfuck (Сообщение 280653)
Ну я же не настолько нуб. Работаю верстальщиком. Опыт есть.

Ок.
Цитата:

Сообщение от ksa (Сообщение 280648)
Пипец!

А шо не так, ksa?

ksa 12.11.2013 16:37

Цитата:

Сообщение от alexan0308
А шо не так

Количество функций. :)

alexan0308 12.11.2013 16:51

Цитата:

Сообщение от ksa (Сообщение 280658)
Количество функций. :)

Ах да, все же корабли прямые. Просто давно не играл в морской бой. Почему то подумал, что там есть квадратные корабли 2 на 2. Тогда хватит двух функций. Просто нужно добавить один аргумент - количество клеток в корабле.

alexan0308 12.11.2013 17:20

Ну еще подумав, можно добавить еще один логический аргумент )) и тогда хватит одной функции на все корабли ))) просто это все приходит уже при разработке. Не все сразу ))

ksa 12.11.2013 18:41

Цитата:

Сообщение от alexan0308
хватит одной функции на все корабли

Алилуйяяя!

alexan0308 13.11.2013 16:22

Цитата:

Сообщение от Cerfuck (Сообщение 280584)
Я сейчас хочу сделать выстрелы. То есть я ранил корабль. Это понятно как сделать - взять координату клетки на странице, сравнить ее с массивом, если в этой клетке стоит корабль то помечаем эту клетку, как раненую. А дальше? допустим 4 палубный корабль. ранили его 4 раза и как программа поймет, что он убит. вот это не могу понять.

Когда я подумал об этом, мне пришло такое решение. Можно при создании корабля каждый обозначать своей цифрой ))) И после каждого выстрела пробегать весь массив и и искать клеточки с такой ЖЕ цифрой )) Ну и при попадании менять циферку.

Итак, три массива. Первый массив, например, корабли

0000001100
2220000003
0000000000 и т.д.

Второй - свободные клетки (цифра 0) , 1 - занято. Этот массив нужен только на этапе рандомного заполнения кораблями:
1111011111
1111011111
1111000011

Третий массив- выстрелы. В начале он полностью дублирует ПЕРВЫЙ массив. При попадании в пустое поле меняешь циферку на -1 ( и соотв. рисунок ) При попадании в корабль меняешь циферку на -2 ( соотв. рисунок ). Об убийстве корабля позже. Ты сначала это сделай ))

ksa 13.11.2013 16:29

Цитата:

Сообщение от alexan0308 (Сообщение 280856)
Первый массив, например, корабли

0000001100
2220000003
0000000000 и т.д.

Как будешь вычислять ранил или убил? :)

alexan0308 13.11.2013 17:07

Цитата:

Сообщение от ksa (Сообщение 280859)
Как будешь вычислять ранил или убил? :)

Цитата:

Сообщение от alexan0308 (Сообщение 280856)
Третий массив- выстрелы. В начале он полностью дублирует ПЕРВЫЙ массив. При попадании в пустое поле меняешь циферку на -1 ( и соотв. рисунок ) При попадании в корабль меняешь циферку на -2 ( соотв. рисунок ).

Допустим попал в поле где написано 5. Значит, попал в корабль. Меняешь поле на -2. Ищешь, остались ли в этом массиве 5-ки. Если остались, то корабль ранен. Ставишь соответствующую картинкУ "ранен".
Если 5-рок не осталось, то корабль убит. Пробегаешь по первому массиву ищешь там 5-ки. При нахождении оных меняешь соответствующие поля на картинкИ "убит".
Все. Осталось писать руками. Возможно, по пути придумаются упрощения.

ksa 13.11.2013 18:43

Цитата:

Сообщение от alexan0308
Допустим попал в поле где написано 5. Значит, попал в корабль. Меняешь поле на -2. Ищешь, остались ли в этом массиве 5-ки. Если остались, то корабль ранен.

ППЦ... :cray:

alexan0308 13.11.2013 19:11

Цитата:

Сообщение от ksa (Сообщение 280899)
ППЦ... :cray:

Шо то не так, уважаемый?

ksa 14.11.2013 08:45

Цитата:

Сообщение от alexan0308
Шо то не так

Аогоритм естественно! :D
А до этого само хранение...

alexan0308 14.11.2013 09:35

Цитата:

Сообщение от ksa (Сообщение 280987)
Аогоритм естественно! :D
А до этого само хранение...

Согласен, не самый оптимальный. Он же навскидку. Может при разработке что то и упростится.
Зато алгоритм достаточно простой и легко реализуемый, и повода плакать я тут не вижу.

Если же у тебя есть по существу соображения, поделись.

ksa 14.11.2013 09:39

Цитата:

Сообщение от alexan0308
Может при разработке что то упростится.

Подход дилетантов...

Цитата:

Сообщение от alexan0308
Если же у тебя есть по существу соображения, поделись.

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

И смысл мне тут показавать варианты решений этого теста? :)

alexan0308 14.11.2013 09:44

Цитата:

Сообщение от alexan0308 (Сообщение 280998)
Может при разработке что то и упростится.

Цитата:

Сообщение от ksa (Сообщение 280999)
Подход дилетантов...

Гонишь. Это обычная особенность мозга - что-то додумывать.

Цитата:

Сообщение от ksa (Сообщение 280999)
Я его даю при приеме на работу новичкам т.с. с потенцией. Как правило на эту игру у них уходит не меньше месяца.

С моим алгоритмом уйдет максимум три дня =)

Цитата:

Сообщение от ksa (Сообщение 280999)

И смысл мне тут показавать варианты решений этого теста? :)

А смысл тогда встревать тут? =) Понятно, что всегда можно сделать лучше, чем есть.

ksa 14.11.2013 09:47

Цитата:

Сообщение от alexan0308
Это обычная особенность мозга - что-то додумывать

:blink:
Т.е. понятие "проектирование" тому мозгу не знакомо? :D

Цитата:

Сообщение от alexan0308
С моим алгоритмом уйдет максимум три дня =)

Покажи потом результат в разделе http://javascript.ru/forum/project/
Почитаем, что скажут другие форумчане. :D

Цитата:

Сообщение от alexan0308
А смысл тогда встревать тут?

Эо свободный форум - т.ч. "встреваю" где хочу... ;)

alexan0308 14.11.2013 10:34

Цитата:

Сообщение от alexan0308 (Сообщение 280998)
Согласен, не самый оптимальный. Он же навскидку. Может при разработке что то и упростится. .

Хочешь сказать, додумывание - незнакомо твоему мозгу? :D
Я же не перед дядей на приеме на работу сижу, чтобы от и до проектировать. Тем более это не такая и сложная задача. Ее быстрее сделать, чем расписать

ksa 14.11.2013 10:37

Цитата:

Сообщение от alexan0308
Хочешь сказать, додумывание - незнакомо твоему мозгу?

Я не применяю "додумывание" при разработке приложений. :D

Цитата:

Сообщение от alexan0308
Тем более это не такая и сложная задача. Ее быстрее сделать, чем расписать

Я подожду те 3, обещаных тобой, дня... :yes:

alexan0308 14.11.2013 10:50

Цитата:

Сообщение от ksa (Сообщение 281020)
Я не применяю "додумывание" при разработке приложений. :D
Я подожду те 3, обещаных тобой, дня... :yes:

Cerfuck, успеешь надеюсь? ))
Умныя мысля приходит опосля - народная мудрость ))

ksa 22.11.2013 10:18

Цитата:

Сообщение от alexan0308
14.11.2013, 09:44
С моим алгоритмом уйдет максимум три дня =)

Сегодня уже 22-е, есть что показать?

l-liava-l 22.11.2013 17:53

Цитата:

Когда я подумал об этом, мне пришло такое решение. Можно при создании корабля каждый обозначать своей цифрой ))) И после каждого выстрела пробегать весь массив и и искать клеточки с такой ЖЕ цифрой )) Ну и при попадании менять циферку.

Итак, три массива. Первый массив, например, корабли

0000001100
2220000003
0000000000 и т.д.

Второй - свободные клетки (цифра 0) , 1 - занято. Этот массив нужен только на этапе рандомного заполнения кораблями:
1111011111
1111011111
1111000011

Третий массив- выстрелы. В начале он полностью дублирует ПЕРВЫЙ массив. При попадании в пустое поле меняешь циферку на -1 ( и соотв. рисунок ) При попадании в корабль меняешь циферку на -2 ( соотв. рисунок ). Об убийстве корабля позже. Ты сначала это сделай ))
Ответить с цитированием
А как ты будешь проверять куда выстрелил игрок попал/нет?
Я бы наверное сделал так: (написал первое что пришло в голову, не ругаца)
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 функцией, но я уже в пижаме)

ksa 22.11.2013 20:30

Цитата:

Сообщение от l-liava-l
не ругаца

Во. Уже объекты в ход пошли - это набор очков в организации хранения. :yes:

Только нужно развивать дальше это "направление".

alexan0308 23.11.2013 12:28

Вопрос:
Цитата:

Сообщение от l-liava-l (Сообщение 282234)
А как ты будешь проверять куда выстрелил игрок попал/нет?

Запятых нет, вопрос не очень понятен, но наверно:
Ответ:
Цитата:

Сообщение от alexan0308 (Сообщение 280879)
Допустим попал в поле где написано 5. Значит, попал в корабль. Меняешь поле на -2. Ищешь, остались ли в этом массиве 5-ки. Если остались, то корабль ранен. Ставишь соответствующую картинкУ "ранен".
Если 5-рок не осталось, то корабль убит. Пробегаешь по первому массиву ищешь там 5-ки. При нахождении оных меняешь соответствующие поля на картинкИ "убит".

Вопрос:
Цитата:

Сообщение от l-liava-l (Сообщение 282234)
Что касается генерации кораблей то тут нужно подумать но вполне решается 1 функцией, но я уже в пижаме)

Ответ:
Цитата:

Сообщение от alexan0308 (Сообщение 280677)
Ну еще подумав, можно добавить еще один логический аргумент )) и тогда хватит одной функции на все корабли ))) просто это все приходит уже при разработке. Не все сразу ))

Вопрос:
Цитата:

Сообщение от ksa (Сообщение 282181)
Сегодня уже 22-е, есть что показать?

Ответ:
Неудобно как-то перед Cerfuck - ом )) Да и занят я был. Сорокопятку еще свою переделывал ) Ладно, согласен с тобой, три дня мало )) чтоб нормально сделать, с графикой, с эффектами, а не с кружочками ) Неделя нужна )) Как будет время, стартую, и сразу тебе отпишу, ок? Поверишь надеюсь на слово, что пока не начинал ))

ksa 23.11.2013 20:24

Цитата:

Сообщение от alexan0308
Неделя нужна

Ну началось... :lol:

l-liava-l 24.11.2013 14:08

Кстати вчера посидел чуток, там по сути для начала нужно отслеживать попадания и строить корабли научится, аи компа можно просто заставить рэндомно стрелять по клеточкам.
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--;//уменьшаем разряд корабля
                 

                }



            }
}
Отслеживает попадания (ранил, убил) норм, но как их по джедайски делать(корабли) я не придумал.
Если захочу то засяду потом

ksa 24.11.2013 15:20

Цитата:

Сообщение от l-liava-l
но как их по джедайски делать(корабли) я не придумал

Делать объект "корабль"... Создать их целый массив... Тот массив так же можно засунуть в объект, дабы отслеживать сколько осталось "живых" кораблей...

l-liava-l 24.11.2013 17:43

Цитата:

Делать объект "корабль"... Создать их целый массив... Тот массив так же можно засунуть в объект, дабы отслеживать сколько осталось "живых" кораблей...
О, точно, получилось) благодарю

alexan0308 24.11.2013 18:25

Цитата:

Сообщение от ksa (Сообщение 282355)
Ну началось... :lol:

Ага... ну если не надо , что свои корабли игрок сам расставляет, то можно быстрее ))

ksa 24.11.2013 19:07

Цитата:

Сообщение от alexan0308
что свои корабли игрок сам расставляет, то можно быстрее

Не согласен, что это будет быстрее... :no: Ведь нужно еще написать для этого свой функционал.
Да и за тачку ведь никто корабли не расставит. :)

Причем замечу про собственно результат...
Задача ставится сделать программку т.с. "на продажу". А не "лабораторку" так, "чтобы отстал препод"... :D
У нас ведь контора занимается производством ПО на продажу... Таки там другого не делают. :D

alexan0308 24.11.2013 19:27

Цитата:

Сообщение от ksa (Сообщение 282492)
Не согласен, что это будет быстрее... :no:

как не будет? Я имею в виду, можно рандомно раскидать корабли и компу и игроку , а можно рандомно компу а игрок сам себе расставляет. Очевидно, что первое быстрее

l-liava-l 24.11.2013 20:04

Цитата:

как не будет? Я имею в виду, можно рандомно раскидать корабли и компу и игроку , а можно рандомно компу а игрок сам себе расставляет. Очевидно, что первое быстрее
:D быстрее расставит эт да)

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

убил сегодня часа 3 на нее)


Часовой пояс GMT +3, время: 16:22.