Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2014, 18:30   #1
Murfik97
Пользователь
 
Регистрация: 17.10.2013
Сообщений: 30
По умолчанию помощь в доработке кода на делфи

Я сделал практически доконца игру "морской бой", решил писать сам так как уже готовые исходники меня не вдохновили своим здоровым неразобраным и не совсем понятным кодом =). В чем возникла трудность:1)У меня есть идея и даже бесплодные попытки с помощью radiobutton через MouseDown ввести самостоятельно корабль в поле(image(через canvas)), не совсем все там получилось , мне нужна помощь доработать чтоб я сам мог ввести все корабли, а так пока я прописал 4 способа растоновки, выбираю 1 из 4 с помощью радиобатона и начинаю играть с компом.
2)вторая проблема заключается в следущем:на данный момент ПК стреляет рандомом х и у, сейчас я создал отдельную процедуру для того чтоб при попадании компьютер обстрелял вокруг раненного корабля, писал следущим макаром:
Код:
Procedure TForm1.Strategia;
Var
  x, y : integer;
begin
 if FFLAG=False then
 begin
If  P1[x,y]=20 Then
Begin
       if P1[x+1,y]=2 then
       P1[x+1,y]:=20; 

       if  P1[x-1,y]=2 then
        P1[x-1,y]:=20;

      if P1[x,y-1]=2 then
        P1[x,y-1]:=20;

         if P1[x,y+1]=2 then
          P1[x,y+1]:=20;
2-мой корабль, 20-убитый корабль, P1-массив из процедуры прорисовки поля на Image(Pole1).

Пока эти два момента пахать не сильно хотят, а остольное давольно неплохо прописал и недурно работает, хотя отдельных массивов для каждого вида кораблей нет, все проходит на уровне: 4 палубный: это как 4 однопалубных тока вместе, но надеюсь вы поняли.

Кто может помочь разобраться\помочь доделать могу скинуть код текстом либо даже всю прогу на файлообменик и скинуть ссылочку

Заранее приогромнейшее спасибо....

Последний раз редактировалось Stilet; 12.06.2014 в 19:40.
Murfik97 вне форума Ответить с цитированием
Старый 12.06.2014, 18:48   #2
Murfik97
Пользователь
 
Регистрация: 17.10.2013
Сообщений: 30
По умолчанию

Ну вот собствеено код:
Код:
type

  TPole = Array [1..10, 1..10] Of Byte;
  TForm1 = class(TForm)
......
Procedure PrintPole(Pole : TImage; P : TPole);
    // Бот
    Procedure Bot;
    Procedure Strategia;

var
  Form1: TForm1;
   // Игровое поле P1 - поле игрока. P2 - поле компа.
  // 1 - выстрел. 2 - корабль мой 20 -убитый. 3 - корабль врага.
  P1, P2 , P3 : TPole;
  P1Win, P2Win : Integer; // отслеживание выйгрыша
  Popal : Boolean;
   Mis : Boolean;
  TXT: TextFile;
  PATH:array[1..3] of String;
  i,j:integer;
  FFLAG: Boolean;



Procedure TForm1.Bot;
Var
  x, y : integer;
Begin

  Mis:=true;
  Randomize;
    Repeat
      x := Random(10) + 1;
      y := Random(10) + 1;
    Until (P1[x,y] <> 1) And (P1[x,y] <> 20);
 
  If (P1[x,y] <> 1) And (P1[x,y] <> 2) Then P1[x,y] := 1;
  If P1[x,y] = 2 Then Begin
  FFLAG:=False;
    P1[x,y] := 20;
    strategia;

    Mis:=false;
    P2Win := P2Win + 1;
end;
PrintPole(Pole1, P1);
If Mis= False then bot;
end;


Procedure TForm1.PrintPole(Pole : TImage; P : TPole);
Var
  i, x, y : Integer;
Begin
  Pole.Canvas.Brush.Style := bsSolid;
  Pole.Canvas.Brush.Color :=clWhite;
  Pole.Canvas.Rectangle(0,0,200,200);

  For i := 1 To 10 Do
    Begin
      Pole.Canvas.MoveTo(i * 20, 0);
      Pole.Canvas.LineTo(i * 20, 200);
      Pole.Canvas.MoveTo(0, i * 20);
      Pole.Canvas.LineTo(200, i * 20);
    End;

  For x := 1 To 10 Do
    Begin
      For y := 1 To 10 Do
        Begin
          If P[x, y] = 1 Then Begin 
            Pole.Canvas.Brush.Style := bsSolid;
            Pole.Canvas.Brush.Color := clBlue;
            Pole.Canvas.Ellipse((x-1) * 20 + 4, (y-1) * 20 + 4, (x-1) * 20 + 16, (y-1) * 20 + 16);
        End;
      
          If IntToStr(P[x, y])[1] = '3' Then Continue;
          If IntToStr(P[x, y])[1] = '2' Then Begin
            Pole.Canvas.Brush.Style := bsSolid;
            Pole.Canvas.Brush.Color := clRed;
            Pole.Canvas.Rectangle((x-1) * 20, (y-1) * 20, (x-1) * 20 + 21, (y-1) * 20 + 21);

           { If P[x, y] = 2 Then Begin
            Pole.Canvas.Brush.Style := bsSolid;
            Pole.Canvas.Brush.Color := clgreen;
            Pole.Canvas.Rectangle((x-1) * 20, (y-1) * 20, (x-1) * 20 + 21, (y-1) * 20 + 21);}
            if P[x,y] = 4 then begin
           // P[x,y]:=2;
            P[x+1,y]:=2;
            P[x+2,y]:=2;
            P[x+3,y]:=2;

        End;
          If IntToStr(P[x, y])[2] = '0' Then Begin
            Pole.Canvas.MoveTo((x-1) * 20 , (y-1) * 20);
            Pole.Canvas.LineTo((x-1) * 20 + 20, (y-1) * 20 + 20);
            Pole.Canvas.MoveTo((x-1) * 20 + 20 , (y-1) * 20);
            Pole.Canvas.LineTo((x-1) * 20, (y-1) * 20 + 20);
                                             End;
  End;
End;

If P1Win = 20 Then Begin ShowMessage('); Application.Terminate; End;
If P2Win = 20 Then Begin ShowMessage(''); Application.Terminate; End;
End;
end;

procedure TForm1.Pole2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  i : Integer;
  Mis : Boolean;
Begin
  For i := 0 To 9 Do
    If (x >= 20 * i) And (x <= 20 + i * 20) Then
      Begin
        x := i + 1;
          Break;
      End;
  For i := 0 To 9 Do
    If (y >= 20 * i) And (y <= 20 + i * 20) Then
      Begin
        y := i + 1;
          Break;
      End; 
  If (P2[x,y] = 1) Or (P2[x,y] = 20) Then Begin
    ShowMessage('');
    Mis := True;
                                          End;

  If (P2[x,y] <> 1) And (P2[x,y] <> 3) And (P2[x,y] <> 20) Then P2[x,y] := 1;
  If P2[x,y] = 3 Then Begin
    P2[x,y] := 20;
    Mis:= True;
    P1Win := P1Win + 1;
                      End;
  If Mis= False Then Bot;

end;




procedure TForm1.Rb1Click(Sender: TObject);
begin
 For i:=1 to 10 do   
  for j:=1 to 10 do
    begin
      p1[i,j]:=0;
      p2[i,j]:=0;
  BitBtn1.Visible:=True;
  P1[8,2] := 2;
  P1[4,3] := 2;
  P1[6,6] := 2;
  P1[3,7] := 2;
  P1[1,1] := 2; P1[1,2] := 2;
  P1[1,10] := 2; P1[2,10] := 2;
  P1[4,10] := 2; P1[5,10] := 2;
  P1[1,4] := 2; P1[1,5] := 2; P1[1,6] := 2;
  P1[10,1] := 2; P1[10,2] := 2; P1[10,3] := 2;
  P1[10,7] := 2; P1[10,8] := 2; P1[10,9] := 2; P1[10,10] := 2;
  PrintPole(Pole1, P1);
end;
end;
//и еще 3 такого типа при нажатии на радиобатон уже сразу в массив вбиваются корабли

Procedure TForm1.Strategia;
Var
  x, y : integer;
begin
 if FFLAG=False then
 begin
If  P1[x,y]=20 Then
Begin
       if P1[x+1,y]=2 then
       P1[x+1,y]:=20; //and if P1[x,y]=P1[1,10]=20 and if P1[x,y]=P1[1,10]=20 then 

if  P1[x-1,y]=2 then
        P1[x-1,y]:=20;
if P1[x,y-1]=2 then
        P1[x,y-1]:=20;

if P1[x,y+1]=2 then
          P1[x,y+1]:=20;

end;
end;
end.
Murfik97 вне форума Ответить с цитированием
Старый 12.06.2014, 18:51   #3
Murfik97
Пользователь
 
Регистрация: 17.10.2013
Сообщений: 30
По умолчанию

я туда не добавил ток рандомировние возможных вариантов растановки компа, свои заслэшаные(/) попытки решение 2 перечисленных выше проблем и всякую декоративную мелочь, если вы можите помочь ичтот не понятно в моем коде, спрашивайте, я уже с этим кодом задолбался =)
Murfik97 вне форума Ответить с цитированием
Старый 12.06.2014, 19:32   #4
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

прошу прощения за оффтоп, но паскаль такой жесткий для глаз, что не читается. И магические числа в коде, особенно
casekey вне форума Ответить с цитированием
Старый 12.06.2014, 21:04   #5
Murfik97
Пользователь
 
Регистрация: 17.10.2013
Сообщений: 30
По умолчанию

это моя погрешность, достаточно грамоздки код, за всем не уследиь =)
Murfik97 вне форума Ответить с цитированием
Старый 13.06.2014, 18:19   #6
Murfik97
Пользователь
 
Регистрация: 17.10.2013
Сообщений: 30
По умолчанию

Вообщем самостоятельное расстовление я сделал, правда осталось пару недочетов, но суть в том что работает, осталось ток допариться с интеллектом пк
Murfik97 вне форума Ответить с цитированием
Старый 13.06.2014, 22:44   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Виден настрой и усердие, что похвально.
Но вот реализация хромает ввиду малого опыта.
Я бы посоветовал выложить проект архивом и указать, какие Вы задачи планируете решить, как Вы их пробовали решать, с какими проблемами столкнулись.

Пока могу посоветовать только общего плана моменты - разделение логики и отображения, взаимодействия с пользователем. Выделение и разбиение на подпрограммы, использование структур (классов). Задействовать константы, говорящие имена, возможно ввести enum'ы
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в доработке программы. Паскаль. Файлы Тетрадь Помощь студентам 7 26.04.2014 20:49
Нужна помощь в исправлении кода #С serzmerz Помощь студентам 5 14.11.2013 04:05
Необходима помощь в доработке программы... hen Помощь студентам 3 02.06.2009 15:37
Нужна помощь в написании кода Михаил Юрьевич Общие вопросы Delphi 2 27.12.2007 09:32