Jak wylosować liczbę w timerze?

Jak wylosować liczbę w timerze?
DC
  • Rejestracja:około 13 lat
  • Ostatnio:około rok
  • Postów:145
0

Witam.
Mam problem z zastosowaniem randomizera w timerze. Dajmy na to, że timer mam ustawiony na 1 sekundę. Posiadam również kod:

Kopiuj
begin
randomize;
if (SpinEdit40.Value) <= RandomRange(10, 100)
then
begin
Button8.Caption := 'Enter';
end;
end;

Kod sprawia, że co sekundę jest losowana wartość pomiędzy 10, a 100. W przypadku gdy SpinEdit40.Value wynosi 50, a wylosowana wartość wyniesie 50 => to podpis button8 zmienia się na "enter".
Chciałbym jednak by kod działał nieco inaczej, jednak nie wiem jak to zrobić. Chciałbym, by wartość nie była losowana wtedy co interval timera (w tym przypadku 1 sekunda), tylko żeby ta wartość została wylosowana raz i w momencie kiedy spinedit40 ją przekroczy (bądź będzie taki sam) po wykonaniu funkcji została wylosowana nowa wartość i tak ciągle.

Proszę o pomoc i dziękuję.

edytowany 1x, ostatnio: Riddle
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
5

Procedura Randomize powinna być wywołana tylko raz na całą sesję programu. Najlepszym miejscem na jej wywołanie jest główny plik projektu, jako pierwsza instrukcja w głównym bloku kodu.

DroniC napisał(a):

Chciałbym, by wartość nie była losowana wtedy co interval timera (w tym przypadku 1 sekunda), tylko żeby ta wartość została wylosowana raz i w momencie kiedy spinedit40 ją przekroczy (bądź będzie taki sam) po wykonaniu funkcji została wylosowana nowa wartość i tak ciągle.

Jeśli wartość ma być losowana nie co określony interwał timera, a tylko kiedy SpinEdit osiągnie konkretną wartość, to wywal ten timer i po prostu obsłuż zdarzenie SpinEdit.OnChange — w nim sprawdzaj jaka jest nowa wartość i w razie czego wylosuj sobie liczbę.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
DC
  • Rejestracja:około 13 lat
  • Ostatnio:około rok
  • Postów:145
0

Dzięki bardzo :)

Kopiuj
procedure TForm1.SpinEdit40Change(Sender: TObject);
begin
if (SpinEdit40.Value) <= RandomRange(10, 100)
then
begin
Button8.Caption := 'Enter';
end
else Button8.Caption := 'Do Not Enter';
end;

Jak zrobić, by np. SpinEdit41 miał zawsze właśnie wylosowany numer do którego powyższy kod będzie się stosować?

edytowany 3x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
0
DroniC napisał(a):

Jak zrobić, by np. SpinEdit41 miał zawsze właśnie wylosowany numer do którego powyższy kod będzie się stosować?

Nie za bardzo rozumiem jak to ma działać. Dobrze by było, gdybyś pisał proste pytania, używając programistycznej nomenklatury. Nie wiem co to znaczy, że wylosowany numer ma się stosować do powyższego kodu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
DC
  • Rejestracja:około 13 lat
  • Ostatnio:około rok
  • Postów:145
0

Powiedzmy, że SpinEdit40 jest wartością zmienną. Wychodzi na to, że bez timera - na samym OnChange nie da rady tego zrobić nie? Bo do odczytywania tej zmiennej potrzebny jest timer, lub ewentualnie wątek. Najlepiej zatem będzie zrobić timer, gdzie po prostu SpinEdit.Value := cośtam, a następnie całą resztę kodu wykonać w OnChange. Zgadza się?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
0

Jeśli liczba ma być losowana co określony czas, to potrzebujesz timera lub wątku do tego. Jeśli potrzebujesz zareagować na ustawienie w SpinEdit jakiejś wartości, za każdym razem gry ulegnie zmianie oraz natychmiastowo, to użyj zdarzenia OnChange.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
pahacfd
  • Rejestracja:około 3 lata
  • Ostatnio:5 miesięcy
  • Postów:33
0

nie wiem czy rozumiałem o co Ci chodzi ale na Moje oko o takie coś

Kopiuj
procedure TForm1.SpinEdit40Change(Sender: TObject);
var
i_random
:integer;
begin
//zmienna do trzymania wartosci random
i_random:=RandomRange(10, 100);

if (SpinEdit40.Value) <= i_random then
 begin
  Button8.Caption := 'Enter -> '+IntToStr(i_random);
  SpinEdit41.Value:=i_random;
 end else 
  begin
   Button8.Caption := 'Do Not Enter';
  end;
end;
edytowany 1x, ostatnio: pahacfd

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.