Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Intelligence artificielle qui n'est pas intelligente
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Intelligence artificielle qui n'est pas intelligente

Posté le 07/11/2019 18:56

Je me demandais pourquoi ce code ne marche pas :

If C-A>D-B
Then A<C⇒1→E
A>C⇒2→E
IfEnd
If D-B>C-A
Then B<D⇒3→E
B>D⇒4→E
IfEnd
If U=3
Then E=1⇒C-1→C
E=2⇒C+1→C
E=3⇒D-1→D
E=4⇒D+1→D
0→U
IfEnd
...

Sachant que j'ai déjà mis un code de mouvements (A et B) à un perso que je déplace, ce code marche très bien mais l'IA quitte l'écran (elle n'effectue que les opérations -). Donc voilà mon problème


1, 2 Suivante
Redcmd Hors ligne Membre Points: 380 Défis: 7 Message

Citer : Posté le 07/11/2019 19:31 | #


I dont see any code to test if the AI is off the screen?
If X>21 OR X<1 OR Y>7 OR Y<1
Then 'Off screen
Else 'On screen
IfEnd

Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 07/11/2019 19:44 | #


Yes but it's because the AI should follow me, which she does not.
Etudiant en informatique à l'Umons, fan de prog en tout genre
Redcmd Hors ligne Membre Points: 380 Défis: 7 Message

Citer : Posté le 07/11/2019 19:54 | #


Seeing the rest of the code would be nice
if C-A = D-B then E is not set to anything
so if its on the diagonal from you, it stops working correctly?
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 07/11/2019 20:07 | #


Oh. I didn't think about that

Ajouté le 07/11/2019 à 20:08 :
I go to test this now.
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 08/11/2019 07:57 | #


Regarde le code de ce programme. Il fait quelque chose de très similaire à la difference près qu'il y a 7 ia qui me suivent..
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 08/11/2019 08:50 | #


Merci je vais voir ça
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 10/11/2019 16:55 | # | Fichier joint


@Youstones: Donc pour répondre à ta demande, voici une explication suivie du code de mon programme Survival Game :



Tout d'abords, pour ceux qui n'auraient pas encore testé le jeu ou qui ne savent pas de quoi il s'agit, je vais expliquer. Ce jeu est un jeu de survie qui prends place sur tout l'écran texte. Vous, le joueur, êtes représentés par un point noir, tandis que le danger que vous fuyez, ici sept zombies, sont représentés par des cercles barrés. Le but donc est de survivre en vous déplaçant sur l'écran à l'aide des touches [REPLAY] le plus longtemps possible. Un compteur (ici de secondes, à titre indicatif) vous indique le temps actuel que vous avez survécu.

Intéressons nous maintenant (car c'est ce pourquoi vous avez lu tout ce qui précède ) au fonctionnement de ces sept zombies qui pourraient êtres appelés, par n'importe quelle personne lambda, des IA (Intelligences Artificielles).
Il faut tout d'abords savoir que ce sept zombies, qui se déplacent vers le joueur par défaut, sont tous pilotés par... un seul et même bout de code. Les caractéristiques de chaque zombie étant stockées dans une matrice de 3 lignes par 7 colonnes, une pour chaque zombie. (3 lignes: une pour la position X, l'autre pour la position Y, et enfin la dernière pour la quantité de vies qu'il reste au zombie (et oui, j'avais prévu un système d'armes mais ça n'as pas abouti.. c'est peut être pour bientôt)). Donc pour fonctionner, je définis en premier cette matrice, avec les positions de départ de chaque zombie, et leur niveaux de vies (tous les mêmes). Ensuite, dans la boucle principale du programme, celle qui gère les déplacements du joueur et aussi ceux des zombies, ce trouve une boucle for. Cette boucle lit une à une les colonnes de la matrice et, si le zombie concerné possède encore de la vie, elle effectue une suite de tests qui aboutissent au déplacement du zombie (modification des coordonnées X et Y). Ces tests sont guidés par une fonction randint() qui permet au programme de "choisir" si le zombie se déplace ou pas (si la fonction renvoie 1, alors le test est validé. Les bornes de la fonction randint() sont 0, et un nombre entre 1 et 10 définissant le niveau de difficulté). Ensuite, si le test est positif, un autre suit comparant la position du zombie avec celle du joueur pour faire aller le zombie vers le joueur en faisant varier d'une unité les coordonnées du zombie dans la bonne direction.
Certains se demandent donc: comment ces zombies font-ils pour ne pas sortir de l'écran et provoquer une erreur puisqu'il n'y as pas de test à ce sujet ? Je suis donc tenté de leur répondre que les zombies suivent le joueur, qui lui ne peut pas sortir de l'écran. Par conséquent les zombies ne le peuvent pas non plus.

Pour plus de clarté, voici le code. Je l'ai converti en .txt avec ma graph90 et corrigé à la main pour le rendre plus lisible (les caractères spéciaux étant représentés par leur code hexa). Donc si il y as des soucis dans la lecture, n'hésitez pas :

'ProgramMode:RUN
0->A~Z:0->r:1->D
"SGAME"->List 1 // Liste de sauvegarde du meilleur score

//...
// Pour éclaircir le code, j'ai retiré la partie de l'introduction et du texte
//...

Lbl Z
ClrText
Menu "###SURVIVAL GAME###","Survivez !",1,"Difficulté",2,"Meilleur score",3,"Sortie de secours",4 // Menu principal

//...
// Autres choix du menu
//...

Lbl A // Choix "Survivez !"
1->A:4->B:100->V:0->T
ClrMat
[[21,21,21,21,21,21,21][1,2,3,4,5,6,7][100,100,100,100,100,100,100]]->Mat I // matrice contenant les positions et les niveaux de vies des IAs

While Getkey<>47 // Boucle principale du programme
Isz T
Locate A,B,"_#E6A4_" //Affichage des valeurs de vies du joueur et du temps qui s'écoule
Locate 1,1,V
Locate 4,1,"_#E69D_"
Locate 10,1,T
Locate 15,1,"s"

For 1->r To 7
Locate Mat I[1,r],Mat I[2,r]," " // Effacement des zombies pour modifier leurs positions sans effacer tout l'écran
Next

For 1->r To 7 // Boucle de lecture de la matrice des zombies et de calcul de leurs nouvelles coordonnées
If Mat I[3,r]>0 // Test du niveau de vie (si = 0 alors le zombie est mort et ne bouge plus. Leur perte de vies n'est pas implémentée)
Then
If RanInt#(0,D)=1 // Random pour déterminer si le zombie se déplace ou non
Then
Mat I[1,r]>A=>Mat I[1,r]-1->Mat I[1,r] // En abscisses, si le zombie se trouve avant le joueur, alors il avance
Mat I[1,r]<A=>Mat I[1,r]+1->Mat I[1,r] // En abscisses, si le zombie se trouve après le joueur, alors il recule
Mat I[2,r]>B=>Mat I[2,r]-1->Mat I[2,r] // En ordonnées si le zombie se trouve au dessus du joueur, alors il descends
Mat I[2,r]<B=>Mat I[2,r]+1->Mat I[2,r] // En ordonnées si le zombie se trouve au dessous du joueur, alors il monte
IfEnd
IfEnd
Next

For 1->r To 7 // Boucle de test si un zombie se trouve sur le joueur, il lui retire alors de la vie
Locate Mat I[1,r],Mat I[2,r],"_#E6D1_" // Affichage du zombie
If Mat I[1,r]=A And Mat I[2,r]=B And V>0 // Test de position
Then Locate 1,1,"   "
V-1->V // Retrait d'une vie
IfEnd
Next

If V<=0 // Teste si le joueur est mort: fin de la partie et sauvegarde du meilleur score
Then
T>List 1[1]=>T->List 1[1]
Break
IfEnd

Getkey->K

If K<>0 // Déplacements du joueur
Then Locate A,B," " // Effacement du joueur pour le déplacer sans effacer tout l'écran
'DEPLACEMENT J
A<21=>K=27=>Isz A
A>1=>K=38=>Dsz A
B<7=>K=37=>Isz B
B>2=>K=28=>Dsz B
K=46=>Break
Locate A,B,"_#E6A4_" // Affichage du joueur
IfEnd
WhileEnd

Lbl Y // Affichage du meilleur score et retour au menu principal
ClrText
Locate 5,3,"Meilleur score:"
Locate 9,5,List 1[1
Locate 13,5,"s"
Locate 16,7,"[Exit]"
List 1[1]>100=>Locate 1,7,"Bien joué !"
Do
LpWhile Getkey
Do
LpWhile  Not Getkey
Goto Z


En relisant ainsi le code je m'aperçois que de nombreux morceaux peuvent êtres regroupés et simplifiés. Considérez ce code comme un exemple. Je vais travailler à l'optimiser

Je n'ai que très rarement expliqué ainsi un programme, je suis encore assez maladroit.. Donc n'hésitez pas à demander précisions

Ajouté le 10/11/2019 à 17:15 :
Code du jeu mis à jour. Celui qui est dans mon précédent post est obsolète mais sert d'exemple, l'aspect général et le fonctionnement n'ayant pas étés impactés par ma mise à jour. C'était une question d'optimisation
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 10/11/2019 22:09 | #


Donc j'ai bien lu tout ton code (et je t'en remercie grandement) mais je suis sincèrement désolé si je n'étais pas clair, mais ce que j'essayé de faire c'est que l'ennemi "réfléchisse" à quel chemin est le plus efficace pour tuer le joueur, sans dire sur ton code été inutile j'ai appris pas mal de chose (comme le fait de faire 0→A~Z). Hors mon programme était extrêmement bugué (et il l'est toujours ) car l'ennemi reste bloqué des fois sur l'axe de y ou x... Enfin, comme toi, je ne suis pas doué pour expliquer alors si tu a besoin de plus d'informations...

Ajouté le 10/11/2019 à 22:09 :
Ps : encore vraiment désolé de ce malentendu

Ajouté le 10/11/2019 à 22:39 :
Nous sommes d'accord que si le joueur (en mode texte) est en A=7;B=3 et que l'ennemi est en C=16;D=6, |A-C|>,< ou =|B-D| me permet de comparer la distance ?
Etudiant en informatique à l'Umons, fan de prog en tout genre
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 10/11/2019 22:39 | #


