[PASCAL]tab 2 wym, statki,generowanie jednomasztowców

Napisz program, w którym dana jest tablica o wymiarach (10 x 10), po uruchomieniu programu ma zostać wygenerowane pozycje statków:

10 jednomasztowców (w dalszej części ale to nie jest teraz wymagane musze mieć możliwość celowania w nie);

ofc każdy wie jak wygląda plansza do statków i wie jakie zasady panują, ale przypomnie, że żaden statek nie może się ze sobą stykać żadną częścią, tzn nawet po ukosie, czyli stawiając 1 jednomasztowiec mamy 9 pól które już nie mogą być wykorzystane

beztytuumzu.jpg

uses crt;


const

   N = 10;

var


   i, j: 1..N;


begin

clrscr;

gotoxy(15,1);

writeln('Plansza do statkow');

writeln;

   for i := 1 to N do

   begin

      for j := 1 to N do

      begin


         write('0');

      end;

      writeln;

   end;

   readln;

end.

to co wymyśliłem (na podst innego prog) to narazie czysta plansza wywołana prostymi pętelkami, właśnie tak ma wyglądać plansza, statyki mają być oznaczone ‘1’ a puste pola ‘0’

Do tego celu potrzebujesz:

dwie tablice 10x10 typu Boolean; jedna podstawowa druga pomocnicza.

W pętle na odpowiednią ilość statków …

  1. kopiujesz tablice bazowa do pomocniczej.

  2. dla każdej jedynki znajdującej się w bazowej wstawiasz dodatkowe 2…4 jedynki w tablice pomocniczej po przekątnych.

  3. zliczasz ilość zer w tablice pomocniczej i na podstawie tego generujesz liczbę losową N

  4. odliczasz w tablice pomocniczej N-tą komórkę zawierającą zero.

koniec pętli.

Owszem można to zrobić na jednej tablicę typu:

var T:array[0…99]of set of {Pusto,Statek,Okolice};

ale to wymaga większego zastanowienia się.

a jeżeli nie słyszałem ( nie miałem tego jeszcze) o tablicy Boolean?

duplikowanie tablicy miałem tylko w taki sposob, tzn bez lini brzegowych

co do zwykłego zduplikowania tablicy nie widze problemu ale czy tym sposobem tzn bez tej tablicy Boolean da sie zrobic

uses crt;


type

tab2=array[1..20,1..20] of byte;





procedure info(var n,m:byte);

begin

     clrscr;

     writeln('Program generuje i wyswietla tabilce dwuwymiarowa.');

     write('Podaj ilosc kolumn: ');readln(n);

     write('Podaj ilosc wierszy: ');readln(m);

     writeln;

end;


procedure generuj(var tab2x2:tab2; n,m:byte);


var

   i,j:byte;


begin

     randomize;

     for j:=1 to n do

     begin

          for i:=1 to m do

          begin

               tab2x2[i,j]:=random(10);

          end;

     end;

end;


procedure drukuj(tab2x2:tab2; n,m:byte);

var

   i,j:byte;

begin

     for j:=1 to m do

     begin

         for i:=1 to n do

         begin

              write(tab2x2[i,j],' ');

         end;

         writeln;

     end;

end;


procedure nowa(var bis:tab2; tab2x2:tab2; n,m:byte);

var

   i,j:byte;

begin

 for j:=1 to n do

     begin

          for i:=1 to m do

          begin

               bis[i,j]:=tab2x2[i,j];

          end;

     end;

      for j:=2 to m-1 do

     begin

          for i:=2 to n-1 do

          begin

              bis[i,j]:=(tab2x2[i-1,j]+tab2x2[i,j-1]+tab2x2[i,j+1]) div 4;

          end;

     end;

end;



var

   tab2x2,bis:tab2;

   n,m:byte;



begin

     info(n,m);

     generuj(tab2x2,n,m);

     drukuj(tab2x2,n,m);

     nowa(bis,tab2x2,n,m);

     writeln;

     drukuj(bis,n,m);

     readln;

end.

Boolean to typ który przyjmuje wartości jedynie true lub false;

Możesz to zrobić nawet na typie extended, z tym że potrzebujesz informacje tylko - tak czy nie - dla każdego pola.

tb:array[1…20,1…20] of boolean;

PS. Nie rozumiem co ma wspólnego podany w ostatnim poście kod do tego tematu?

kopiujesz tablice tzn duplikujesz to miał ten kod do tego ;d, z resztą nie ważne

Tak a propos to nie musisz tu stosować tablicy dwuwymiarowej. Wystarczy jednowymiarowa.

A jeżeli rozmiar jest konkretnie 10x10 to zamiast dwóch tablic wystarczą 4 zmienne typu Int64 :smiley:

trochę stary temat ale co tam nie będę otwierać nowego. mam pytanko jak zadeklarować taki jednomasztowiec? jako typ czy jako co? (i jak ewentualny 2 masztowiec?)

metod jest mnóstwo:

np: jednomasztowiec to jeden bit w 16 bitowej liczbie z dziesięcioelementowej tablice dwumasztowieć odpowiednio dwa bity.

lub: trzy liczby - jednomasztowieć x,y,0 ; dwumasztowiec x,y,1 - poziomy; lub x,y,-1 - pionowy.

Pomyśl przez chwilkę a znajdziesz jeszcze z 20 różnych możliwości.

Myślenie nie boli.

no okej to rozkminie, a jak rozpykać to żeby losowo (gdziekolwiek w tablicy spęłniając warunki w.w) były generowane te jednomasztowce tzn bez udziału usera. Czy da się to funkcją randomize zrobić? nakieruj mnie jakoś

Do tymczasowej tablicy współrzędnych wpisujesz listę wciąż dozwolonych pozycji, losujesz jedną z nich.

Powtarzasz tyle razy ile trzeba.