
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

faudrait réduire ton y modulo 10 (enfin avec le décalage de 1)
)
(et puisque tu dis qu'il y a une boucle, poste le code de la boucle en entier ^^)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)
, mais ça change juste que sinon la dernière case ne peut pas être choisie et donc ça n'explique rien



... arrête de raconter n'importe quoi SANS POSTER TON CODE parce que l'algo de bobti89 EST correct (au problème près du 40/41), donc si ça ne fait pas ce que tu veux ça ne vient pas de là et comment veux-tu qu'on comprenne le problème si on n'a pas le code ???
, et maintenant tu dis que ça remplit la moitié haute du plateau alors que ce code ne fait que tirer UNE case ; autrement dit tu parles de ce que fait ta fonction *entière* mais nous on la connaît pas ta fonction, on connaît juste les 3 lignes de code qu'on t'a filées !! donc ça ne veut rien dire pour nous.
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.