игра Морской бой

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем hqpz, 6 дек 2009.

Статус темы:
Закрыта.
  1. hqpz

    hqpz Гость

    Всем привет. Буду краток. Я плохо знаю Delphi (пока плохо), очень стараюсь его понять. но дело в том что у меня курсовая на тему "морской бой". Я ее сделал но криво. Я не знаю как мне сделать рандомную расстановку корабликов =( Помогите плиз, очень прошу. Мне срочно. Вот ICQ 478166498 или почта Petr007_91@mail.ru. Или могу выложить код. Буду очень благодарен. (если надо заплачу)
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Код в студию..
     
  3. hqpz

    hqpz Гость

    Код (Text):
    Unit Unit1;

    Interface

    Uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls;

    Type
    TPole = Array [1..10, 1..10] Of Byte;
    TForm1 = Class(TForm)
    Pole1: TImage;
    Pole2: TImage;
    procedure Pole2MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    Private
    { Private declarations }
    Public
    { Public declarations }
    // процедура отрисовки поля.
    Procedure PrintPole(Pole : TImage; P : TPole);
    // Бот
    Procedure Bot;
    End;


    Var
    Form1: TForm1;
    // игровое поле 1 - поле игрока. 2 - пполе врага.
    // 1 - выстрел. 2 -корабль 20 - мертвый корабль. 3 - корабль врага.
    P1, P2 : TPole;
    P1Win, P2Win : Integer; // отслеживаем выигрыш.


    Implementation


    {$R *.dfm}


    // бот
    Procedure TForm1.Bot;
    Var
    x, y : integer;
    Begin
    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
    P1[x,y] := 20;
    P2Win := P2Win + 1;
    End;
    // отрисуем наше поле
    PrintPole(Pole1, P1);
    End;



    // процедура отрисовки поля
    // Pole - компонент TImage на котором надо рисовать
    // P - массив, который надо отрисовать
    Procedure TForm1.PrintPole(Pole : TImage; P : TPole);
    Var
    i, x, y : Integer;
    Begin
    // заливка цветом "вода".
    Pole.Canvas.Brush.Style := bsSolid;
    Pole.Canvas.Brush.Color := RGB(200, 200, 200);
    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 := RGB(0, 0, 0);
    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 := RGB(200, 5, 5);
    Pole.Canvas.Rectangle((x-1) * 20, (y-1) * 20, (x-1) * 20 + 21, (y-1) * 20 + 21);
    End;
    If IntToStr(P[x, y])[2] = '0' Then Begin // рисуем мертвые части корабля
    Pole.Canvas.Brush.Color := RGB(0, 0, 0);
    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;



    // процедура обработки целчка по вражескому полю
    Procedure TForm1.Pole2MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    Var
    i : Integer;
    Mis : Boolean;
    Begin
    // определим чему равен x.
    For i := 0 To 9 Do
    If (x >= 20 * i) And (x <= 20 + i * 20) Then
    Begin
    x := i + 1;
    Break;
    End;
    // определим чему равен y.
    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;
    P1Win := P1Win + 1;
    End;
    // Оотрисуем поле врага
    PrintPole(Pole2, P2);
    // заставим бота ответить нам (если мы не промахнулись).
    If Mis = False Then Bot;
    End;



    // при создании формы
    Procedure TForm1.FormCreate(Sender: TObject);
    Begin
    //заполним массив (сделаем вид игры)
    // наше поле
    // рисуем пару кораблей
    P1[8,8] := 2;
    P1[7,1] := 2;
    P1[7,10] := 2;
    P1[6,10] := 2;
    P1[5,5] := 2; P1[5,6] := 2;
    P1[8,3] := 2; P1[9,3] := 2;
    P1[4,8] := 2; P1[5,8] := 2;
    P1[3,3] := 2; P1[4,3] := 2; P1[5,3] := 2;
    P1[2,7] := 2; P1[2,8] := 2; P1[2,9] := 2;
    P1[1,1] := 2; P1[1,2] := 2; P1[1,3] := 2; P1[1,4] := 2;
    // поле врага
    // нарисуем пару кораблей
    P2[1,1] := 3;
    P2[10,1] := 3;
    P2[1,8] := 3;
    P2[8,5] := 3;
    P2[6,6] := 3; P2[6,7] := 3;
    P2[9,9] := 3; P2[9,10] := 3;
    P2[9,7] := 3; P2[10,7] := 3;
    P2[5,2] := 3; P2[6,2] := 3; P2[7,2] := 3;
    P2[3,10] := 3; P2[4,10] := 3; P2[5,10] := 3;
    P2[3,3] := 3; P2[3,4] := 3; P2[3,5] := 3; P2[3,6] := 3;
    // заставим отрисовать поля
    PrintPole(Pole1, P1);
    PrintPole(Pole2, P2);
    End;

    End.
    Добавлено: если кто знает как сделать рандомную расстановку корабликов, то желательно тоже с комментариями пришлите код =), а то я еще понять хочу. =)
    <table valign="top" style='margin:0;width:100%;border:1px dashed red;'>[tr]<td align='middle' bgcolor='#ff6060' valign='top' width='1%'>
    <FONT color='#ffffff' size='+3'> ! </font>
    </td><td align="midle" valign='top' style='background:#fff;'>Еще один раз так ужасно оформишь пост - получишь молчанку на неделю. Vital</td>[/tr]</table>
     
  4. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    ОМГ!!! А что мешает рандомом решать в каком поле размещать корабль? т.е. генерируешь 2 числа 1..10 - это твои х,y. В это место и ставишь корабль. Только нужно проверять можно ли его туда ставить по правилам(т.е. в клетка рядом должна быть пустой). И так заполняешь для 1х,2х.. и т.д.
     
  5. hqpz

    hqpz Гость

    Сори за косяк =( просто первый раз по форумам пришлось лазить, Так все сам делал. Да просто я не знаю как это прописать. пробовал но чтото не получается толи я тупой, толи руки не из того места растут =(((
     
  6. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Эмм.. Судя по коду - как сгенерировать случайное число вы знаете.. В остальном - не вижу проблемы.. Вы хоть начните.. Подскажу по ходу. Ну или 20$ и сделаю=)
     
  7. hqpz

    hqpz Гость

    Хех =) За 20$ я могу заказать как и мои друзья вместе с хорошим кодом и документацией готовую курсовую работу =))) просто хотел сам сделать =) . Ну короч я подумаю над предложением )))))))))
     
  8. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Как-то дешевые расценки у вас.. Впрочем хз, я никогда не интересовался.
    Хорошее начинание. Учитывая что там работы на 3 минуты..
    Вместо вот этого в цикле генерируете 2 числа, и ставите в положение(Если можно) P1[x,y] корабль.
    Потом так же и для P2..
     
  9. hqpz

    hqpz Гость

    Дело в том что я пробовал таким способом делать. Бывают такие случаи что кораблик например 4-х клеточный залезает на поле противника или просто одна или 2 клетки переносятся на другую строчку. Пробовал задавать условия, всё тоже самое происходило. Но всё же попробую еще раз.
     
  10. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Вот и попробуйте еще)
     
  11. hqpz

    hqpz Гость

    Всё тоже самое. Как бы я не писал условия он их не соблюдает, кораблик все равно продолжает разделяться( некоторые клеточки могут переноситься на другую строчку ) =(
     
  12. hqpz

    hqpz Гость

    Слушай, можешь написать код для постановки 4-х клеточного кораблика вместе с условием. Чтобы он не вылезал за границы. А то у меня как ни делаю всегда вылезает куда нить, или за пределы, или с другой стороны поля вылезает клеточка, или вообще на поле противника залезает =( Помоги =( Курсач на след неделе сдавать ((((((((
     
  13. hqpz

    hqpz Гость

    Ну что, можешь помочь?
     
  14. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Нет, спасибо.
     
  15. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Если у тебя коробли не поварачиваютса то попоробуй сделать так:
    1. Генериш х или y ето будет точка отвечающая за положение первой клетки коробля пусь будет к примеру xpos или ypos;
    2. Ну а потом :
    Код (Text):
    //Если по вертикали
    if pole.х-(размер коробля)<xpos Then повторяем генерацию xpos;
    //если по горизонтали
    if pole.y-(размер коробля)<ypos Then повторяем генерацию ypos;
    или

    Код (Text):
    repeat
    xpos:=random(размер поля);
    until pole.х-(размер коробля)>xpos
    //не забудь дописать чтоб корабли не налазили друг на друга
    а вобше юзай исходники один есть тут http://www.delphisources.ru/pages/sources/...sea_battle.html
     
  16. hqpz

    hqpz Гость

    Спасибо за совет. Щас попробую
     
  17. isqoff

    isqoff Гость

    Код (Delphi):
    type
    Pole = array [-1..10,-1..10] of integer;
    var
    A, B: Pole;

    procedure Rasstanovka(z:integer; var D:Pole);
    var i,ok,x,y,poz : integer;
    Begin
    poz := Random (2);
    IF (poz = 0) THEN
    repeat
    ok := 0;
    x := Random(10);
    y := Random(10);
    if y > 9-z then continue;
    for i := 0 to z do
    if (D[x,y+i] = 0)and(D[x,y+i-1] = 0)and(D[x+1,y+i-1] = 0)and(D[x+1,y+i] = 0)
    and (D[x+1,y+i+1] = 0)and(D[x,y+i+1] = 0)and(D[x-1,y+i+1] = 0)
    and (D[x-1,y+i] = 0)and(D[x-1,y+i-1] = 0)
    then ok := ok + 1;
    if ok = z+1 then begin for i := 0 to z do D[x,y+i] := z+1; exit; end;
    until false;

    IF (poz = 1)THEN
    repeat
    ok := 0;
    x := Random(10);
    y := Random(10);
    if x > 9-z then continue;
    for i := 0 to z do
    if (D[x+i,y] = 0)and(D[x+i,y-1] = 0)and(D[x+i+1,y-1] = 0)and((D[x+i+1,y] = 0))
    and(D[x+i+1,y+1] = 0)and(D[x+i,y+1] = 0)and(D[x+i-1,y+1] = 0)
    and(D[x+i-1,y] = 0)and(D[x+i-1,y-1] = 0)
    then ok := ok + 1;
    if ok = z+1 then begin for i := 0 to z do D[x+i,y] := z+1; exit; end;
    until false;

    End;

    ... вроде универсальной процедуры на любое количество палуб-кораблей :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей