
[LUA] Créer une IA basique, mais complète !
J'avais besoin de réaliser une IA, pour mon jeu. Je ne savais pas du tout comment procéder. J'ai cherchée des tutos... Pas trouvée.
Mis à part un tuto sur la fonction
math.random()J'ai donc fait un petit programme pour me familiariser avec, j'ai finalement compris comment ça marche. Enfaite, c'est pas bien compliquée, sa prend juste un peu de temps....
Trêve de Bavardages, voilà donc un sample de mon petit programme.
Enfaite, on contrôle un Carre Blanc qui ce promène comme il veut, dans n'importe quel ions.
Mais un méchant Carrée Bleu,viens vous embêter et vous empêche de terminer votre jolie promenade. Le carre Blanc devra donc fuir ou partir, mais rien à faire.
Non seulement, il vous suit par tout et vous pousse mais en plus, il vous empêche de passer !
(J'ai tout de même fait en sorte qu'il y ai un angle mort pour passer).
Voilà le code largement commentée, je n'ai rien à ajouter ^^
--------------------------------
Code :
-- On cree une Couleur et On charge les Ressource necessaire
local bleu = Color.new(0,0,255)
carre = Image.createEmpty(32,32) -- on crée un carre
carre:clear(bleu) -- on lui donne une couleur
parre = Image.createEmpty(29,29) -- on crée un autre carre
parre:clear(Color.new(255,255,255)) -- on lui donne une couleur
Parre = {x=10,y=100} -- On donne des Coordonees (X,Y) au Carre
Carre = {x=280,y=100} -- On donne des Coordonees (X,Y) au Carre
parre_statut = "Nil" -- Etat du petitCarre
carre_statut = {1,2,3,4,5} -- Tableau pour Etat du Carre
function IA(carre) --On Cree une fonction IA, pour le carre
if carre_statut == 1 or carre_statut == 2 or carre_statut == 3 or carre_statut == 4 then -- Etat du Carre renvoie 1 ou 2,3 ou 4
carre:clear(bleu) -- on lui donne une couleur
carre_statut = "Nile" -- Etat du Carre = nil
end
if carre_statut == 5 then -- Etat du Carre renvoie 5
carre:clear(Color.new(255,0,0)) -- on lui donne une couleur
carre_statut = "Rush" -- Etat du Carre = Rush
end
if Carre.x > Parre.x + parre:width() and Parre.x >= 35 then -- Si le Carre est superieur au miniCarre + sa longueur et que la position du Minicarre est superieur a 35
carre_statut = math.random(1,5) -- 1 chance sur 5 que Carre soit en Mode Rush
end
if Carre.x > Parre.x + parre:width() and Parre.x >= 65 then -- Si le Carre est superieur au miniCarre + sa longueur et que la position du Minicarre est superieur a 35
carre_statut = 5
end
if Carre.x < Parre.x + parre:width() and Parre.x >= 35 then -- Si le Carre est superieur au miniCarre + sa longueur et que la position du Minicarre est superieur a 35
carre_statut = 1
end
if Carre.x < Parre.x + parre:width() and Parre.x >= 65 then -- Si le Carre est superieur au miniCarre + sa longueur et que la position du Minicarre est superieur a 35
carre_statut = 1
end
if Carre.x > Parre.x + parre:width() and Parre.x >= 150 then
carre_statut = 2
end
if Carre.x > Parre.x + parre:width() and Parre.x >= 200 then
carre_statut = 5
end
if Carre.x < Parre.x + parre:width() and Parre.x >= 150 then
carre_statut = 5
end
if Carre.x < Parre.x + parre:width() and Parre.x >= 200 then
carre_statut = 2
end
if Carre.x == Parre.x + parre:width() and carre_statut == "Rush" then
Parre.x = Parre.x -55
end
-- Si la position du Carre (en x) est superieur a Position du mini Carre + (sa longueur) +10
if Carre.x > Parre.x + parre:width() +10 then
Carre.x = Carre.x -1
end
-- Si la position du Carre (en x) est inferieur a Position du mini Carre + (sa longueur) +10
if Carre.x < Parre.x + parre:width() +10 then
Carre.x = Carre.x +1
end
-- Si la position du Carre (en y) est superieur a Position du mini Carre + (sa hauteur) +5
if Carre.y + carre:height() > Parre.y +5 then
Carre.y = Carre.y -2
end
-- Si la position du Carre (en y) est inferieur a Position du mini Carre + (sa longueur) +5
if Carre.y + carre:height() < Parre.y + carre:height() +5 then
Carre.y = Carre.y +2
end
end -- Libre a vous de modifier les valeurs et/ou changer les statut
-- Dans la fonction (plus haut), Le carre fera en sorte de vous empecher de passer.
-- L'IA Programmer repond a ce besoin
-- Oui Pas plus compliquer que ca <img src="./images/smilies/smile.gif" alt=":)" title="Souris" />
function Collision()
if parre_statut == "Attack" then -- Si l'etat du Carre est Attack
parre:clear(Color.new(2,255,2)) -- on lui donne une couleur
end
if parre_statut == "Nil" then -- Si l'etat du Carre est Nil (Rien)
parre:clear(Color.new(255,255,255)) -- on lui donne une couleur
end
-- Si la position du MiniCarre + sa longueur est egale a Carre.x et que l'etat du miniCarre est Attack
if Parre.x + parre:width() == Carre.x and parre_statut == "Attack" then
Carre.x = Carre.x +5
-- Sinon si la position du MiniCarre + sa longueur est egale a Carre.x et que l'etat du miniCarre est Nil
elseif Parre.x + parre:width() == Carre.x and Carre.y < Parre.y and parre_statut == "Nil" then
Parre.x = oldx -- Reste bloquee a sa derniere position
elseif Parre.x == Carre.x + carre:width() and parre_statut == "Nil" then
Carre.x = Oldx -- Reste bloquee a sa derniere position
Parre.x = oldx -- Reste bloquee a sa derniere position
end -- Oui, les Collision sont pas precise au pixel pres, mais le but n'est pas d'avoir des Collision parfaite
end
function Bouger()
if pad:cross() and not oldpad:cross() then -- Si on appuie sur X
parre_statut = "Attack" -- L'Etat du petit Carre passe a Attack
else -- Sinon, si X n'est pas presser
parre_statut = "Nil" -- Etat du petitCarre est Nil (Rien)
end
if pad:right() then -- Si on appuie sur Droite
Parre.x = Parre.x +2
end
if pad:left() then -- Si on appuie sur Gauche
Parre.x = Parre.x -2
end
if pad:up() then -- Si on appuie sur Haut
Parre.y = Parre.y -2
end
if pad:down() then -- Si on appuie sur Bas
Parre.y = Parre.y +2
end
end
while true do -- Tant que le Code est Vrai
screen:clear() -- On efface l'ecran
pad = Controls.read() -- On initialise les touches
screen:blit(Carre.x,Carre.y,carre) -- On affiche Carre plus sa position qui Change
screen:blit(Parre.x,Parre.y,parre) -- On affiche Carre plus sa position qui Change
screen:print(55,55,parre_statut,bleu) -- On print la variable parre_statut, pour savoir quel est le statut actuel de parre
screen:print(55,15,Parre.x,bleu) -- On print la variable Parre.x pour savoir la position actuelle de Parre
IA(carre) -- On appelle la fonction IA pour (carre)
Bouger(parre) -- On appelle la fonction Bouger pour miinCarre
Collision() -- Fonction Collision pour les 2 carre
if Controls.read():select() then
break
end
screen.waitVblankStart()
screen.flip()
oldx = Parre.x -- Pour les Collision
Oldx = Carre.x -- Idem
oldpad = pad -- On declare oldpad
end -- Ferme la Boucle
-- Dans ce Code on utilise math.random(). Cette fonction mathematique
-- Retourne un nombre aleatoire: math.random(Nbre_minimum,Nbre_maximum)
-- A vous d'adapter ceci pour votre propre code.
-- Sachant que ce code est complet pour une IA de Base
-- A vos Claviers !
Note: Pour une Coloration Syntaxique aller ici:
http://www.xtreamlua.com/forums/viewtop ... =95&t=6690