Apparation aléatoire d'une image [Résolu]

Signaler
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008
-
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
-
Bonjour !

J'aurais besoin d'un peu d'aide ... J'ai élaboré un code pour ma thèse en psycho (les participants doivent résoudre des problèmes) et j'ai besoin d'y ajouter une seconde tâche. J'aimerai qu'une image (un grand A en fait) apparaisse dans la fenêtre aléatoirement dans le temps et qu'elle disparaisse après l'appui sur une touche. en plus, il faudrait que je puisse récupérer le temps entre l'apparition de l'image et l'appui sur la touche.

D'avance merci beaucoup !!

alaga

9 réponses

Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
En fait, je voudrait que la frequence d'apparition soit aléatoire ...

random(11) génère aléatoirement des nombres >= 0 et < 11
autrement dit entre 0 et 10


tab : array of integer
randomFrom(tab) renvoie un numéro aléatoire pris dans tab


et un appel à randomize en entrée permet de générer des séries aléatoires.

Tu n'ai pas obligé d'utiliser le temps..tu peux te servir de la fréquence d'apparition de nombres précis dans une boucle:

var
x : integer;

begin
Randomize;
   Repeat
     x: = Random(101)
     if (x >=33) and (x <= 66) then ;// Une chance sur 3
   Affichage;     
   Until test de sortie de boucle
end;

Si ça va trop vite, tu peux mettre un sleep(temps en ms) pour ralentir la boucle.
Pour le test de sortie de boucle, c'est à voir :
frappe d'une touche spéciale, compteur etc etc..

Voilà quelques pistes et il y en a certainement beaucoup d'autres..

cantador
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
bonjour,
pas très compliqué...


Utilises les fonctions random, randomize pour la partie aléatoire.
(tu colles un label 'A' que tu rends visible ou pas selon une fréquence)
et lorque l'image apparaît tu déclenches un GetTickCount :


Start:=getTickCount; // < ici le top-départ du chrono
et sur détection appui d'une touche :
Tempo.text:=intToStr(getTickCount - Start)+' millisecondes'

voilà en gros ce qu'il y a à faire.

cantador
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008

Salut !

merci pour ta réponse mais ça reste un peu flou ...

En fait, je voudrait que la frequence d'apparition soit aléatoire ... Pour le reste je vais essayer ...

Alaga
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008

Salut !

D'abord merci pour ton aide mais j'aurais besoin (encore) d'un petit coup de pouce !

En fait, je voudrais que ma lettre apparaisse de temps en temps (et que ce temps soit de manière aléatoire) et que quand on appuie sur échap elle disparaisse. Elle doit réapparaitre après un certain temps (aléatoire aussi) ... Ainsi de suite ...

Voici mon code pour l'instant. Le problème c'est que la lettre réapparaît tout de suite. J'ai essayé avec un timer et comme tu avais noté mais :(

D'avance merci

procedure affichage;
begin
  test.lettre.visible:=true ;
  Start:=getTickCount;
end;


procedure TTest.Timer1Timer(Sender: TObject);
var x:integer;
begin
  randomize;
  begin
  for x:=0 to 1000 do
  test.Timer1.Interval :=random(x);
  affichage;
  test.labelx.Caption:=IntToStr(x);
  end;
end;


procedure TTest.FormKeyDown(Sender: TObject; var Key:word ;
  Shift: TShiftState);
begin
  if key=VK_ESCAPE then
  lettre.Visible:=false;
  tps := getTickCount - Start;
  tim:=TimeToStr(tps);
  test.tpsdt.Text:=tim;
end;

Alaga
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008

Bon, en fait, après quelques essais, ce n'était qu'une question de temps (!). Un intervalle de 1000 est insuffisant (trop rapide). Et aussi, un problème comme d'interférence :

si je ne teste que ma seconde tâche (apparition de la lettre) c'est ok mais si je fais les problèmes en même temps (ce qui est mon but). La lettre ne disparait plus quand j'appuie sur échap.

voici mon nouveau code pour la lette (ce n'est qu'une partie du code complet) :

procedure affichage;
begin
  test.lettre.visible:=true ;
  Start:=time;
end;


procedure TTest.Timer1Timer(Sender: TObject);
var x:integer;
begin
  randomize;
  begin
  x:=8000;
  test.Timer1.Interval :=random(x);
  test.labelx.Caption:=IntToStr(Timer1.Interval);
  end;
begin
  affichage;
  end;
end;


procedure TTest.FormKeyDown(Sender: TObject; var Key:word ;
  Shift: TShiftState);
begin
  if key=VK_ESCAPE then
  lettre.Visible:=false;
  tps := time - Start;
  tim:=TimeToStr(tps);
  test.tpsdt.Text:=tim;
  test.resultats.Lines.Add(tim);
end;

Help (encore) !

Merci

alaga
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008

Cette fois c'est la bonne ! avec KeyPreview = true ça marche !!

J'ai vu ça sur un forum !

Maintenant, j'ai juste un soucis de mesure du temps. J'ai un Datetime en hrs, min et sec et ce n'est pas assez précis. Je voudrais des millisecondes ....

Merci

Alaga
Messages postés
17
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
28 octobre 2008

Avec ça

DecodeTime(Time,Hour, Min, Sec, MSec);
tim:=IntToStr(Msec);

C'est bon

Bon Delphi !

Alaga
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
parfait !
@+
cantador
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
juste un truc,
tu peux aussi faire apparaître aléatoirement une lettre de l'alphabet...

cantador