![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Морской, блин, бой.
Sholah_Weras © (2006-10-25 18:58:00)Здравствуйте!
Вот давеча решил забабахать морской бой. Решил вот как сделать - в потоке постоянно обновляются координаты Image'в (которые по совместительству и являются кораблями), вычисляется место в массиве, где должно находится начало корабля, определяется тип корабля и на оснавании типа заполняются еще несколько ячеек массива. Примнр: есть трехпалубник, координаты 15-15. В массиве [1,1] выставляется единица. Тип корабля 3, поворот=false, занчит в [1,2] и [1,3] выставляется единица:
1110000000
0000000000
0000000000
-----------
Только вот что-то не работает. Замучился выяснять ошибку. Может неверен сам подход? Может кто сталкивлся с такой проблемой?
Piroxyline (2006-12-23 18:54:00) [1]Я знаю. На DelphiGFX (если он до сих пор болтается в инете) была статья "ИИ в играх". А насчет примеров - на http://code.darthman.com
Sholah_Weras (2006-12-21 17:02:00) [2]Начал делать обработку на выстрел игрока. Жуть жутчайшая. Мало того, что надо определить в какой именно корабль попал игрок, но и Image какого кораблся надо показать, при его уничтожении. Ужас.
Думаю трудности возникли из-за того, что код в программе перемешан и замешан. Вот занимаюсь структуризацией. Посему решил ввести уровень логики. Может поможет. Если кто знает в каких статьях описывается грамотное создание этого самого уровня, то буду благодарен за предоставленную информацию. Может есть какие в кладовке примеры? (простенькие)
Sholah_Weras (2006-12-18 16:04:00) [3]2 Думкин
Ага, понятно.
2 Piroxyline
Сначала хочу сделать, что все работало, а потом, по совету Думкина, создать уровень логики. И там AI и будет находится.
Не, Weras правильно, ибо позвать "Sholah Weras-sa", это как "позвать ВасЮ". В реале же он ВасЯ, и Weras :]
Piroxyline (2006-12-18 15:41:00) [4]Расшифрую. Можно если ничего не написать, то будет наследоваться от TClass (если я не ошибаюсь). Можно также сделать не тип класса, а тип объекта, но там разница несущественная. Да и алгоритмы AI лучше всего делать в отдельной процедуре - тогда можно легко выложить ее в DLL и вызывать из нее (замена DLL - замена AI).
ЗЫ Кстати, правильнее Werassa ;) Ну да ладно, самому перечитать надо бы :)
Думкин (2006-12-18 14:52:00) [5]
TAI = class
Sholah_Weras (2006-12-18 14:48:00) [6]Начал я тут реализовывать алгоритмы обстрела. Захотел попробовать ввести логику (или как там правильно говорить надо?). Создал новый unit, назвал. Хочу создать класc AI, который будет содеражать только функции с процедурами нахождения нужной ячейки массива. Вот вопрос -
TAI = class (?)
Какой родительский класс выбрать? Есть специальный класс, в котором можно реализовть одну только логику?
Sholah_Weras (2006-12-18 14:14:00) [7]Хорошо, спасибо за помощь и советы.
Теперь делаю ответные выстрелы, которые делает "компьютер." Думаю сделать несколько уровней сложности. На первом: рандомновыбирается точка и анализируется попал-не попал. Если попал то обстреливаются рядом стоящие. Второй уровень - тоже самое, но с учетом того, какой корабль может стоять в этом отрезке (на поздних стадиях игры). А третий я еще не придумал - по мере реализации предыдущих само придет. Может ест ькакие мысли?
Думкин (2006-12-17 14:25:00) [8]> Sholah_Weras © (16.12.06 11:43) [27]
1. Создаешь отдельный класс, который вообще не умеет рисовать и не знает ни о каких кнопках. Он знает о поле , кораблях и выстрелах и умеет сообщать о попаданиях и промахах и уничтожении корабля. И может дать инофрмацию вовне или классу потомку о том где что и какое - чтобы уже рисовать можно было.
2. Класс настроек хорош, тем, что я его передаю в форму опций и получаю оттуда внося изменения, а потом он себя же и сохраняет в ини. и т.п.
3. Это не только удобно - это проще для понимания. Если некий кусок логичеки связен и верен, то я могу в этом убедиться пройдя по ссылке на метод, а если верен, то тратить потом время на несколько строк, вместо просмтора одной с толковым названием - хуже. И для сопровождения.
4. Просто моветон. В Компонентном Паскале его вообще выкинули из языка.
5. Рандомайзе достаточно вызвать один раз.
Sholah_Weras (2006-12-16 11:43:00) [9]Ну,я еще маленький и зеленый, главное что работает. А то, что 2 в 1 плохо. Но многого я не знаю. Буду учиться.
1. Что понимается под уровнем логики? Вся основная работа с условиями, массивом и пр-пр, без всяких form,image и прочих button?
2. А чем простые переменные плохи?
3. Знаю, что удобно но пока задача сделать так, чтоб работало.
4. Не знаю, иногода помагает. Главное все предусмотреть.
5. Читал статью. В чем кривость реализации?
А, вот еще один ламерский вопрос - как динамично создать Image, и загрузить в него картинку?
Думкин (2006-12-16 07:32:00) [10]> 1:Randomize; //метка на рандом
То, что разобраться трудно верю.
1. Заведи уровень логики. И вынеси из него визуализацию.
2. Заведи нормальные контстанты или объект содержащий параметры.
3. Не брезгуй выносить логически связанные действия в отдельные методы(процедуры, функции) логического класса.
4. Забудь про ГОТО как про страшный сон.
5. Прочитай про Рандомайзе.
6.... Пока хватит. Для начала.
Думкин (2006-12-16 07:27:00) [11]> Sholah_Weras © (15.12.06 20:40) [24]
Это очень сильное колдунство. Вижу совмещение логики и визуализации в одном флаконе. Это однозначно 2. Даже и разбирать не буду. Извини уж. :)
Sholah_Weras (2006-12-15 20:40:00) [12]Боюсь код будет слишком сложен для тебя (не имеется ввиду твои интеллектуальные способности). Т.к. разобраться внем подчас трудно и мне.
Но приведу кусок:
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-15 19:29:00) [13]
> Sholah_Weras © (14.12.06 20:40) [22]
> Реализовал расстановку кораблей случайным образом. Следующий
> шаг - обстрелы.
Я шуток тоже не понимаю, а посему докажи, что расстрановка случайная.
Sholah_Weras (2006-12-14 20:40:00) [14]Реализовал расстановку кораблей случайным образом. Следующий шаг - обстрелы.
Sholah_Weras (2006-12-13 21:21:00) [15]> Думкин
Шутки можно понимать, и можно не понимать. Так же шутка может быть уместной и не очень.
Думкин (2006-12-13 11:02:00) [16]
> Sholah_Weras © (13.12.06 08:24) [19]
Вот я и не злоупотребляю. А тот кто не понимает шуток - на кого похож?
Sholah_Weras (2006-12-13 08:24:00) [17]> Думкин
Где-то у какого-то человека прочитал в инфе такую фразу: "Человек, котороый злоупотребляет смайлами, похож на жизнерадостного идиота."
> Наиль
Что значит "зоны потенциального риска"?
Думкин (2006-12-13 06:26:00) [18]
> Sholah_Weras © (12.12.06 21:43) [16]
А понял. Тебе одного смайла мало. Скажи сколько - я проставлю.
Наиль (2006-12-12 21:58:00) [19]> Что-т оя Вас не допонял. Я имелл ввиду, что случайным образом
> выбирается клетка поля, потом путем многих проверок убеждаюсь,
> что данный корабль в данном положении (повернут или нет)
> можно разместить. И так все 10 кораблей. Начианя с самого
> большого, чтоб потом роблем не возникло.
> Если я не понял глубину Вашей мысли, то пожалуйста, обьясните
> еще разок, подоходчивее.
У Думкина юмор такой: использовать народную примету в качестве основы для искусственого интелекта.
Имеется ввиду, что нужно произвести обстрел поля до того, как на нём раставить корабли, чтобы выявить зоны потенциального риска.
Sholah_Weras (2006-12-12 21:43:00) [20]2 Думкин
Что-т оя Вас не допонял. Я имелл ввиду, что случайным образом выбирается клетка поля, потом путем многих проверок убеждаюсь, что данный корабль в данном положении (повернут или нет) можно разместить. И так все 10 кораблей. Начианя с самого большого, чтоб потом роблем не возникло.
Если я не понял глубину Вашей мысли, то пожалуйста, обьясните еще разок, подоходчивее.