Here's a solution to our create object block; you'll see that we abstracted the drawing routine as its own block.

solution to create object block

solution to draw object block

Let's add our create object block to the end of our click detector script, so that whenever we click the board, it adds a Bug at that tile!

click detector with object addition

Putting It All Together!

Let's create a customizable, playable maze! Our final product will look something like this:

maze with player and obstacles on it

Head over to our Player sprite, and let's see how it works.

When the Green Flag is pressed, our player gets a position as a (row, column) coodinate. Notice that we have some arrow-key receivers set up- almost! When we press an arrow key, we want position to change accordingly. Fill in the code for finish move that updates the player's displayed position. Note that speak will literally speak aloud what is passed as input. You may use say instead.

Let's fill in the arrow key receivers so that they change our position coordinate (which is a list of two values) appropriately. You can use the following blocks to get the "row" and "column" numbers out of the position variable, or you can just use item 1 and item 2!

get row from coordinates

get column from coordinates

Head to the Player sprite, and fill in the empty lists in the arrow key receivers with the appropriate code for changing the player's position.

The last thing we have to do is add a game over condition when we hit an obstacle. When does it make sense to check to see if the game should be over? finish move seems like a good place, because it gets run after every move.

Fill in the finish move block so that it checks to see if any objects are at our position on the Board. Some ideas for inside the condition: Turn the sprite red; speak the words "Game over!"; have our Player say "Oops, I hit a (object name)!"; Reset a timer when the flag is clicked and stop it when the game is over.

Add a condition to finish move that checks the players position against the board, and do something if there's an object there!

Avoiding "if touching"

There's a big advantage to using boards to store info about our game state that we haven't discussed yet. And that is: using "if touching" under "sensing" is really slow.

Sometimes it's tempting to use several touching block to check if the Player sprite itself is touching another object or color on the stage. Sometimes it's useful to use one of these, but in general, they're really slow!

Imagine if instead of moving in discrete steps and checking the item on the board at our position, we had a separate "forever if touching" script for each type of object we want to detect! This lead to repetitive code, AND each "forever if touching" really eats away at our speed.

Board representations can make games much more playable by allowing us to avoid all of this!