2017-03-23 3 views
3

Mon but est de construire une grille d'images 5x5. Dans le code suivant, row, col et rowcol ont été créés en tant que variables locales à l'image-objet, et newcol, newrow et cats sont globaux. (Soit dit en passant, est-il possible de dire quelles sont les variables locales et qui sont globales? Il est facile d'oublier ou de faire des erreurs.)Une grille de clones

code

Le résultat est une grille 5x1 seulement, comme on le voit ici.

results

Je suis pas clair quant à l'ordre d'exécution de ces déclarations. Est-ce que when I start as a clone est appelé avant ou après add_cat est appelé la deuxième fois? Ma conclusion provisoire est qu'elle est appelée après, mais les variables globales du clone semblent contenir leurs valeurs d'avance à la place.

Lorsque j'ai tenté de le déboguer avec les commandes ask et say et wait, les résultats variaient énormément. L'ajout de telles pauses à certains endroits a complètement résolu le problème, ce qui a donné une grille de 5x5. Dans d'autres endroits, ils ont causé une grille 1x5.

La question principale est: Comment résoudre ce problème afin qu'il produise une grille 5x5?

Répondre

5

Explication

Malheureusement, l'ordre d'exécution dans Scratch est un peu bizarre. Chaque fois que vous modifiez un script (en ajoutant ou en supprimant des blocs, en modifiant des entrées ou en faisant glisser le script entier vers un nouvel emplacement dans l'éditeur), il est placé en bas de la liste (il s'exécute donc en dernier).

Une bonne façon de tester cela est de créer un projet vide avec les scripts suivants:
two similar scripts

Lorsque vous cliquez sur le drapeau vert, l'image-objet soit dire « un script » ou « Script deux ", selon ce qui court en premier. Essayez de cliquer et de faire glisser l'un des blocs when green flag clicked. La prochaine fois que vous cliquerez sur le drapeau vert, l'image-objet indiquera quel message correspond au script que vous venez de faire glisser.

Cet ordre fou peut rendre l'exécution incroyablement imprévisible, en particulier lors de l'utilisation de clones.

La solution

La seule vraie solution est d'écrire du code qui a un ordre intégré (plutôt que de compter sur les caprices de l'éditeur) l'exécution définitive. Pour les scripts plus simples, cela signifie généralement utiliser le bloc broadcast and wait pour exécuter des événements particuliers dans l'ordre requis.

Pour votre projet, je vois deux solutions principales:

solution procédurale Ceci est le script le plus simple, et il est probablement ce que je choisirais d'aller avec:
procedural solution
(row et col sont toutes deux des variables de type sprite uniquement)
Étant donné que les clones héritent de toutes les valeurs de variable sprite uniquement lors de leur création, chaque clone aura la bonne ligne et col quand il est créé.

récursive Solution Cette solution est un peu plus difficile à comprendre que le premier, donc je l'éviter sans doute à moins que vous êtes à la recherche de la nouveauté:
recursive solution

+2

bonne explication, me fixant droit quelques points sur la façon dont fonctionne Scratch. Quelque chose de similaire à votre solution récursive a fonctionné dans mon projet. Notez que la récursivité offre plus que de la nouveauté. Mon projet actuel nécessite plusieurs branches, ce qui n'est pas possible avec une approche procédurale simple. Cela pourrait être fait en utilisant une liste comme une pile first-in-first-out, mais c'est au moins aussi complexe que l'utilisation de la récursivité et moins élégante. –