Discuss Scratch

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

Helion_ wrote:

Bonjour !

Helion_ wrote:

ajouter à [compteur] (Largeur de la scène)
L'erreur est dans ce bloc (du moins, je pense, en fonction du reste du programme).
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

wilhelm43 wrote:

Helion_ wrote:

Bonjour !

Helion_ wrote:

ajouter à [compteur] (Largeur de la scène)
L'erreur est dans ce bloc (du moins, je pense, en fonction du reste du programme).
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
Ah, non, ça c'est juste moi qui ai mal recopié mon script. Merci quand même !
wilhelm43
Scratcher
1000+ posts

Aide pour mon tetris

Helion_ wrote:

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

wilhelm43 wrote:

Helion_ wrote:

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 !
Merci, je vais essayer !
Bouboufez
Scratcher
1000+ posts

Aide pour mon tetris

Bonjour

wilhelm43 wrote:

Helion_ wrote:

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 !
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.


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 lines
...
fonctionne 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
...
si <<(Tetrimino y) < (((Hauteur de la scène) - (length2)) + (1))> et <...>> alors
ajouter à [Tetrimino y v] (0.05)
sinon
Check lines::custom
...
end
...
(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.

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 loop
Check lines::custom
Download grid list::custom
Reset grid::custom
si <(frame)=(1)> alors::controls
...
sinon
...
end
...
Et tout est rentré dans l'ordre. Voilà

Last edited by Bouboufez (Aug. 3, 2023 14:25:20)

Helion_
Scratcher
20 posts

Aide pour mon tetris

Bouboufez wrote:

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 Checklines
. . .
fonctionne 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.
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…)

Le problème étant réglé, je ferme le topic. Merci

Powered by DjangoBB