Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

Морской, блин, бой.   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.142 c
2-1200053064
Farel
2008-01-11 15:04
2008.02.03
Подсети


15-1198929277
boa_kaa
2007-12-29 14:54
2008.02.03
Фиксите баги!


8-1173067347
musulman
2007-03-05 07:02
2008.02.03
Верстка.


4-1181927957
=BuckLr=
2007-06-15 21:19
2008.02.03
Посыл клав. события - помогите переделать процедуру


2-1200037867
Washington
2008-01-11 10:51
2008.02.03
Работа с DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский