sprg20: moveq #5,d0 ; nombre entre 1 et 5 bsr rand add.w #1,d0 lsl.w #1,d0 ; entre 2 et 10 rts sprg2: clr.b erreur ; tire au hasard tout en intercalant les cases moveq #10,d0 ; en effet, le blus petit bateau faisant deux cases de bsr rand ; long, il ne sert à rien de tirer sur toutes les cases move.w d0,y add.w #1,y ; entre 1 et 10 bsr sprg20 move.w d0,x move.w y,d0 add.w tircte,d0 btst.b #0,d0 beq sg2 sub.w #1,x sg2: bsr sprg3 ; vérifie si le tir est valide tst.b erreur bne sprg2 clr.w rtir rts
sprg20: x = rand(5) x = x+1 x = x*2 return x sprg2: erreur = 0 y = rand(10) y = y+1 x = sprg20() y = y+tircte si y est impair: x = x-1 si case occupée: recommence rtir = 0 return
euh ben c'est ce qui m'intrigue... parce que :do { x = random ( 9 ) ; y
et :int a = random (41) ; x = a % 9 ; y = a /ça fait exactement la même chose (de façon différente, bien sûr, mais ça aboutit au même résultat)
void _main(void) { short a=0,x=0,y=0; clrscr(); while(!OSCheckBreak()) { a = random (41) * 2; x = a % 9 ; y = a / 9 ; DrawPix(x,y,A_NORMAL); ngetchx(); } }là tu appuies sur une touche pour chaque nouveau tirage
Kevin Kofler a écrit :Je dirais même qu'elle est correcte et optimale ...
La solution de bobti89 m'a l'air correcte et optimale, à condition de mettre 41 et pas 9*9/2==40 dans le random.
J'ai écrit :
[...] l'algorithme de bobti89 marchera du premier coup ... à un petit détail près.
Comme on a a = 2 * rand ( 40 ) ;, la toute dernière case, dans le coin x=y=8 (soit a == 80), ne sera jamais choisie.
Il faut donc a = 2 * rand ( 41 ) ; ...
Plus exactement, dans la parenthèse du rand, il faut arrondir à la valeur entière supérieure le résultat (Xmax * Ymax / 2) (ça existe, ceil, en C ?).
Et de manière toute aussi générale, je préciserai que la valeur 9 utilisée pour le calcul de x et y correspond en fait à Xmax (Ymax n'intervient que dans le calcul de a).
cerede2000 a écrit :Faux, tu risques de tirer la case -1 qui est en dehors de ton tableau.
hum ou alors pour randomiser cette variante a = random (41) * 2-1
Sally a écrit : [...] a = random (40) * 2 + 1; [...]C'est comme ça et pas autrement qu'il faut faire.