Communauté

Après l'atelier Lua...
 
Notifications
Retirer tout

Après l'atelier Lua je code un snake 🙂

5 Posts
3 Utilisateurs
2 Reactions
338 Vu
Brachius
(@brachius)
Active Member
Inscription: Il y a 8 ans
Posts: 6
Début du sujet  
----------------------------------------------------
--   __             _            __         _     --
--  / _\_ __   __ _| | _____    / / /\ /\  /_\    --
--  \ \| '_ \ / _` | |/ / _ \  / / / / \ \//_\\   --
--  _\ \ | | | (_| |   <  __/ / /__\ \_/ /  _  \  --
--  \__/_| |_|\__,_|_|\_\___| \____/\___/\_/ \_/  --
----------------------------------------------------                                       

-------------------------------------------------------------
--- É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

---------------------

   
Citation
Brachius
(@brachius)
Active Member
Inscription: Il y a 8 ans
Posts: 6
Début du sujet  

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 :)


   
RépondreCitation
Mooncrystal
(@mooncrystal)
Active Member
Inscription: Il y a 1 an
Posts: 9
 

Salut, 

Copieur, je pensais m'en faire un petit 😀

Bien le code, il applique ce qu'on voit dans les premiers ateliers 🙂


   
RépondreCitation
Samy_the_grappler
(@samy_the_grappler)
Active Member
Inscription: Il y a 1 an
Posts: 10
 

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 😂😉


   
RépondreCitation
Brachius
(@brachius)
Active Member
Inscription: Il y a 8 ans
Posts: 6
Début du sujet  

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 :).


   
RépondreCitation
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.