IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Морской бой, расстановка кораблей, не хватает места для всех
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Не хотел новую тему открывать, поэтому пишу тут wink.gif

Самостоятельно пишу, снова-таки, от нечего делать, Морской бой с псевдографикой, возникли такие вопросы:

1) Какое количество кораблей должно быть на поле? Википедия пишет, что один четырехклеточный, два трехклеточный.....четыре одноклеточных, хотя на рисунке 1-5К,2-4К,...,5-1К (пусть х-уК обозначает х у-клеточных корабликов). Сам склоняюсь к второму варианту, как же на самом деле?

2) Если первый вариант верный, то все без проблем. Если нет, то проблема есть wink.gif
Создал процедуру, которая расставляет на поле кораблики, придавая элементу массива значение 1, если клетка занята, и 0, если нет.
Корабли 1-5К, 2-4К, 3-3К,4-2К расставляются без проблем и моментально. Но проблема - после этого часто не хватает места на 1-местных кораблей. Например, ситуация такая:

Прикрепленный файл  scr1.bmp ( 5.44 килобайт ) Кол-во скачиваний: 2126


Красным помечена возможная позиция для 1К кораблика, и, как видно, она только одна.

Как сделать, чтобы оставалось место для маленьких корабликов?

Алгоритм установки кораблика у меня таков:

for j:=1 to 2 do     {Ставим 2 кораблика по 4 клетки каждый}
BEGIN
CanGoNext:=false; {Переменная отвечает за возможность двигаться дальше; если принимает значение истины, то кораблик поставлен}
while CanGoNext=false do
begin
Side:=random(2); {Переменная отвечает за ориентацию кораблика, если равна 0-то кораблик расположен горизонтально, 1-вертикально)}
Middle:=random(4)+4; {см. обьяснение ниже в сообщении}
if Side=0 then {HORIZONTAL}
begin
Y:=random(10)+1; {Выбираем строку (коорд.У)}
a:=Random(4); {См.обьяснение ниже в сообщении}
b:=4-1-a;
LeftG:=Middle-a; {Левая граница}
RigthG:=Middle+b; {Правая граница}
CanGoNext:=true; {Допустим, корабль стоит верно}
for i:=Y-1 to Y+1 do {Проверяем это утверждение}
for k:=LeftG-1 to RigthG+1 do
if Pos[i,k]=1 then CanGoNext:=false;
if CanGoNext=true then {Если проверка пройдена и значение CanGoNext после нее не изменилось-ставим корабль (строкой ниже)}
for c:=LeftG to RigthG do Pos[Y,c]:=1
end;
if Side=1 then {VERTICAL}
begin {Все аналогично для вертикали}
X:=random(10)+1;
a:=Random(4);
b:=4-1-a;
UpG:=Middle-a;
DownG:=Middle+b;
CanGoNext:=true;
for i:=UpG-1 to DownG+1 do
for k:=X-1 to X+1 do
if Pos[i,k]=1 then CanGoNext:=false;
if CanGoNext=true then
for c:=UpG to DownG do Pos[c,X]:=1
end;
end;
END;


Middle-переменная, диапазон значений которой-[размер кораблика-1,10-размер кораблика+1], то есть если хотя бы одна точка кораблика имеет координату, равную Middle, то кораблик не вылезает за пределы таблицы 10х10. Переменная а - отклонение от Middle влево, b- вправо.

Главный вопрос выделил, чтобы он не затерялся в сообщении. С Википедия-вариантом или без маленьких корабликов программа работает "на ура".
Спасибо за советы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Vinchkovsky @ 19.10.2008 17:11) *
Не хотел новую тему открывать,
- твои "нежелания", однако, противоречат традициям Форума. Я исправил.

Верен, конечно, вариант 1х4+2х3+3х2+4х1. Если добавить следовать пятиклеточному варианту, то, разумеется, не хватит места на всех. Ты еще сделай десятиклеточный.. smile.gif.
Поле игры 10х10 рассчитано именно на 4-клеточный вариант. Это ограничение существенное. Масштабировать, в принципе, можно - но, будь добр, подкорректируй размеры поля. И это может оказаться не очень хорошо..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Цитата
- твои "нежелания", однако, противоречат традициям Форума. Я исправил.

Приношу свои извинения, думал, что однотипные темы - не очень хорошо wink.gif
Цитата
Верен, конечно, вариант 1х4+2х3+3х2+4х1.

Спасибо, тогда все хорошо, в воспоминаниях остался вариант про 5-клеточный вариант, видимо, ошибся.
На Википедии смутила картинка (http://upload.wikimedia.org/wikipedia/comm...iffeversenk.jpg), да и текст:
Type of ship Size
aircraft carrier 5
battleship 4
destroyer 3
submarine 3
patrol boat 2
Правда, только теперь досмотрелся, что там нету одноклеточного корабля.

В общем, все работает идеально с двумя варинтами, а это главное; спасибо за помощь, извиняюсь за глупый вопрос wink.gif
Цитата
Если добавить следовать пятиклеточному варианту, то, разумеется, не хватит места на всех.

Хватает, но не всегда, это меня и запутало wink.gif
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






similar a la viagra
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.11.2024 20:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name