Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Морской, блин, бой.


Страницы:   1 2

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 кораблей. Начианя с самого большого, чтоб потом роблем не возникло.
Если я не понял глубину Вашей мысли, то пожалуйста, обьясните еще разок, подоходчивее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо