dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012
-
30 oct. 2007 à 15:13
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
1 nov. 2007 à 15:11
Salut tout le monde,
Voila j ai un pt problème avec un jeu qui se nomme OXO...
En fait le code ci-dessous est une partie d'un algo de vérification du joueur gagnant la partie. J'utilise un tableau de 8 case de type TColor dans systeme MVC... Ce code est mis dans mon modele :
function SayWin(player:TColor):boolean;
var cpt,ctl,i:integer;
begin
ctl:=0;
While(ctl<>8)or(cpt<>3)do begin
cpt:=0;
for i:=1 to 3 do begin //verif verticale
if (tab[ctl]=player) then
inc(cpt);
inc(ctl);
end;
end;
if (cpt=3)then
result:=true
else result:=false;
end;
En fait quand j execute et que je clique sur une des cases du DrawGrid un message EaccesViolation apparait en rapport avec une adresse mémoire.
Le probleme apparemment se situe au nv de cette condition "if (tab[ctl]=player) then"
Pt présision j appelle cette fonction via mon controleur donnant la couleur courante.
Je vs remercie d'avance pour votre aide...
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 31 oct. 2007 à 11:20
Bonjour,
for i:= 1 to 3 do
begin
if tab[ctl] = player then
cpt := cpt + 1;
ctl := ctl + 1;
end;
Dans ta boucle for, ctl dépasse 8 .... Avant de passer dans le while ...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 30 oct. 2007 à 17:09
function SayWin(tab: TypeDeTab; const player: TColor): boolean;
var cpt, ctl, i: integer;
begin
ctl := 0;
While (ctl <> 8) or (cpt <> 3) do
begin
cpt:=0;
for i:= 1 to 3 do
begin
if tab[ctl] = player then
cpt := cpt + 1;
ctl := ctl + 1;
end;
end; result :cpt 3;
end;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 30 oct. 2007 à 18:50
heu dites moi si je me trompe :
function SayWin(tab: TypeDeTab; const player: TColor): boolean;
var cpt, ctl, i: integer;
begin ctl :0; ctl 0
While (ctl <> 8) or (cpt <> 3) do equivalent a while not ( (ctl=8) and (cpt=3) ) <--- on s'arrete que si ctl =8 et cpt=3
begin
cpt:=0;
for i:= 1 to 3 do 3 iterations de ....
begin
if tab[ctl] = player then
cpt := cpt + 1; ctl :ctl + 1; ... ctl ctl+1
end; donc ici, ctl = 3, 6, 9, ... donc ctl ne vaudra jamais 8
end; result :cpt 3;
end;
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 31 oct. 2007 à 08:53
Salut foxi,
Merci pour ta réponse mais malheureusement ca ne règle pas mon probleme, ds le sens ou il m'indique un autre probleme(surcharge non indiqué), en fait pour etre plus précis ma variable de type tableau est une variable de classe se trouvant ds mon modele donc je pensais qu'il était possible de l appeler directement ds ma fonction sans devoir le mettre ds les paramètres de la fonction...(ce que j ai fait ds d autre fonction) de plus ca serait étrange de devoir faire ca puisque j appelle alors ds mon controleur cette fonction se trouvant ds le modele donnant comme paramètres "SayWin(Modele.tab,currentplayer)" alors que cette variable s'y trouve
Fin donc je suis tjs aussi perdu
Pour répondre à Guillemouze, While (ctl <> 8) or (cpt <> 3) do équivaux a while not ( (ctl=8) or (cpt=3) )et ctl := ctl + 1; c'est comme si tu faisais inc(ctl) càd que tu ajoutes un en plus a chaque tour de boucle donc à un moment ca atteindra bien 8 (a part,bien sur, si cpt=3)
Vous n’avez pas trouvé la réponse que vous recherchez ?
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 31 oct. 2007 à 09:57
sorry fOxi,
En fait j'étais mal réveillé , ya pas de probleme de surcharge mais bon en faisant comme tu m as indiqué, j ai tjs le meme probleme de EaccessViolation
En esperant que quelconque personne puisse m aider, merci d'avance
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 31 oct. 2007 à 12:52
Merci Dom,
Je n avais pas remarqué cette grosse erreur...A force de vouloir tjs tout condenser
Donc si je comprends bien ce EAccessViolation c comme en java IndexOutofBounds? cad qu'il n'acceptait pcq je sortais des limites de mon tableau
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 31 oct. 2007 à 13:07
EAccessViolation veut dire que tu lis dans un espace memoire que tu ne devrait. ca peut correspondre a un IndexOutOfBounds, mais aussi a plein d'autre choses (acces a une fonction d'un objet non instancié, ...)
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 31 oct. 2007 à 13:21
Oui donc c était bien ca merci encore Dom...
J ai completement changé mon code, voila le résultat :
function SayWin(player:TColor):boolean;
var i,j,k,cpt:integer;
findwinner:boolean;
begin
i:=0;j:=1;k:=2;
findwinner:=false;
cpt:=1;
While not(findwinner)and (cpt<>3) do begin
inc(cpt);
if ((tab[i]=player) and (tab[j]=player) and (tab[k]=player)) then begin
result:=true;
findwinner:=true;
end
else begin i:=i+3;j:=j+3;k:=k+3;
result:=false;
end;
end;
Bon bien sur c est vite fait et juste pour une verif. verticale
++
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 31 oct. 2007 à 13:26
Oui c vrai Guillemouze, j ai tjs eu quelque probleme avec ca(meme avec ton explication j ai encore du mal ) en tout cas merci pour votre aide c etait efficace
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 31 oct. 2007 à 13:29
je pense que cette fonction a le meme comportement que la tienne (mais est baucoup plus claire!):
function SayWin(player:TColor):boolean;
var
i: integer;
begin
i:=0;
Result := false;
While not(Result)and (i<2) do
begin
Result := ((tab[3*i]=player) and (tab[3*i+1]=player) and (tab[3*i+2]=player));
inc( i);
end;
end;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 31 oct. 2007 à 13:32
@dom: bien sur qu'il vaudra 8, vu qu'il incremente de 1 en 1. en plus, j'ai dit : "donc ici, ctl = 3, 6, 9, ... donc ctl ne vaudra jamais 8" le "ici" est tres important car il se trouve a la fin du for, ce qui signifie qui ne vaudra jamais 8 .... a la fin du for !!!!
dvwyns
Messages postés159Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention 7 mai 2012 1 nov. 2007 à 11:13
Au fait juste une pt précision mtn que je l ai testé, c pas While not(Result)and (i<2) do mais While not(Result)and (i<=2) do sinon bien sur le dernier test ne sera pas effectué