Текущий архив: 2008.02.03;
Скачать: CL | DM;
ВнизМорской, блин, бой. Найти похожие ветки
← →
Sholah_Weras © (2006-10-25 18:58) [0]Здравствуйте!
Вот давеча решил забабахать морской бой. Решил вот как сделать - в потоке постоянно обновляются координаты Image"в (которые по совместительству и являются кораблями), вычисляется место в массиве, где должно находится начало корабля, определяется тип корабля и на оснавании типа заполняются еще несколько ячеек массива. Примнр: есть трехпалубник, координаты 15-15. В массиве [1,1] выставляется единица. Тип корабля 3, поворот=false, занчит в [1,2] и [1,3] выставляется единица:
1110000000
0000000000
0000000000
-----------
Только вот что-то не работает. Замучился выяснять ошибку. Может неверен сам подход? Может кто сталкивлся с такой проблемой?
← →
Ketmar © (2006-10-25 19:07) [1]в "что-то" ошибка, однозначно.
← →
Ketmar © (2006-10-25 19:08) [2]иначе бы "что-то" обязательно заработало, ага.
← →
Sholah_Weras © (2006-10-25 19:17) [3]Вот привожу код. Может кто прозорливый и ткнет пальчиком в нужную строку.
procedure ObMass.UpdateMass;
var
i,j,f1,f2:Byte;
tz:boolean;
k,k1,n,n1:SmallInt;
begin
n:=15; n1:=15; k:=0; k1:=0;; f1:=0; f2:=0;
if SheepEnebl[0]=1 then //Это чтоб массив не забивал координатами
begin //корабля находящимся вне поля canvas
XY[0]:=Unit1.Form1.Image1.Left;
XY[1]:=Unit1.Form1.Image1.Top;
end;
for j:=0 to 9 do
begin
tz:=false;
for i:=0 to 9 do
begin
if XY[j+f1] > n then
begin
n:=n+30; // Каждая клетка 30*30
k:=k+1; // Вычисляется номер ячейки массива, куда 1 записвать
end
else
begin
if not tz then
begin
f1:=f1+2;
end;
tz:=true;
end;
end;
tz:=false;
for i:=0 to 9 do
begin
if XY[j+f2] > n1 then
begin
n1:=n1+30; //Аналогично
k1:=k1+1; //
end
else
begin
if not tz then
begin
f2:=f2+1;
end;
tz:=true;
end;
end;
Unit1.Form1.Edit1.Text:=IntToStr(XY[0])+" "+IntToStr(XY[1])+" "+IntToStr(n)+" "+IntToStr(n1);
Unit1.Mass_P1[k,k1]:=1;
k:=0; k1:=0; n:=15; n1:=15;
end;
Exit;
end;
← →
Rial © (2006-10-25 20:00) [4]
> [0] Sholah_Weras © (25.10.06 18:58)
Конструктивных замечаний не могу сделать, т.к. что же
все таки происходит или должно происходить, знаешь, видимо, только ты.
Поэтому мои неконструктивные.
1. k:=k+1; <=> Inc(K);
2. n:=n+30; <=> Inc(N, 30);
3.
begin
f2:=f2+1;
end;
<=>
Inc(F1);
4.
Unit1.Mass_P1[k,k1]:=1;
Всякие там массивы не стоит относить напрямую к форме.
Либо делай просто глобальные переменные, либо заводи отдельный
класс, отвечающий за логику игры.
5.
n:=15; n1:=15; k:=0; k1:=0;; f1:=0; f2:=0;
Иногда стоит почаще клацать по клавише Enter.
6.
:SmallInt;
А чем Integer не угодил ? :)
7.
Unit1.Form1.Image1.Top;
ИМХО, жуткая иерархия. Зачем юнит то указывать ?
8.
Exit;
end;
Это что за чудо ?
9.
Назови переменные по - человечески.
И раз уж на то пошло, поставь комментарии на каждой строке.
И кода выложи побольше, хотя если он весь похож на это,
то не стоит... %)
← →
Ketmar © (2006-10-25 20:05) [5]если ты думаешь, что в этом коде можно разобраться без 0.7 сорокаградусной -- ты неисправимый оптимист. это не код. это каша непонятного назначения. к тому же совершенно не ясно, что есть SheepEnebl (у меня появляются закономерные ассоциации с овцами и половым актом), XY, ...
вердикт: или переписать, или в "начинающим".
зыж и с таким кодом ты полез многопоточность ваять??? рано. ра-но.
ззыж маленький тестик на интеллект. посмотрим, пройдёшь ли.
← →
RzCoDer © (2006-10-25 20:43) [6]блин, забей
> место в массиве, где должно находится начало корабля, определяется
> тип корабля и на оснавании типа заполняются еще несколько
> ячеек
Юзай для каждого отделения корабля свой участок в массиве.
p.s. и откуда у народа такая тяга всё усложнить?
← →
grouzd)ev © (2006-10-25 22:58) [7]традиционно. 3 работы. полный код. хотя свою (grouzd)ev) смотреть не советую, там совсем другой метод (жууутко кривой)
http://grouzdev.nm.ru/projects/contests/15_seabattle.rar [1 884kb]
да, и на будущее - http://code.darthman.com/
+)
---
... we are walking on a thin line and you better avoid the risk ...
← →
Sholah_Weras © (2006-10-25 23:01) [8]Переделываю, скоро отпос...тюсь? тющь? тюся? Вообщем ждите.
← →
Belorus © (2006-10-29 11:48) [9]SheepEnebl - это аффца фключинайа ?
По мне так ShipEnable - несколько эстетичнее смотрелось бы в этой груде символов.
Не знаю как вам но мне отступы после бегина в 1 символ - так непривычны...
Используй TAB он вроде умалчивая :) равен двум пробелам.
← →
Sholah_Weras © (2006-12-11 22:31) [10]Вот. Свершилось. Наконеч-то написал код, реализующий расстановку кораблей. Прошу заметить, что все это время (месяц, или около того) я не шибко большое внимание уделял. Так что просьба на мои черепашьи таланты не обращать внимания.
там есть одна ошибка. Указывает на
for i:=0 to 19 do
begin
XY[i]:=0;
end;
Необходимо посмотреть выше, в раздел TForm3 = class(TForm) и там закоментировать одну из строчек XY: array [0..19] of SmallInt;
Эм да, кстать. А куда выложить то можно? А то 2000строк кода размещать здесь как-то не то)
← →
grisme © (2006-12-12 04:04) [11]ты думаешь оно тут нужно кому? :]
ты давай релиз собери(я сомневаюсь, что такой день настанет), тогда мы его попинаем, хотя(потенциально) страшно
← →
Sholah_Weras © (2006-12-12 08:33) [12]Ну, вообщето да, тут этому нафиг ни кому не нужно)) Но чтобы не быть голословным, хочется предъявить исходники. Хотя, кому это кроме меня нужно?)))
Следующий шаг разработки - компьюиер будет расставлять корабли. Я вот думаю реализовать это рандомно, но с роверкой всевозможных условий (типа корабли рассатавлять правильно).
← →
Думкин © (2006-12-12 11:20) [13]
> Sholah_Weras © (12.12.06 08:33) [12]
Надо исходить из положения: в одну воронку снаряды дважды не попадают.
Взяв это на вооружение, бомбим пустое поле. Места попаданий - места расположения эскадры. Потом противник пусть хоть забомбится. Исходя из нашей доктрины - он не сможет подбить ни одного корабля. Удачи. :)
← →
Pa5ha © (2006-12-12 15:17) [14]Кстати, вопрос. При игре по сети где хранить корабли? Если каждый на своей стороне, то можно считерить и посылать при каждом выстреле, что не попал. Если на стороне врага, то малоли он сможет узнать где они находятся. На своей стороне как-то безопаснее, но... Шифровать то ли? Есть идеи? Как люди делают? -)
← →
Steep © (2006-12-12 16:40) [15]
> При игре по сети где хранить корабли?
да каждый у себя пусть хранить координаты кораблей
при выстреле послай координаты
у врага делай проверку координат со своими (у врага) кораблями воординатами
и шли ответ попал, мимо, убил
и усе...
← →
Sholah_Weras © (2006-12-12 21:43) [16]2 Думкин
Что-т оя Вас не допонял. Я имелл ввиду, что случайным образом выбирается клетка поля, потом путем многих проверок убеждаюсь, что данный корабль в данном положении (повернут или нет) можно разместить. И так все 10 кораблей. Начианя с самого большого, чтоб потом роблем не возникло.
Если я не понял глубину Вашей мысли, то пожалуйста, обьясните еще разок, подоходчивее.
← →
Наиль © (2006-12-12 21:58) [17]> Что-т оя Вас не допонял. Я имелл ввиду, что случайным образом
> выбирается клетка поля, потом путем многих проверок убеждаюсь,
> что данный корабль в данном положении (повернут или нет)
> можно разместить. И так все 10 кораблей. Начианя с самого
> большого, чтоб потом роблем не возникло.
> Если я не понял глубину Вашей мысли, то пожалуйста, обьясните
> еще разок, подоходчивее.
У Думкина юмор такой: использовать народную примету в качестве основы для искусственого интелекта.
Имеется ввиду, что нужно произвести обстрел поля до того, как на нём раставить корабли, чтобы выявить зоны потенциального риска.
← →
Думкин © (2006-12-13 06:26) [18]
> Sholah_Weras © (12.12.06 21:43) [16]
А понял. Тебе одного смайла мало. Скажи сколько - я проставлю.
← →
Sholah_Weras © (2006-12-13 08:24) [19]> Думкин
Где-то у какого-то человека прочитал в инфе такую фразу: "Человек, котороый злоупотребляет смайлами, похож на жизнерадостного идиота."
> Наиль
Что значит "зоны потенциального риска"?
← →
Думкин © (2006-12-13 11:02) [20]
> Sholah_Weras © (13.12.06 08:24) [19]
Вот я и не злоупотребляю. А тот кто не понимает шуток - на кого похож?
← →
Sholah_Weras © (2006-12-13 21:21) [21]>Думкин
Шутки можно понимать, и можно не понимать. Так же шутка может быть уместной и не очень.
← →
Sholah_Weras © (2006-12-14 20:40) [22]Реализовал расстановку кораблей случайным образом. Следующий шаг - обстрелы.
← →
Думкин © (2006-12-15 19:29) [23]
> Sholah_Weras © (14.12.06 20:40) [22]
> Реализовал расстановку кораблей случайным образом. Следующий
> шаг - обстрелы.
Я шуток тоже не понимаю, а посему докажи, что расстрановка случайная.
← →
Sholah_Weras © (2006-12-15 20:40) [24]Боюсь код будет слишком сложен для тебя (не имеется ввиду твои интеллектуальные способности). Т.к. разобраться внем подчас трудно и мне.
Но приведу кусок:
l:=360; //координата слева начала поля, где стоят корабли противника
t:=15; //координата сверху начала поля
n:=-1; //отвечает за то, какой корбаль сейчас устанавливается
for i:=0 to 9 do //расстанавливаю 10 кораблей
begin
Inc(n); //при следующем значении i устанавливается слудущий корабль
1:Randomize; //метка на рандом
rand:=random(2);
if rand=1 then SheepInfo2[0,n]:=1 else SheepInfo2[0,n]:=0;//нулевой стобец отвечает за поворот корабля. [0,5]=1 - значит что последний двухпалубник повернут
k:=random(10); //выбираются начальные координаты
k1:=random(10); //корабля в сетке
if n=0 then
begin
if mass_p2[k,k1]=0 then //это основной массив, где хранится сведения о расстановке кораблей
begin
if SheepInfo2[0,n]=0 then
begin
if (mass_p2[k+1,k1]=0) and (mass_p2[k+2,k1]=0) and (mass_p2[k+3,k1]=0) and ((mass_p2[k+4,k1]=0) or (mass_p2[k+4,k1]=2)) and (k <=5) then
begin
Form1.Image11.Picture.LoadFromFile("../Sea/Data/Ships/4.jpg");
Form1.Image11.Width:=Form1.Image11.Picture.Width;
Form1.Image11.Height:=Form1.Image11.Picture.Height;
for j:=0 to k do Inc(l,30);
if l >= 45 then l:=l-30;
Form1.Image11.Left:=l;
for j:=0 to k1 do Inc(t,30);
if t >= 45 then t:=t-30;
Form1.Image11.Top:=t;
Form1.Image11.Visible:=true;
mass_p2[k,k1]:=1;
mass_p2[k+1,k1]:=1;
mass_p2[k+2,k1]:=1;
mass_p2[k+3,k1]:=1;
for i1:=0 to 5 do
for j1:=0 to 2 do
begin
if (k1-1 >= 0) and (Mass_P2[k-1+i1,k1-1+j1]=0) then
if j1 <= 1 then
Mass_P2[k-1+i1,k1-1+j1]:=2;
if (k1+1 <= 9) and (Mass_P2[k-1+i1,k1-1+j1]=0) then
if j1 >= 1 then
Mass_P2[k-1+i1,k1-1+j1]:=2;
end;
end
else GoTo 1;
end
else
begin
if (mass_p2[k,k1+1]=0) and (mass_p2[k,k1+2]=0) and (mass_p2[k,k1+3]=0) and ((mass_p2[k,k1+4]=0) or (mass_p2[k,k1+4]=2)) and (k1 <=5) then
begin
Form1.Image11.Picture.LoadFromFile("../Sea/Data/Ships/4_p.jpg");
Form1.Image11.Width:=Form1.Image11.Picture.Width;
Form1.Image11.Height:=Form1.Image11.Picture.Height;
for j:=0 to k do Inc(l,30);
if l >= 45 then l:=l-30;
Form1.Image11.Left:=l;
for j:=0 to k1 do Inc(t,30);
if t >= 45 then t:=t-30;
Form1.Image11.Top:=t;
Form1.Image11.Visible:=true;
mass_p2[k,k1]:=1;
mass_p2[k,k1+1]:=1;
mass_p2[k,k1+2]:=1;
mass_p2[k,k1+3]:=1;
for i1:=0 to 2 do
for j1:=0 to 5 do
begin
if (k1-1 >= 0) and (Mass_P2[k-1+i1,k1-1+j1]=0) then
if j1 <= 4 then
Mass_P2[k-1+i1,k1-1+j1]:=2;
if (k1+4 <= 9) and (Mass_P2[k-1+i1,k1-1+j1]=0) then
if j1 >= 1 then
Mass_P2[k-1+i1,k1-1+j1]:=2;
end;
end
else GoTo 1;
end;
end
else GoTo 1;
end;
Вот в принципе и все. Будут вопросы - задавай.
← →
Думкин © (2006-12-16 07:27) [25]> Sholah_Weras © (15.12.06 20:40) [24]
Это очень сильное колдунство. Вижу совмещение логики и визуализации в одном флаконе. Это однозначно 2. Даже и разбирать не буду. Извини уж. :)
← →
Думкин © (2006-12-16 07:32) [26]> 1:Randomize; //метка на рандом
То, что разобраться трудно верю.
1. Заведи уровень логики. И вынеси из него визуализацию.
2. Заведи нормальные контстанты или объект содержащий параметры.
3. Не брезгуй выносить логически связанные действия в отдельные методы(процедуры, функции) логического класса.
4. Забудь про ГОТО как про страшный сон.
5. Прочитай про Рандомайзе.
6.... Пока хватит. Для начала.
← →
Sholah_Weras © (2006-12-16 11:43) [27]Ну,я еще маленький и зеленый, главное что работает. А то, что 2 в 1 плохо. Но многого я не знаю. Буду учиться.
1. Что понимается под уровнем логики? Вся основная работа с условиями, массивом и пр-пр, без всяких form,image и прочих button?
2. А чем простые переменные плохи?
3. Знаю, что удобно но пока задача сделать так, чтоб работало.
4. Не знаю, иногода помагает. Главное все предусмотреть.
5. Читал статью. В чем кривость реализации?
А, вот еще один ламерский вопрос - как динамично создать Image, и загрузить в него картинку?
← →
Думкин © (2006-12-17 14:25) [28]> Sholah_Weras © (16.12.06 11:43) [27]
1. Создаешь отдельный класс, который вообще не умеет рисовать и не знает ни о каких кнопках. Он знает о поле , кораблях и выстрелах и умеет сообщать о попаданиях и промахах и уничтожении корабля. И может дать инофрмацию вовне или классу потомку о том где что и какое - чтобы уже рисовать можно было.
2. Класс настроек хорош, тем, что я его передаю в форму опций и получаю оттуда внося изменения, а потом он себя же и сохраняет в ини. и т.п.
3. Это не только удобно - это проще для понимания. Если некий кусок логичеки связен и верен, то я могу в этом убедиться пройдя по ссылке на метод, а если верен, то тратить потом время на несколько строк, вместо просмтора одной с толковым названием - хуже. И для сопровождения.
4. Просто моветон. В Компонентном Паскале его вообще выкинули из языка.
5. Рандомайзе достаточно вызвать один раз.
← →
Sholah_Weras © (2006-12-18 14:14) [29]Хорошо, спасибо за помощь и советы.
Теперь делаю ответные выстрелы, которые делает "компьютер." Думаю сделать несколько уровней сложности. На первом: рандомновыбирается точка и анализируется попал-не попал. Если попал то обстреливаются рядом стоящие. Второй уровень - тоже самое, но с учетом того, какой корабль может стоять в этом отрезке (на поздних стадиях игры). А третий я еще не придумал - по мере реализации предыдущих само придет. Может ест ькакие мысли?
← →
Sholah_Weras © (2006-12-18 14:48) [30]Начал я тут реализовывать алгоритмы обстрела. Захотел попробовать ввести логику (или как там правильно говорить надо?). Создал новый unit, назвал. Хочу создать класc AI, который будет содеражать только функции с процедурами нахождения нужной ячейки массива. Вот вопрос -
TAI = class (?)
Какой родительский класс выбрать? Есть специальный класс, в котором можно реализовть одну только логику?
← →
Думкин © (2006-12-18 14:52) [31]
TAI = class
← →
Piroxyline © (2006-12-18 15:41) [32]Расшифрую. Можно если ничего не написать, то будет наследоваться от TClass (если я не ошибаюсь). Можно также сделать не тип класса, а тип объекта, но там разница несущественная. Да и алгоритмы AI лучше всего делать в отдельной процедуре - тогда можно легко выложить ее в DLL и вызывать из нее (замена DLL - замена AI).
ЗЫ Кстати, правильнее Werassa ;) Ну да ладно, самому перечитать надо бы :)
← →
Sholah_Weras © (2006-12-18 16:04) [33]2 Думкин
Ага, понятно.
2 Piroxyline
Сначала хочу сделать, что все работало, а потом, по совету Думкина, создать уровень логики. И там AI и будет находится.
Не, Weras правильно, ибо позвать "Sholah Weras-sa", это как "позвать ВасЮ". В реале же он ВасЯ, и Weras :]
← →
Sholah_Weras © (2006-12-21 17:02) [34]Начал делать обработку на выстрел игрока. Жуть жутчайшая. Мало того, что надо определить в какой именно корабль попал игрок, но и Image какого кораблся надо показать, при его уничтожении. Ужас.
Думаю трудности возникли из-за того, что код в программе перемешан и замешан. Вот занимаюсь структуризацией. Посему решил ввести уровень логики. Может поможет. Если кто знает в каких статьях описывается грамотное создание этого самого уровня, то буду благодарен за предоставленную информацию. Может есть какие в кладовке примеры? (простенькие)
← →
Piroxyline © (2006-12-23 18:54) [35]Я знаю. На DelphiGFX (если он до сих пор болтается в инете) была статья "ИИ в играх". А насчет примеров - на http://code.darthman.com
Страницы: 1 вся ветка
Текущий архив: 2008.02.03;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.048 c