Après l'atelier Lua je code un snake 🙂
---------------------------------------------------- -- __ _ __ _ -- -- / _\_ __ __ _| | _____ / / /\ /\ /_\ -- -- \ \| '_ \ / _` | |/ / _ \ / / / / \ \//_\\ -- -- _\ \ | | | (_| | < __/ / /__\ \_/ / _ \ -- -- \__/_| |_|\__,_|_|\_\___| \____/\___/\_/ \_/ -- ---------------------------------------------------- ------------------------------------------------------------- --- Écrit par Radu Cédric (Brachius) 05/2023 GameCodeur --- --- Cadre d'apprentissage du langage de programmation LUA --- --- FrameWorks "Love2d" --- --- But d'apprentissage : --- --- Compréhension et gestion des tableau/liste en LUA --- --- Aucun Sprite ou autre fichier extérieur nécessaire --- ------------------------------------------------------------- ---- VARIABLE ---- snake = {} --table qui reprend la taille et les coordonées de de la queue tete = {} --table pour la gestion du début du serpent tete.x = 20 --position X de la tête du serpent, sur une grille de 40 cases de large tete.y = 15 --position Y de la tête du serpent, sur une grille de 30 cases de haut tete.t = 20 --Taille en pixel de la largeur et hauteur de la tete du serpent tete.dx = 1 --vitesse de déplacement de 1 case par 1 case sur la grille en X tete.dy = 0 --vitesse de déplacement de 1 case par 1 case sur la grille en Y taille = 10 --Taille du serpent en début de partie counter = 8 -- Compteur de temps avant de faire avancer le serpent initCounter=200 -- Constante/variable pour la réinitialisation du compteur bonbon = {} --Table pour la gestion des bonbons à manger pour le serpent bonbon.x = math.floor(math.random(1,39)) -- position en X du bonbon (toujours pas case) bonbon.y = math.floor(math.random(1,29)) -- position en Y du bonbon (toujours pas case) grille = {} --Création de la grille de jeu function love.load() for l=1,30 do grille[l]={} for c=1,40 do grille[l][c]=0 end end grille[bonbon.y][bonbon.y]=5 -- on place un bonbon aux coordonées déclarées en variables end -- La grille est une zone de jeu qui est créée comme suit : -- 0 = zone libre -- 1 = portion d'un élément de la queue sur serpent -- 2 = un mur -- 3 = la tête du serpent -- 4 = rien pour le moment (mais peut être un bonus etc) -- 5 = un bonbon function love.update(dt) counter = counter - 1 -- on détuit 1 du compteur -- Gestion des touches pour le déplacement de la tête du seprent if love.keyboard.isDown("down") then tete.dy = 1 tete.dx = 0 elseif love.keyboard.isDown("up") then tete.dy = -1 tete.dx = 0 elseif love.keyboard.isDown("left") then tete.dy = 0 tete.dx = -1 elseif love.keyboard.isDown("right") then tete.dy = 0 tete.dx = 1 end -- Quand le compteur atteint 0 if counter <= 0 then counter = initCounter * dt -- le compteur est réinitialisé grille[tete.y][tete.x]=1 -- on ajoute une portion de queue a un emplacement de la grille add_queue(tete.x,tete.y) -- on ajoute un element dans la liste snake tete.x = tete.x + tete.dx -- on fais avancer la tete sur le tableau en fonction de la touche tete.y = tete.y + tete.dy -- qui a été appuyée end -- si sur les coordonées de la tete se trouve un mur ou une portion de queue -- alors fin de la partie if grille[tete.y][tete.x]==2 or grille[tete.y][tete.x]==1 then gameover() end -- si sur les coordonées de la tête se trouve un bonbon if grille[tete.y][tete.x]==5 then taille=taille+1 -- on ajoute 1 à la taille du serpent local y = math.floor(math.random(2,28)) -- on choisi une coordonée aléatoire sur local x = math.floor(math.random(2,38)) -- la grille grille[y][x]=5 -- sur cette coordonée on met le tag d'un bonbon end grille[tete.y][tete.x]=4 -- on place la tête du serpent sur la grille if #snake > taille then -- a chaque frame on suprime la fin de grille[snake[1].y][snake[1].x] = 0 -- de la queue du serpend. Vu que le dernier segement est table.remove(snake,1) -- en faite la premiere entrée de la liste, on le supprime. end -- un décalage vers le 1 de toute la portion de la queue ser fera (voir les tables en LUA) end function love.draw() for l=1,30 do for c=1,40 do --dessin des bords de l'espace du jeu grille[1][c]=2 grille[l][1]=2 grille[30][c]=2 grille[l][40]=2 -- dessin de la grille de jeu love.graphics.setColor(0,0,1) love.graphics.line(c*20,20,c*20,580) love.graphics.line(20,l*20,780,l*20) love.graphics.setColor(1,1,1) -- si sur les coorodnée de la grille il y a un 1 on affiche un carré blanc pour la queue if grille[l][c]==1 then love.graphics.rectangle("fill",(c*20)-20,(l*20)-20,tete.t,tete.t) end -- si sur les coorodnée de la grille il y a un 4 on affiche un carré vert pour la tête if grille[l][c]==4 then love.graphics.setColor(0,1,0) love.graphics.rectangle("fill",(c*20)-20,(l*20)-20,tete.t,tete.t) love.graphics.setColor(1,1,1) end -- si sur les coorodnée de la grille il y a un 2 on affiche un carré violet pour les murs if grille[l][c]==2 then love.graphics.setColor(1,0,1) love.graphics.rectangle("fill",(c*20)-20,(l*20)-20,20,20) love.graphics.setColor(1,1,1) end -- si sur les coorodnée de la grille il y a un 1 on affiche un rond blanc pour le bonbon if grille[l][c]==5 then love.graphics.setColor(0,1,0) love.graphics.circle("fill",c*20-10,l*20-10,10) love.graphics.setColor(1,1,1) end end end end --fonction pour l'ajout d'un élément de queue avec ses coordonnés function add_queue(x,y) local q = {} q.x = x q.y = y table.insert(snake,q) return q end -- fonction de gameover qui fait quitter le jeu -- à modifier à votre guise function gameover() love.event.quit() end ---------------------
Bonjour après les bases je tente de comprendre comment fonctionne les tables en LUA et j'applique.
Mon code n'est sans doute pas opti, mais perso je pense que le résultat compte et qu'après cet exercice, je pense avoir compris comment le tout fonctionne. Je suis content de mon résultat :).
Je vous poste donc le code, j'espère que ça aidera certain ^^.
Si vous avez des idées pour que j'agence les choses de manière meilleure, je suis preneur :).
Un copier coller du code suffit pour lancer une partie (lua + love2d).
Bon code à tous :)
Salut,
Copieur, je pensais m'en faire un petit 😀
Bien le code, il applique ce qu'on voit dans les premiers ateliers 🙂
J'aime beaucoup la manière dont tu l'as pensé, ce que je reproche aux tutos sur youtube c'est de partir dans des notions trop compliquées alors qu'il n'y a pas besoin et au final ils veulent juste montrer leur science, là c'est simple et efficace. Le code raconte une histoire comme dirait David.
P-S : Je valide car il n'y a pas de boucles pairs/ipairs ahah, #teambouclefor 😂😉
Merci pour vos réponses :).
@samy_the_grappler : vive la team #bouclefor XD
En fait pour penser à mon code comme tu le dis, je n'ai pas été voir de tuto ou de code sur le net. J'ai voulu le penser moi-même sans être embrouillé.
Je suis content de ce que j'ai réussi à faire, car il est fonctionnel et je peux y ajouter tout ce que je veux.
Sur ce, je retourne coder (une vrai drogue xD), je viens de découvrir AOZ Studio et je reproduit mon snake dessus :).
- 6 Forums
- 180 Sujets
- 638 Posts
- 0 En ligne
- 45 {numéro}K Membres