1

Bonjour,
voila j'ai un problème avec la fonction rand() (enfin je crois que ça vient de là)
J'ai commencé un démineur et je me suis rendu compte que si je répétais plusieurs fois l'étape du placement aléatoires des mines (si j'execute plusieurs fois le programmes) les résultats sont foireux et la calculatrices plante au bout d'un moment voyez plutôt

tromb Fichier joint : erreur.gif


Donc, toujours au bout de 7 fois, le programme me fait ça et la calc plante.

Voila le code source

randomize();

// Place les mines
for (ordo=0;ordo!=10; ordo++) { //Parcours les ordonnées du tableau
for (absc=0;absc!=10; absc++) { //Parcours les abscisses du tableau
if (restemine == 0) break; //Si il n'y a plus de mines mines à placer, c'est fini

if (tabl[absc][ordo]!=9) { // Si la case n'a pas de mines
RandNum = random(16);
if (RandNum >12) {
tabl[absc][ordo] = 9; // La case a mnt une mine
sprintf(s,"%d", tabl[absc][ordo]);
DrawStr(10*absc+2+(LCD_WIDTH-(10*(longueur)))/2,10*ordo+2+(LCD_HEIGHT-(10*(largeur)))/2,s,A_NORMAL); //Affiche 9 là où il y a une mines
restemine--; // Une mine en moins à placer
}
}

if (ordo==9 && absc==9) { // Si on arrive à la dernière case du tableau on replace les coor à (0;0)
ordo =0;
absc = -1;
}

}

}
// Place les mines

ngetchx();

Je n'arrive pas à savoir d'où cela vient (peut etre une erreur de mémoire vu le type d'erreur...)

PS: Peut-erte est-ce annodin mais voila ce que j'ais remarqué au niveau du menu MEM

Etat initiale de la TI ==> Je mets le programmes dans la TI ==> Au bout de 6 executions (avant le plantage)

Donc voila ce que j'obtiens respectivement

Free Ram 193904 192702 192272

History 0 0 480

2

Je ne crois pas que l'erreur se trouve dans cette partie du programme. À tout hasard, est-ce que tu utilise des variables statiques qlqpart dans ton prog ?

Bon sinon, ton algo pour placer des mines n'est pas top... tu devrais plutôt faire qlqchose comme:

for (restemine=5;restemine>0;restemine--) {
tabl[random(10)][random(10)] = 9;
}

3

et avec ça , il aura AU MAX son nb de mines.

4

merci jaif et squalyl pour ton algo qu'est beaucoup mieux que le mien.

Je vais essayer

5

l'algo c'est

pour 10 mines:
faire
x=random, y=random
tant que case_pleine(x,y)
case(x,y)=plein
fin pour

6

7

non c'est "prends de nouvelles coordonnées tant que la case choisie est pleine", sinon tu risques de mettre 2 mines au même endroit, ce qui compterait pour une.

L'algo se termine en pratique assez rapidement si on demande pas de placer trop de mines. J'ai pas calculé si il est en O(n) ou O(patate carrée) mais pour caser 10 ou 20 mines dans 100 cases ça se fait instantanément vu que le premier tirage sera presque toujours bon.

8

9

pour faire une liste mélangée de 100 éléments on fait pas comme ça, je suis totalement d'accord! cet algo marche pour de 'faibles densités'.

pour générer uneliste mélangée, on tire une simple liste d'entiers au hasard et on s'en sert pour classer celle qu'on veut mélanger oui

c'est pas le même principe.

10

11

j'avais vu ça dans un vieux topic qui demandait de trouver la méthode de génération d'une liste aléatoire la plus rapide possible sur ti68k grin (mais oui ça demande un algo de tri donc parfois bof)

12

(mais c'était en basic, donc la donne était un peu différente, si je pense au même vieux topic que toi tongue)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

13

14

Je propose ça (en pseudo-C, parce que le pseudo-langage me gonfle tongue) :

for (i = 1; i <= 10; i++)
{
	x = 0;
	y = 0;
	n = random(0, 100 - i);

	while ((n != 0) || (case[x][y] == pleine))
	{
		if (case[x][y] == vide) n--;		

		x++;
		if (x == 10)
		{
			x = 0;
			y++;	
		}	
	}

	case[x][y] = pleine;
}

Pas besoin de tri ni de liste annexe, et ça termine systématiquement (attention, pas testé).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

15

16

!call squale92
--- Call : squale92 appelé(e) sur ce topic ...

!call Ximoon
--- Call : Ximoon appelé(e) sur ce topic ...

!call Zephyr
--- Call : Zephyr appelé(e) sur ce topic ...

En voilà encore un de ces posts de merde.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17