Tekst wyświetlany w losowych miejscach - brak losowości

1

[właśnie chciałem poprawić text, ale trafił do kosza :/, sformatowałem kod z użyciem dołączonego programu, tagów goto nie chce na razie usuwać bo boje się że coś mi się pomiesza :D, mam nadzieję że teraz jest dobrze, jak nie to poprawię]
Wraz z kolegą, piszemy program, którego celem jest wypisywanie tekstu w losowych miejscach na ekranie, problem jest w tym, że tekst pojawia się tylko w jednym miejscu i od czasu do czasu mignie. Wiem jest błąd że i nie jest inkrementowane a pętla for zamiast sprawdzać jednocześnie x i y sprawdza tylko x, ale poprawa tego nic nie dała ^^. Gdzie popełniliśmy błąd?

program losowytekst;

uses
  Crt;

var
  x, y, i, k, f : integer;
var
  x_bylo : array [1..250] of integer;
var
  y_bylo : array [1..250] of integer;
label
  1, 2, 3, 4;
begin
  WriteLn('TEXT IN RANDOM PLACE');
  WriteLn('Authors: Robert Niemiec & Bartosz Hnat');
  WriteLn('Press [ENTER] to start...');
  ReadLn;
  i := 0;
  Randomize;
  repeat
    clrscr;
    1:
    begin
      {Losuj X}
      x := Random(480);
      x_bylo[i] := x;
      if (i <> 0) then
        goto 3;
    end;
    2:
    begin
      {Losuj Y}
      y := Random(680);
      y_bylo[i] := y;
      if (i <> 0) then
        goto 3;
    end;
    3:
    begin
      for k := 1 to 480 do
        if (x = x_bylo[k]) then
          goto 1
        else
          goto 4;
      for f := 1 to 680 do
        if (y = y_bylo[k]) then
          goto 2
        else
          goto 4;
    end;
    4:
    begin
      gotoxy(x, y);
      textcolor(Random(16) + 1);
      Write('Fuck you world');
      gotoxy(x, y);
      delay(100);
      if (keypressed = True) then
      begin
        break;
      end;
    end;
  until keypressed;
  ReadLn;
end.
0

No to po raz drugi - jeżeli to nie jest ćwiczenie z używania instrukcji GoTo, to pozbądź się ich, a wrócimy do rozmowy;

Poza tym podziel sobie kod na procedury i funkcje, a będzie o wiele czytelniejszy i łatwiej będzie Ci się w nim połapać; Teraz jest i tak nieczytelny, bo wszystko jest na kupę, a do tego te skoki do etykiet... które i tak powinny się nazywać sensowniej, a nie liczbowo...

0

Dobra, i tak już nasze dane są publiczne bo w 1 poście są również, więc usuwam goto ^^

program losowytekst;
 
uses
  Crt;
 
var
  x, y, i, k, f : integer;
begin
  WriteLn('TEXT IN RANDOM PLACE');
  WriteLn('Authors: Robert Niemiec & Bartosz Hnat');
  WriteLn('Press [ENTER] to start...');
  ReadLn;
 
  Randomize;
  repeat
    clrscr;

    begin
      {Losuj X}
      x := Random(480);
      x_bylo[i] := x;
     
    end;
    
    begin
      {Losuj Y}
      y := Random(680);
      y_bylo[i] := y;
     
    end;
  
   begin
      gotoxy(x, y);
      textcolor(Random(16) + 1);
      Write('Fuck you world');
      gotoxy(x, y);
      delay(100);
      if (keypressed = True) then
      begin
        break;
      end;
    end;
  until keypressed;
  ReadLn;
end.
0
furious programming napisał(a):

No to po raz drugi - jeżeli to nie jest ćwiczenie z używania instrukcji GoTo, to pozbądź się jej, a wrócimy do rozmowy.

To nie jest właściwie ćwiczenie tylko projekt prywatny, użyłem GoTo bo wydawało mi się że to korzystne

0

Nie usunąłem identyfikatorów tablic, które skasowałem :D

0

GoTo raczej nie jest korzystne - są przecież warunki i jest możliwość wydzielania kodu do procedur i funkcji, więc bez problemu można z nich korzystać; Poza tym masz problem tutaj:

textcolor(Random(16) + 1);

Ta instrukcja wylosuje liczbę z przedziału 1 .. 16, a kolorów jest 16, gdzie ostatni ma wartość 15 - to kolor biały; Jest jeszcze jedna wartość dla koloru, tzw. Blink, ale nie pamiętam jaką ma wartość w Turbo Pascalu; Natomiast w bibliotece standardowej dla FPC ma wartość 128;