Oui, c'est ce qu'on appelle la Distance de Manhattan.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 10/11/2019 22:48 | #



...
A-C→X
X<0⇒X*-1→X
B-D→Y
Y<0⇒Y*-1→Y
If X≥Y
Then
A>C⇒C+1→C
A<C⇒C-1→C
IfEnd
If X<Y
Then
B>D⇒D+1→D
B<D⇒D-1→D
IfEnd
Locate C,D, "¶"
...

Pourquoi cela marche pas ? (l'ennemi reste bloqué à certain endroit, incapable de monter...) et je n'ai pas oublié la possibilité d'un égal mais je n'avais pas le temp et la place pour...
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 11/11/2019 08:52 | #


Deja tu peux remplacer les
X<0⇒X*-1→X

Par la fonction abs de la calto. Regarde dans le catalogue ou le sous-menu [MATH].
Ensuite je ne suis pas sur de comprendre ce que tu veux faire.. tu veux que ce bot te rejoigne par le chemin le plus direct mais y a-t-il des obstacles... tu peux reformuler le problème stp ?
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 11/11/2019 09:20 | #


L'écran est vide, ton ennemi est en face de toi et... tu fuis comme un lâche ! Et l'ennemi essaye de te rattraper le plus vite pour te tuer. Donc il n'y a pas d'obstacles (pour l'instant) et on peut contrôler le joueur dans tout l'écran. Il n'y a qu'un ennemi, et la condition de mort est s'il te touche

Ajouté le 11/11/2019 à 09:30 :
Et le problème c'est que l'ennemi fait des mouvements Illogique (aller retour, reste bloqué,...)
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 11/11/2019 10:02 | #


Ben c'est exactement ce que fait mon programme
Mais avec 7 bots et pas de mort subite..
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 11/11/2019 10:02 | #


Pourtant tu ne compare pas les distance dans ton code, si ?

Ajouté le 11/11/2019 à 10:06 :
Parce que dans ton code il va normalement toujours se déplacer en abscisses (en X) d'abord avant de se déplacer en ordonnée (en y)
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 11/11/2019 10:06 | #


Ben si
Ici:
...
Mat I[1,r]>A=>Mat I[1,r]-1->Mat I[1,r] // En abscisses, si le zombie se trouve avant le joueur, alors il avance
Mat I[1,r]<A=>Mat I[1,r]+1->Mat I[1,r] // En abscisses, si le zombie se trouve après le joueur, alors il recule
Mat I[2,r]>B=>Mat I[2,r]-1->Mat I[2,r] // En ordonnées si le zombie se trouve au dessus du joueur, alors il descends
Mat I[2,r]<B=>Mat I[2,r]+1->Mat I[2,r] // En ordonnées si le zombie se trouve au dessous du joueur, alors il monte
...

Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 11/11/2019 10:22 | #


1) puisque tu le met cash, il execute la dernière fonction valable, non ?
2)tu compare au joueur, et non entre les distance X et y ?
3) si je t'envoie une vidéo par lien drive, ça marche ?
Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 11/11/2019 11:14 | #


Par Drive.. l'ordi a fait une maj et drive deconne en ce moment, je prefere pas.
Non, le programme execute toutes les conditions si elles sont validées. Donc un bot peut se déplacer en diagonale. Ah oui je comprends pourquoi tu fait ça, en effet je ne compare pas les coordonnées x et y.. mais ou serait l'intérêt.. teste mon jeu (avec CBasic de préférence) tu verra que les bots vont assez vite et par un chemin que j'estime etre le plus court
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 11/11/2019 11:44 | #


Ah et bien tu sais quoi ? J'ai delete TOUT mon code et j'ai repris de zéro. Donc j'ai commencé avec ma base et j'ai juste quelques problèmes avec les locates qui efface le texte (ça clignote sans cesse) mais sinon ça marche ! Je crois que J'avais une erreur d'encodage qui corrompé mes fonctions,en empêchant donc à l'ennemi de bien se déplacer. Sinon je développe un petit système de tir peut-être que si je le termine je peux te le passer pour survival game ? (en dédommagement du temp pris)

Etudiant en informatique à l'Umons, fan de prog en tout genre
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 11/11/2019 11:50 | #


Non tkt, pas de soucis. Sinon ouais je veux bien voir ce que tu va faire, même si j'ai déjà une petite idée de ce que je vais faire.. Je pense aussi revoir le code et mettre des obstacles, faire en sorte que les bots me courent apres seulement apres m'avoir vu et tentent de me tuer. Ainsi je pourrais faire des lvls. Je pense faire un truc dans ce genre là, j'ai déjà fait des programmes avec des bouts de code utiles pour ce projet
Youstones Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 11/11/2019 11:54 | #


Mais stv tu me donne des bout de codes à faire cela ne me dérange pas ! Ici je vais essayer de mettre des obstacles et puis je travaillerai le tir du player.
Etudiant en informatique à l'Umons, fan de prog en tout genre
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 96 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd