Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.58 MB
Время: 0.021 c
6-1179759600
Nucer
2007-05-21 19:00
2008.02.03
Как определить, что соединение разорвано?


3-1190804341
Vazhik
2007-09-26 14:59
2008.02.03
Псевдоним БД


15-1198741568
Cj
2007-12-27 10:46
2008.02.03
Уязвимость Каспера 6.0.2.614


2-1199558731
Riply
2008-01-05 21:45
2008.02.03
Разница в вызове функций


6-1179126988
allucard
2007-05-14 11:16
2008.02.03
Как выловить Http адрес, и заблокировать доступ