Inna sprawa, że zmiennej x_bylo i y_bylo nie są zadeklarowany w Twoim ostatnim kodzie, więc przy próbie kompilacji dostaniesz błędy;

Wspomnę jeszcze o tym, że losujesz współrzędne z jakichś dziwnych zakresów - konsola nie posiada ani szerokości 480 znaków, ani tym bardziej wysokości 680 linii, więc to musisz poprawić; Typowy rozmiar konsoli pod WinXP to 80x25, więc z takich przedziałów powinieneś losować; Zwróć jednak uwagę, że jeżeli chodzi o współrzędną X, to podczas losowania musisz uwzględnić długość wyświetlanego łańcucha - w przeciwnym razie tekst (bardzo brzydki) będzie zawinięty do nowej linii, a tego raczej chciałbyś uniknąć.

0
furious programming napisał(a):

Poza tym podziel sobie kod na procedury i funkcje

Rozrysuje może algorytm działania każdej funkcji a potem przełożę na kod Pascala

0

Czemu nie zrobić po ludzku? To cały program:

uses Crt;

const Msg:String='Losowe miejsce';
begin
  while not keypressed do
  begin
    TextColor(1+Random(15));
    GotoXY(1+Random(79-Length(Msg)),1+Random(19));
    Write(Msg+StringOfChar(#8,Length(Msg)));
    Delay(500);
    Write(StringOfChar(' ',Length(Msg)));
  end;
end.
0
furious programming napisał(a):

GoTo raczej nie jest korzystne - są przecież warunki i jest możliwość wydzielania kodu do procedur i funkcji, więc bez problemu można z nich korzystać; Poza tym masz problem tutaj:

textcolor(Random(16) + 1);

Ta instrukcja wylosuje liczbę z przedziału 1 .. 16, a kolorów jest 16, gdzie ostatni ma wartość 15 - to kolor biały; Jest jeszcze jedna wartość dla koloru, tzw. Blink, ale nie pamiętam jaką ma wartość w Turbo Pascalu; Natomiast w bibliotece standardowej dla FPC ma wartość 128;

Inna sprawa, że zmiennej x_bylo i y_bylo nie są zadeklarowany w Twoim ostatnim kodzie, więc przy próbie kompilacji dostaniesz błędy.

Właśnie zapomniałem tych zmiennych usunąć :/
Właśnie mi kolega mówił, że jeden kolor jest czarny i to 1 dodałem aby nie wylosowało czarnego właśnie

0

Właśnie mi kolega mówił, że jeden kolor jest czarny i to 1 dodałem aby nie wylosowało czarnego właśnie

No i dobrze zrobiłeś, tyle że zapomniałeś zmniejszyć zakres przy losowaniu, aby po dodaniu tego 1 nie otrzymać wartości większej, niż maksymalna (czyli 15);

Ogólna zasada jest prosta - Random(Max - Offset) + Offset.

0

Ok spróbujemy

0

Problem rozwiązany

program losowytekst;
uses Crt;
var x,y,i,k,f: Integer;
var x_bylo: array [1..80] of Integer;
var y_bylo: array [1..25] of Integer;
label 1,2,3,4;
begin
WriteLn('TEXT IN RANDOM PLACE');
WriteLn('Authors: Robert Niemiec & Bartosz Hnat');
WriteLn('Press [ENTER] to start...');
ReadLn;
i := 0;
Randomize;
repeat
clrscr;
1:
begin
{Losuj X}
x := Random(80);
x_bylo[i] := x;
if(i <> 0) then goto 3;
end;
2:
begin
{Losuj Y}
y := Random(25);
y_bylo[i] := y;
if(i <> 0) then goto 3;
end;
3:
begin
for k := 1 to 80 do
if(x = x_bylo[k]) then goto 1 else goto 4;
for f := 1 to 25 do
if(y = y_bylo[k]) then goto 2 else goto 4;
end;
4:
begin
gotoxy(x,y);
textcolor(Random(16)+1);
Write('text');
gotoxy(x,y);
Sound(Random(5000));
delay(100);
if(keypressed = true) then
begin
NoSound;
break;
end;
end;
until keypressed;
end.

Przepraszam za brak formatowania ale piszę z komputera szkolnego ^^

0

@zimny Kot - nadal widzę wszechobecne GoTo :]

Poćwicz sobie i skróć ten kod - pozbądź się tych etykiet i sformatuj kod porządnie, bo póki co przez etykiety i brak formatowania jest bardzo nieczytelny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1