Discuss Scratch
- Discussion Forums
- » Français
- » Aide pour mon tetris
- Helion_
-
Scratcher
20 posts
Aide pour mon tetris
Bonjour, je suis actuellement en train de créer un jeu Tetris. J'ai presque fini mais j'ai un problème ; l'algorithme que j'ai codé pour la suppression des lignes devrait théoriquement fonctionner mais ce n'est pas le cas, il ne prend en compte que la dernière ligne.
Lien du projet : https://scratch.mit.edu/projects/868736241/editor/
L'algorithme (simplifié) est le suivant :
Lien du projet : https://scratch.mit.edu/projects/868736241/editor/
L'algorithme (simplifié) est le suivant :
définir Check lines
répéter (Hauteur de la scène) fois
isoler les caractères (compteur) à ((compteur) + (10)) de (Grid list :: Grid List)
si <non <(sous-chaîne) contient (1) ?>> alors
supprimer la ligne
end
ajouter à [compteur] (Largeur de la scène)
end
Last edited by Helion_ (Aug. 2, 2023 15:50:43)
- wilhelm43
-
Scratcher
1000+ posts
Aide pour mon tetris
Bonjour !
L'erreur est dans ce bloc (du moins, je pense, en fonction du reste du programme).ajouter à [compteur] (Largeur de la scène)
En effet, le bloc est en dehors de la boucle répéter. Or, c'est le bloc qui se charge de passer aux lignes supérieurs, si je comprends bien ton script.
Voilà, bonne journée

- Helion_
-
Scratcher
20 posts
Aide pour mon tetris
Ah, non, ça c'est juste moi qui ai mal recopié mon script. Merci quand même !Bonjour !L'erreur est dans ce bloc (du moins, je pense, en fonction du reste du programme).ajouter à [compteur] (Largeur de la scène)
En effet, le bloc est en dehors de la boucle répéter. Or, c'est le bloc qui se charge de passer aux lignes supérieurs, si je comprends bien ton script.
Voilà, bonne journée
- wilhelm43
-
Scratcher
1000+ posts
Aide pour mon tetris
Ah, non, ça c'est juste moi qui ai mal recopié mon script. Merci quand même !En regardant dans ton projet, essaye de remplacer le script :
définir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
supprimer la ligne::custom
end
par
définir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
remplacer la ligne::custom
end
Ça aura le même effet, mais ça sera plus sain comme code.
Maintenant, si tu veux, je te conseille d'insérer ton bloc personnalisé "Create Grid" après le bloc ajoutant 1 au score de ligne. Je ne vois pas d'erreur dans ton script (du moins, dans ce bloc).
Bonne journée à toi !
- Helion_
-
Scratcher
20 posts
Aide pour mon tetris
Merci, je vais essayer !Ah, non, ça c'est juste moi qui ai mal recopié mon script. Merci quand même !En regardant dans ton projet, essaye de remplacer le script :définir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
supprimer la ligne::custom
end
pardéfinir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
remplacer la ligne::custom
end
Ça aura le même effet, mais ça sera plus sain comme code.
Maintenant, si tu veux, je te conseille d'insérer ton bloc personnalisé "Create Grid" après le bloc ajoutant 1 au score de ligne. Je ne vois pas d'erreur dans ton script (du moins, dans ce bloc).
Bonne journée à toi !
- Bouboufez
-
Scratcher
1000+ posts
Aide pour mon tetris
Bonjour
J'ai examiné ton code une partie de la soirée hier soir et le problème ne m'est apparu que ce matin : le bloc personnalisé
Le problème est en amont, c'est la condition du “si … alors” qui l'exécute qui pose problème
Avec cette condition, “Check lines” n'est exécutée que lorsqu'un bloc tombe sur la dernière ligne du tableau car son ordonnée y est comparée à sa hauteur et à la hauteur de la scène. D'où le fait que ça ne marche à peu près que quand c'est la dernière ligne qui est complétée.
Voilà, c'est de ce côté-là qu'il faut creuser
(et sinon, beau projet, bravo !)
EDIT 16h25 :
Pour corriger le problème, le plus simple, plutôt que d'essayer de retravailler cette condition (ce qui ne sera pas si facile vu qu'il faut prendre compte de tous les blocs déjà présents dans la grille…), me semble être de vérifier s'il y a une ligne à retirer à chaque itération de “Game loop”. C'est un peu “brutal” mais au moins on est sûr que ça marche
J'ai essayé d'ajouter à la volée dans l'éditeur ceci en haut de la définition de “Game loop” :

Je ne pense pas que ce soit une bonne idée : si tu remplaces la ligne, les blocs potentiellement situés au-dessus ne vont pas descendre d'un cran lors de la suppression d'une ligne, ou alors il faudrait remplacer toutes les lignes du dessus aussi pour tout décaler d'un cran, ce qui deviendrait au final bien plus complexe.Ah, non, ça c'est juste moi qui ai mal recopié mon script. Merci quand même !En regardant dans ton projet, essaye de remplacer le script :définir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
supprimer la ligne::custom
end
pardéfinir Check lines
…
si <non <(sous-chaîne) contient (1)::operators>> alors
remplacer la ligne::custom
end
Ça aura le même effet, mais ça sera plus sain comme code.
Maintenant, si tu veux, je te conseille d'insérer ton bloc personnalisé "Create Grid" après le bloc ajoutant 1 au score de ligne. Je ne vois pas d'erreur dans ton script (du moins, dans ce bloc).
Bonne journée à toi !
J'ai examiné ton code une partie de la soirée hier soir et le problème ne m'est apparu que ce matin : le bloc personnalisé
définir Check linesfonctionne très bien et n'est pas incriminé. On peut s'en rendre compte en arrêtant le jeu puis en l'exécutant en le double-cliquant : “GRID LIST” est correctement modifiée.
...
Le problème est en amont, c'est la condition du “si … alors” qui l'exécute qui pose problème
définir Game loop(note : je n'ai pas recopié ce qui concerne la variable “chute finie ?” car visiblement elle vaut toujours 0 et rien ne peut modifier sa valeur)
...
si <<(Tetrimino y) < (((Hauteur de la scène) - (length2)) + (1))> et <...>> alors
ajouter à [Tetrimino y v] (0.05)
sinon
Check lines::custom
...
end
...
Avec cette condition, “Check lines” n'est exécutée que lorsqu'un bloc tombe sur la dernière ligne du tableau car son ordonnée y est comparée à sa hauteur et à la hauteur de la scène. D'où le fait que ça ne marche à peu près que quand c'est la dernière ligne qui est complétée.
Voilà, c'est de ce côté-là qu'il faut creuser

(et sinon, beau projet, bravo !)
EDIT 16h25 :
Pour corriger le problème, le plus simple, plutôt que d'essayer de retravailler cette condition (ce qui ne sera pas si facile vu qu'il faut prendre compte de tous les blocs déjà présents dans la grille…), me semble être de vérifier s'il y a une ligne à retirer à chaque itération de “Game loop”. C'est un peu “brutal” mais au moins on est sûr que ça marche

J'ai essayé d'ajouter à la volée dans l'éditeur ceci en haut de la définition de “Game loop” :
définir Game loopEt tout est rentré dans l'ordre. Voilà
Check lines::custom
Download grid list::custom
Reset grid::custom
si <(frame)=(1)> alors::controls
...
sinon
...
end
...

Last edited by Bouboufez (Aug. 3, 2023 14:25:20)
- Helion_
-
Scratcher
20 posts
Aide pour mon tetris
J'ai examiné ton code une partie de la soirée hier soir et le problème ne m'est apparu que ce matin : le bloc personnaliséMille mercis à toi, tu avais totalement raison ! (bon, juste je suis un peu dégouté parce que je n'avais pas vu ton message et que je viens de me retaper tout mon code bloc par bloc pendant 2h avant de voir le problème…)définir Checklinesfonctionne très bien et n'est pas incriminé. On peut s'en rendre compte en arrêtant le jeu puis en l'exécutant en le double-cliquant : “GRID LIST” est correctement modifiée.
. . .
(note : je n'ai pas recopié ce qui concerne la variable “chute finie ?” car visiblement elle vaut toujours 0 et rien ne peut modifier sa valeur)
Avec cette condition, “Check lines” n'est exécutée que lorsqu'un bloc tombe sur la dernière ligne du tableau car son ordonnée y est comparée à sa hauteur et à la hauteur de la scène. D'où le fait que ça ne marche à peu près que quand c'est la dernière ligne qui est complétée.
Le problème étant réglé, je ferme le topic. Merci

- Discussion Forums
- » Français
-
» Aide pour mon tetris