Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 595
Réponses : 10
Type : discussion
Etat : réponses autorisées

Valeur incohérente : pourquoi?

sandro le 21/03/2012 à 15:59
Bonjour,
lors du premier tour du TI-Concours, en basic il a fallut faire un morpion.

J'ai essayé de faire une version avec IA, mais elle bug (ça encore, c'est un peu normal pour un programme non finit), mais surtout j'ai une variable (B) qui prend des valeurs qu'elle ne devrait pas pouvoir (d'après mes prédiction) prendre : quand on lance le mode 1 joueur, puis qu'on fait 1 puis (une fois que l'IA a jouée) 2 et enfin après que l'IA a joué [On] pour quitter, B vaut 3 allors que la seule commende qui devrait affecter B est un "For(B,0,2 " et ce même si au départ je donne une valeur quelconque à B.


TIC.83p :
"BASIC Code" a écrit :
:{1,1 -> L2
:ClrHome
:Output(4,5,"MORPION
:Output(5,4,"PAR SANDRO
:Pause
:StoreGDB 1
:PlotsOff
:FnOff
:CoordOff
:GridOff
:AxesOff
:ZStandard
:Lbl D
:ClrDraw
:Horizontal 10/3
:Horizontal -10/3
:Vertical 10/3
:Vertical -10/3
:ClrHome
:Disp "7!8!9","-+-+-","4!5!6","-+-+-
:Pause "1!2!3
:DelVar IMenu("JOUEURS:","2 JOUEURS",2,"1 JOUEUR",1
:Lbl 1
:1 -> I
:Lbl 2
:DispGraph
:9 -> dim(L1
:Fill(1,L1
:0 -> T
:1 -> G
:2 -> J
:While T<9G
:¦ T+1 -> T
:¦ If not(I) or fPart(.5T
:¦ Then
:¦ ¦ 2+2fPart(.5T -> J
:¦ ¦ Repeat sum(K={92,93,94,82,83,84,72,73,74
:¦ ¦ ¦ getKey -> K
:¦ ¦ End
:¦ ¦ 10fPart(.1K-.1 -> X
:¦ ¦ iPart(.1K-6 -> Y
:¦ ¦ Else
:¦ ¦
:¦ ¦ 1 -> A
:¦ ¦ 2+2fPart(.5T -> K
:¦ ¦ For(C,1,2
:¦ ¦ ¦ If C=2
:¦ ¦ ¦ 5-K -> K
:¦ ¦ ¦ For(B,0,2
:¦ ¦ ¦ ¦ If randBin(1,L2(C))AL1(1+3B)L1(2+3B)L1(3+3B)=K²
:¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ DelVar A
:¦ ¦ ¦ ¦ ¦ If 1=L(1+3B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> X
:¦ ¦ ¦ ¦ ¦ ¦ B+1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(2+3B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> X
:¦ ¦ ¦ ¦ ¦ ¦ B+1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(3+3B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> X
:¦ ¦ ¦ ¦ ¦ ¦ B+1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦
:¦ ¦ ¦ ¦ If randBin(1,L2(C))AL1(1+B)L1(4+B)L1(7+B)=K²
:¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ DelVar A
:¦ ¦ ¦ ¦ ¦ If 1=L(1+B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 1+B -> X
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(4+B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ B+1 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(7+B
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ B+1 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦
:¦ ¦ ¦ ¦ If randBin(1,L2(C))AL1(1)L1(5)L1(9)=K²
:¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ DelVar A
:¦ ¦ ¦ ¦ ¦ If 1=L(1
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(5
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(9
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ If randBin(1,L2(C))AL1(3)L1(5)L1(7)=K²
:¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ DelVar A
:¦ ¦ ¦ ¦ ¦ If 1=L(3
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(5
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 2 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ ¦ If 1=L(7
:¦ ¦ ¦ ¦ ¦ Then
:¦ ¦ ¦ ¦ ¦ ¦ 1 -> X
:¦ ¦ ¦ ¦ ¦ ¦ 3 -> Y
:¦ ¦ ¦ ¦ ¦ End
:¦ ¦ ¦ ¦ End
:¦ ¦ ¦ End
:¦ ¦ End
:¦ ¦
:¦ ¦ If A
:¦ ¦ Then
:¦ ¦ ¦ Repeat 1=L1(X+3Y-3
:¦ ¦ ¦ ¦ randInt(1,3 -> X
:¦ ¦ ¦ ¦ randInt(1,3 -> Y
:¦ ¦ ¦ End
:¦ ¦ End
:¦ ¦

:¦ End
:¦ Text(21Y-14,32X-19,sub("OX",1+2fPart(.5T),1
:¦ 2+2fPart(.5T -> L1(3Y+X-3
:¦ If sum((2+2fPart(.5T))^3={L1(1)L1(2)L1(3),L1(4)L1(5)L1(6),L1(7)L1(8)L1(9),L1(1)L1(4)L1(7),
L1(2)L1(5)L1(glasses.gif,L1(3)L1(6)L1(9),L1(1)L1(5)L1(9),L1(3)L1(5)L1(7
:¦ Then
:¦ ¦ DelVar GText(30,20,"JOUEUR ",2-2fPart(.5T)," GAGNE
:¦ ¦ Pause
:¦ End
:End
:If G
:Text(30,20,"MATCH NUL
:Menu("RECOMMENCER?","OUI",D,"NON",F
:Lbl F
:RecallGDB 1
:DelVar GDB1FnOn

Generated by SourceCoder, © 2005-2012 Cemetech


Merci d'avance pour votre aide
Sandro

EDIT : correction des bugs d'affichages
The K le 21/03/2012 à 16:52
Euh ... j'ai un peu de mal.
Tu peux supprimer tous les size et autres /size stp ? ^^'
sandro le 21/03/2012 à 17:01
désolé, c'est corrigé
The K le 21/03/2012 à 17:36
Les randBin modifieraient-ils cette valeur ?
(mais il est vrai que dans l'algo ya pas de problème enfin ...)


Je suis cependant intrigué par ton morpion : (déso d'être a moitié hs ^^') comment fonctionne ton ia ? happy.gif
(les randbin ça m'connait pas trop trop ...)
Sangohan38 le 21/03/2012 à 20:02
C'est normal qu'à la fin de ton for elle vaille 3 car ton for augmente de 1 la valeur de b avant de passer à la suite.

Sangohan38
The K le 21/03/2012 à 21:19
Si je me trompe pas ça met B+1 dans X. Donc B n'est pas modifiée. (non ?)
linkakro le 21/03/2012 à 21:25
Non la solution est celle annoncée par Sangohan38.
B prends successivement les valeur 0,1,2 pendant l'execution de la boucle puis 3 après l'execution car les For effectuent l'incrément avant le test de sortie.
sandro le 21/03/2012 à 21:26
Merci, j'avais jamais remarqué cet aspect du for ( moodforlove.gif ).
Sinon, pour les randBin( , en les tilisant de la manière randBin(1,P) , on optient on a une propabilité de P d'optenir 1 et sinon on optient 0. Si on remplace le 1 par n, dans ce cas la TI répète n fois l'opération et affiche la somme des 0 et des 1. On peut rajouter un 3ème argument : le nombre indique la dimmention de la liste à remplir par ce procédé.

Sinon, le princincipe de l'IA est :
1) la TI vérifie si elle peut gagner (C=1) en testant pour chaque ligne, colone ou diagonale s'il ne manque qu'un emplacement à la TI pour avoir la ligne complete (si oui, elle s'y met)
2) elle fait la même chose mais en cherchant des emplacements adverses (pour empecher l'adversaire de gagner.

Merci beaucoup
Sandro
linkakro le 21/03/2012 à 21:42
Pourtant nous avons eu l'occasion de discuter des For plusieurs fois sur deux forum et un tchat. winkle.gif

Je m'attendait à une IA avec plus d'options encore sachant comment tu sais parfois me surprendre. tongue.gif
Je suis surpris par l'usage des ranBin(1,...=K²) sachant que la probabilité vaut 0 ou 1.
sandro le 21/03/2012 à 21:51
javais l'intention d'en mettre plus, mais j'ai essayé de régler le bug avant d'envisager de continuer.
Sinon, la paranthèse du randBin( est refermée AVANT les listes : mon idée était de soumettre le test à une propabilité (dans mon programme de test 100% (1er ligne du programme)) affin de pouvoir régler la difficulté. En plus, au morpion, sauf fautes d'innatention, il est impossible de perdre, il est donc nécessaire de programmer une "faiblesse" de l'IA, mais qui soit variable (pas qu'estion qu'une suite de mouvements mêne sistématiquement à une victoire pour l'humain.

Sandro
linkakro le 21/03/2012 à 22:10
Effectivement, j'avais mal lu la parenthèse et donc le randBin sert bien à générer un peu d'aléatoire commandé.

Ta logique d'élaboration d'IA me convient tout-à-fait. bigmouth.gif
(j'ai fait la même chose pour le jeu des 21 alumettes. Mon IA a trois niveaux.
-dans tous les niveaux, jouer un coup gagnant si possible à la fin
-en niveau facile, jeu aléatoire
-en niveau moyen, jouer soit un coup infaillible (si possible) soit jouer aléatoirement
-en niveau difficile, jouer un coup infaillible si possible sinon aléatoire)

Pense à éditer ton premier post qui dérange la page à cause de la longue ligne de test.