![]() |
![]() ![]() |
![]() |
Vinchkovsky |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Не хотел новую тему открывать, поэтому пишу тут
![]() Самостоятельно пишу, снова-таки, от нечего делать, Морской бой с псевдографикой, возникли такие вопросы: 1) Какое количество кораблей должно быть на поле? Википедия пишет, что один четырехклеточный, два трехклеточный.....четыре одноклеточных, хотя на рисунке 1-5К,2-4К,...,5-1К (пусть х-уК обозначает х у-клеточных корабликов). Сам склоняюсь к второму варианту, как же на самом деле? 2) Если первый вариант верный, то все без проблем. Если нет, то проблема есть ![]() Создал процедуру, которая расставляет на поле кораблики, придавая элементу массива значение 1, если клетка занята, и 0, если нет. Корабли 1-5К, 2-4К, 3-3К,4-2К расставляются без проблем и моментально. Но проблема - после этого часто не хватает места на 1-местных кораблей. Например, ситуация такая: ![]() Красным помечена возможная позиция для 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- вправо. Главный вопрос выделил, чтобы он не затерялся в сообщении. С Википедия-вариантом или без маленьких корабликов программа работает "на ура". Спасибо за советы. |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Не хотел новую тему открывать, - твои "нежелания", однако, противоречат традициям Форума. Я исправил.Верен, конечно, вариант 1х4+2х3+3х2+4х1. Если добавить следовать пятиклеточному варианту, то, разумеется, не хватит места на всех. Ты еще сделай десятиклеточный.. ![]() Поле игры 10х10 рассчитано именно на 4-клеточный вариант. Это ограничение существенное. Масштабировать, в принципе, можно - но, будь добр, подкорректируй размеры поля. И это может оказаться не очень хорошо.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Vinchkovsky |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Цитата - твои "нежелания", однако, противоречат традициям Форума. Я исправил. Приношу свои извинения, думал, что однотипные темы - не очень хорошо ![]() Цитата Верен, конечно, вариант 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 Правда, только теперь досмотрелся, что там нету одноклеточного корабля. В общем, все работает идеально с двумя варинтами, а это главное; спасибо за помощь, извиняюсь за глупый вопрос ![]() Цитата Если добавить следовать пятиклеточному варианту, то, разумеется, не хватит места на всех. Хватает, но не всегда, это меня и запутало ![]() ![]() |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 11:06 |