From 4b034f59152864fe439febda04b409f2eab6ddf5 Mon Sep 17 00:00:00 2001 From: Kiki Date: Thu, 19 Sep 2024 13:26:51 -0700 Subject: [PATCH] Prepping for labs+Rockscout+Hubble --- docs/courses/csintro.md | 34 +- docs/courses/csintro/unit-0/s01-lab0006.md | 223 +++++++ .../csintro/unit-1/s01-lab0101-part1.md | 165 +++++ .../csintro/unit-1/s01-lab0101-part2.md | 43 ++ docs/courses/csintro/unit-1/s01-lab0102.md | 154 +++++ docs/courses/csintro/unit-1/s01-lab0103.md | 249 ++++++++ .../csintro/unit-1/s01-lab0104-part1.md | 108 ++++ .../csintro/unit-1/s01-lab0104-part2.md | 185 ++++++ .../csintro/unit-1/s01-lab0104-part3.md | 142 +++++ docs/courses/csintro/unit-1/s01-lab0105.md | 223 +++++++ .../csintro/unit-2/s01-lab0201-part1.md | 169 ++++++ .../csintro/unit-2/s01-lab0201-part2.md | 111 ++++ .../csintro/unit-2/s01-lab0201-part3.md | 120 ++++ .../csintro/unit-2/s01-lab0201-part4.md | 97 +++ .../csintro/unit-2/s01-lab0201-part5.md | 165 +++++ .../csintro/unit-2/s01-lab0202-part1.md | 226 +++++++ .../csintro/unit-2/s01-lab0202-part2.md | 173 ++++++ docs/courses/csintro/unit-2/s01-lab0203.md | 91 +++ docs/courses/csintro/unit-2/s01-lab0204.md | 93 +++ .../csintro/unit-2/s01-lab0205-part1.md | 181 ++++++ .../csintro/unit-2/s01-lab0205-part2.md | 72 +++ .../csintro/unit-2/s01-lab0205-part3.md | 109 ++++ .../csintro/unit-2/s01-lab0206-part1.md | 215 +++++++ .../csintro/unit-2/s01-lab0206-part2.md | 170 ++++++ .../csintro/unit-2/s01-lab0206-part3.md | 187 ++++++ .../csintro/unit-2/s01-lab0206-part4.md | 234 ++++++++ .../csintro/unit-3/s01-lab0301-part1.md | 159 +++++ .../csintro/unit-3/s01-lab0301-part2.md | 168 ++++++ .../csintro/unit-3/s01-lab0304-part1.md | 295 +++++++++ .../csintro/unit-3/s01-lab0304-part2.md | 369 ++++++++++++ .../csintro/unit-3/s01-lab0304-part3.md | 312 ++++++++++ .../csintro/unit-3/s01-lab0305-part1.md | 416 +++++++++++++ .../csintro/unit-3/s01-lab0305-part2.md | 154 +++++ .../csintro/unit-3/s01-lab0305-part3.md | 119 ++++ docs/courses/csintro_archive.md | 57 ++ docs/static/hero-gallery/hubble_banner.jpg | Bin 0 -> 220357 bytes docs/static/tutorials/hubble/hubble_4x3.jpg | Bin 0 -> 136274 bytes docs/test/tutorials/rockscout.md | 14 +- docs/test/tutorials/stackem_smurfs.md | 567 ++++++++++++++++++ docs/tutorials/rockscout.md | 540 +++++++++++++++++ 40 files changed, 7090 insertions(+), 19 deletions(-) create mode 100644 docs/courses/csintro/unit-0/s01-lab0006.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0101-part1.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0101-part2.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0102.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0103.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0104-part1.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0104-part2.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0104-part3.md create mode 100644 docs/courses/csintro/unit-1/s01-lab0105.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0201-part1.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0201-part2.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0201-part3.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0201-part4.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0201-part5.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0202-part1.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0202-part2.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0203.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0204.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0205-part1.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0205-part2.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0205-part3.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0206-part1.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0206-part2.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0206-part3.md create mode 100644 docs/courses/csintro/unit-2/s01-lab0206-part4.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0301-part1.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0301-part2.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0304-part1.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0304-part2.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0304-part3.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0305-part1.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0305-part2.md create mode 100644 docs/courses/csintro/unit-3/s01-lab0305-part3.md create mode 100644 docs/courses/csintro_archive.md create mode 100644 docs/static/hero-gallery/hubble_banner.jpg create mode 100644 docs/static/tutorials/hubble/hubble_4x3.jpg create mode 100644 docs/test/tutorials/stackem_smurfs.md create mode 100644 docs/tutorials/rockscout.md diff --git a/docs/courses/csintro.md b/docs/courses/csintro.md index f1177af0f11..a4d75050faa 100644 --- a/docs/courses/csintro.md +++ b/docs/courses/csintro.md @@ -1,18 +1,18 @@ -# CS Intro +# Introduction to Computer Science with MakeCode Arcade -A collection of courses meant to teach introductory programmers using Blocks and JavaScript +Hello! Welcome to the new student guide for "Introduction to Computer Science with MakeCode Arcade"! + +This page will provide you with additional activities that you can complete in order to better understand the lessons in the official curriculum. Please note, this page does not contain any answer keys or exemplar projects. ### ~hint -These courses are currently in beta - this means that they are likely to have bugs and changes made fairly regularly. If you see anything that doesn't seem quite right, or if you have any suggestions, please file an issue on [github](https://github.com/microsoft/pxt-arcade). +If you are looking for our previous "CS Intro" course, you may now find that at:" +https://arcade.makecode.com/courses/csintro-archive ### ~ -## Courses on Flipgrid - -Flipcode for the **Intro to CS** course grid: **[csintroarcade](https://flipgrid.com/csintroarcade)** -## Course Sections +## Unit 0 Activities ```codecard [ @@ -35,23 +35,23 @@ Flipcode for the **Intro to CS** course grid: **[csintroarcade](https://flipgrid ] ``` -## About the CS Intro Series +## Unit 1 Activities -The CS Intro Series is designed to teach new developers how to code from the ground up. -In CS Intro 1, students are introduced to programming through the MakeCode Blocks editor. They can create their own games, while learning concepts that are crucial to software development: creating variables, responding to events, and using iteration to simplify and extend their programs. Throughout the course, they will learn to develop their own games through small daily tasks, as well as projects that guide them through the process of turning basic ideas into full-fledged games. -In CS Intro 2, students will continue to develop the software development skills they were introduced to in the first course, with more advanced programming concepts such as functions, logical comparisons, and arrays. These new skills will allow students to create more advanced and compelling games. +## Unit 2 Activities + + + +## Unit 3 Activities + + -### ~hint -In the future CS Intro 3 and CS Intro 4 courses, students will transition the skills they have learned in a Block based environment into skills in a text based coding environment, allowing them to dig deeper into the games they make, as well as transition their skills in the @boardname@ into other environments. -### ~ ## See also [Courses Home Page](/courses), -[CS Intro 1](/courses/csintro1), -[CS Intro 2](/courses/csintro2), -[CS Intro 3](/courses/csintro3) \ No newline at end of file +[Arcade Tutorials](/tutorials), +[Beginner Skillmaps](/beginner-maps), diff --git a/docs/courses/csintro/unit-0/s01-lab0006.md b/docs/courses/csintro/unit-0/s01-lab0006.md new file mode 100644 index 00000000000..89b72a40040 --- /dev/null +++ b/docs/courses/csintro/unit-0/s01-lab0006.md @@ -0,0 +1,223 @@ +# Lab 0.6: Self-portrait + +## It's all about you! @showdialog + +In this tutorial, you will continue your exploration of MakeCode Arcade, +creating a simple "self-portrait" to introduce yourself to your instructors +and your classmates. + +## Bell ringer @showdialog + +**How would you fill in this sentence? I am ______.** + +This could be answered in many ways: + +1. What you enjoy doing: I am *a musician*. +1. Physically: I am *tall*. +1. Personal characteristic: I am *funny*. +1. Career aspirations: I am *an engineer*. +1. Self-reflective: I am *a deep thinker*. +1. As an athlete: I am *a runner*. + +Want some other ideas? + +**Complete this sentence: I like ______.** + +Take a few minutes to think who you are and what you like, +and write down a few of them. +You will use these descriptions shortly! + +## Set the scene! + +In this tutorial, you will be adding blocks to your +``||loops(noclick):on start||`` +container. + +- From the +``||scene:Scene||`` +drawer, set the background color. + +View the hint by selecting the light bulb below +if you need to see an example of the code that you are building. + +```blocks +scene.setBackgroundColor(7) +``` + +## Here I am! + +Now, let's add your avatar. An **avatar** is an image that represents +someone or something. + +1. From the +``||sprites:Sprites||`` +drawer, create a new sprite that represents you. +1. Give your sprite an image that represents you. +**Do not** use an existing image from the gallery. + +View the hint by selecting the light bulb below +if you need to see an example of the code that you are building. + +```blocks +scene.setBackgroundColor(7) +// @highlight +let mySprite = sprites.create(sprites.builtin.cat0, SpriteKind.Player) +``` + +## You don't say! + +Now, let's have your avatar say some facts about you. + +- Using a block in the +``||sprites:Sprites||`` +drawer, make the sprite "say" several things about you, including: + 1. Your name and grade + **Internet safety note**: When creating projects + that may be shared on the Internet, + **only** use your given (first) name. + **Do not** use your first and last names. + 1. At least three things from the bell ringer activity. + 1. "Goodbye!" + +View the hint by selecting the light bulb below +if you need to see an example of the code that you are building. + +```blocks +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . 5 5 . . . . . . . +`, SpriteKind.Player) +mySprite.sayText("My name and grade") +mySprite.sayText("Fact #1") +mySprite.sayText("Fact #2") +mySprite.sayText("Fact #3") +mySprite.sayText("Goodbye!") +``` + +## Too fast! + +Is the sprite saying your facts too quickly? + +- Add a +``||loops:pause (100) ms||`` +block after any +``||sprites(noclick):say||`` +block that goes too quickly. +- Adjust the length of the pause by changing the value +in the ``||loops(noclick):pause||`` block. + +```blocks +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . 5 5 . . . . . . . +`, SpriteKind.Player) +mySprite.sayText("My name and grade") +pause(1000) +mySprite.sayText("Fact #1") +pause(1000) +mySprite.sayText("Fact #2") +pause(1000) +mySprite.sayText("Fact #3") +pause(1000) +mySprite.sayText("Goodbye!") +``` + +## Whoops! Wrong spot! + +Let's move your avatar elsewhere on the screen. + +- Using the coordinate system that you learned in Lab 0.5, +move the sprite to a different location on the screen. +- Use a block in the ``||sprites:Sprites||`` drawer to do so. +- Be sure to place the block in the correct place. +Where does it need to go? + +View the hint by selecting the light bulb below +if you need to see an example of the code that you are building. + +```blocks +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . 5 5 5 5 5 5 5 5 5 5 . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . 5 5 5 5 5 5 5 5 . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . 5 5 5 5 5 5 . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . 5 5 5 5 . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 5 5 . . . . . . . + . . . . . . . 5 5 . . . . . . . +`, SpriteKind.Player) +// @highlight +mySprite.setPosition(80, 60) +mySprite.sayText("My name and grade") +pause(1000) +mySprite.sayText("Fact #1") +pause(1000) +mySprite.sayText("Fact #2") +pause(1000) +mySprite.sayText("Fact #3") +pause(1000) +mySprite.sayText("Goodbye!") +``` + +## Congratulations! @showdialog + +If there is time left, you can add more actions to your program! + +Here are some ideas. + +- Instead of just appearing in a different position on the screen, +have the sprite move smoothly. +- Add a second sprite which also talks to the player. +- Make the sprite only talk when the player hits a button. + +Follow your instructor's directions to submit your project. + +```ghost +scene.setBackgroundColor(7) +let mySprite = sprites.create(sprites.builtin.cat0, SpriteKind.Player) +mySprite.sayText("My name and grade") +mySprite.sayText("Fact #1") +mySprite.sayText("Fact #2") +mySprite.sayText("Fact #3") +mySprite.sayText("Goodbye!") +mySprite.setPosition(80, 60) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0101-part1.md b/docs/courses/csintro/unit-1/s01-lab0101-part1.md new file mode 100644 index 00000000000..f19493eed45 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0101-part1.md @@ -0,0 +1,165 @@ +# Lab 1.1 Part 1: Blocks scavenger hunt! + +## Blocks scavenger hunt! @showdialog + +This activity is a scavenger hunt. +Some of the blocks will be familiar to you from previous labs. +Others may be new. + +If your instructor provided you with a worksheet for this lab, +complete the worksheet as you go through this tutorial. + +## First block! + +1. Find the +``||variables(sprites):set mySprite to||`` ``||sprites:sprite [] of kind Player||`` +block and add it to the +``||loops(noclick):on start||`` +container already in the workspace. +1. Give your sprite an image. +(Select one from the **Gallery** for now.) + +--- + +**Questions** + +*Note*: If your instructor provided you with a worksheet, +write the answers to these questions on your worksheet. + +- Which drawer in the toolbox holds this block? +- What does this block do? + +If you need help, remember that you can select the help icon +(the question mark) to see a hint! + +```blocks +// @highlight +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +``` + +## Next block! + +1. Find the +``||sprites:set||`` ``||variables(sprites):mySprite||`` +``||sprites:position to x [0] y[0]||`` + block. +1. Add the block to **the bottom** of your ``||loops(noclick):on start||`` container. + +Try different values for **x** and **y**. + +--- + +**Questions** + +- Which drawer in the toolbox holds this block? +- What does this block do? +- Are there any numbers that are **not** allowed for **x** or **y**? + +```blocks +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +// @highlight +mySprite.setPosition(0, 0) +``` + +## Let's move! + +1. Find the +``||controller:move||`` ``||variables(controller):mySprite||`` +``||controller:with buttons (+)||`` + block. +2. Add the block to **the bottom** of your ``||loops(noclick):on start||`` container. + +--- + +**Questions** + +- Which drawer in the toolbox holds this block? +- What does this block do? +- Which buttons are used to move the sprite? + +```blocks +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.setPosition(0, 0) +// @highlight +controller.moveSprite(mySprite) +``` + +## Move some more! + +1. In your +``||controller(noclick):move||`` ``||variables(noclick):mySprite||`` +``||controller(noclick):with buttons (+)||`` +block, click the **expand** button. + - The *expand* button is the plus sign at the end of the block. + +--- + +**Questions** + +- What new items appear? +- What happens when you change the values of **vx** and **vy**? +- How can you use those values to make the sprite **only** move +**horizontally** (left and right)? +- How can you use those values to make the sprite **only** move +** vertically** (up and down)? +- Are there any numbers that are **not** allowed for **vx** and **vy**? + +~hint What kind of numbers should I try? +- Try some negative numbers. +- What happens when the velocity is zero? +hint~ + +```blocks +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.setPosition(0, 0) +// @highlight +controller.moveSprite(mySprite, 50, 0) +``` + +## Sprites can talk? + +1. Find the +``||variables(sprites):mySprite||`` ``||sprites:say ":)"||`` +block. +2. Add the block to **the bottom** of your ``||loops(noclick):on start||`` container. + +--- + +**Questions** + +- Which drawer in the toolbox holds this block? +- What does this block do? + +```blocks +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.setPosition(0, 0) +controller.moveSprite(mySprite, 50, 0) +// @highlight +mySprite.say(":)") +``` + +## Sprites CAN talk! + +1. In your +``||variables(noclick):mySprite||`` ``||sprites(noclick):say ":)"||`` +block, +select the **expand** button. + +~hint What is the "expand" button? +- The *expand* button is the plus sign at the end of the block. +hint~ + +--- + +**Questions** + +- What new items appear? +- What is the purpose of each of the new items? + +```blocks +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.setPosition(0, 0) +controller.moveSprite(mySprite, 50, 0) +// @highlight +mySprite.say(":)", 1000) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0101-part2.md b/docs/courses/csintro/unit-1/s01-lab0101-part2.md new file mode 100644 index 00000000000..29c59655f01 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0101-part2.md @@ -0,0 +1,43 @@ +# Lab 1.1 Part 2: Renaming variables + +## Renaming sprites @showdialog + +Before our next scavenger hunt, let's learn how to change the name +of a sprite. Follow these instructions to change the +name of your sprite from **mySprite** to **heroSprite**. + +## Make a hero! + +Let's change the name of your sprite to **heroSprite**. + +Watch the animation below to see how this is done. +Then, follow the instructions below to try it yourself! + +**Note**: Look at the hint to see a video of these steps. + +1. In any of the red ovals with the name **mySprite**, +select the **down arrow**. A menu appears. +1. In the menu that appears, select **Rename variable....**. +1. In the dialog that appears, enter the new name, **heroSprite**. +1. Select **OK** or press **Enter** on your keyboard to close the dialog. + +Now, in every block where your sprite is used, the name has changed! + +In all of your programs, give your sprites meaningful names! + +![Renaming a variable in MakeCode](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L01.01.P02.rename_variable.gif) + +```blocks +// @highlight +let heroSprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +heroSprite.setPosition(0, 0) +controller.moveSprite(heroSprite, 50, 0) +heroSprite.say(":)", 1000) +``` + +```template +let mySprite: Sprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.setPosition(0, 0) +controller.moveSprite(mySprite, 50, 0) +mySprite.say(":)", 1000) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0102.md b/docs/courses/csintro/unit-1/s01-lab0102.md new file mode 100644 index 00000000000..4dff723aef0 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0102.md @@ -0,0 +1,154 @@ +# Lab 1.2: Sprites in the corners + +## Sprites in the corners @showdialog + +In this lab, you will add multiple sprites to a project. + +You also will learn about **sprite kinds**. + +You will work on this project in multiple labs, +so have fun and be creative! + +## Meet our hero! + +Let's add our hero to the project. +Remember, if you need a hint, then select the hint tool +(the light bulb icon) +below these instructions. + +1. Add a sprite to your project for the player. +This is called the **hero sprite**. +1. Give your sprite an appropriate name. +1. Draw an image for your hero sprite. +Keep the image simple for now. You can improve it later. +1. Place your hero sprite in one of the corners of the screen. +Use a +``||sprites:set||`` ``||variables(sprites):heroSprite||`` +``||sprites:position to x (0) y (0)||`` +block. + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +``` + +## Time for an ememy! + +Now, let's add an enemy. + +1. Add another sprite to your project for an enemy. +1. Give your new sprite an appropriate name. +1. Draw an image for your enemy sprite. +1. Change the sprite kind to **Enemy**. +Watch the animation below to see how to do this. +1. Place your enemy sprite in the corner +**opposite your hero sprite**. +Use a +``||sprites:set||`` ``||variables(sprites):enemySprite||`` +``||sprites:position to x (0) y (0)||`` +block. + +![An animation showing how to change a sprite kind.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L01.02.change_sprite_kind.gif) + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +// @highlight +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +// @highlight +enemySprite.setPosition(120, 90) +``` + +## Your hero is hungry! + +Let's add some food to your project. + +1. Add another sprite to your project for some sort of food. +1. Give your new sprite an appropriate name. +1. Draw an image for your food sprite. +1. Change the sprite kind to **Food**. +Go back to the previous step if you need to see how to do this. +1. Place your food sprite in one of the empty corners of the screen. +Use a +``||sprites:set||`` ``||variables(sprites):foodSprite||`` +``||sprites:position to x (0) y (0)||`` +block. + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +// @highlight +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +// @highlight +foodSprite.setPosition(120, 30) +``` + +## Throw something in the air! + +Finally, let's add a **projectile** to your project + +~hint What is a projectile? +A projectile is something that is thrown or launched, usually into the air. +hint~ + +1. Add one more sprite to your project for a projectile. +(It will not move in your project ... yet!) +1. Give your new sprite an appropriate name. +1. Draw an image for your projectile. +1. Change the sprite kind to **Projectile**. +If you need a reminder, then switch to the previous step in the tutorial to see how this is done. +1. Place your projectile in the remaining empty corner of the screen. +Use a +``||sprites:set||`` ``||variables(sprites):projectile||`` +``||sprites:position to x (0) y (0)||`` +block. + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +// @highlight +let projectile: Sprite= sprites.create(img`4`, SpriteKind.Projectile) +// @highlight +projectile.setPosition(40, 90) +``` + +## So ... what's the story? + +Now, we need a story! + +1. Your project contains four characters. +Write a story that includes these four sprites. +1. Include a *synopsis* of the story at the beginning of the game. +Use either a +``||variables(sprites):mySprite||`` ``||sprites:say||`` +block or a +``||game:show long text ("") bottom||`` +block. +You can find the +``||game:show long text ("") bottom||`` +block in the **Game** drawer. +1. If you have extra time, then improve your sprite images. +You also can add to your story. + +~hint What is a synopsis? +A synopsis is a short overview of a story. +hint~ + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite= sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +// @highlight +game.showLongText("Once upon a time, in a land far away....", DialogLayout.Center) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0103.md b/docs/courses/csintro/unit-1/s01-lab0103.md new file mode 100644 index 00000000000..771f4838cc3 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0103.md @@ -0,0 +1,249 @@ +# Lab 1.3: Moving sprites +### @explicitHints true + +## Moving sprites @showdialog + +Sprites are pretty boring if they stay in one place! + +In this lab, we will learn different ways to move sprites around the screen. + +## I am the hero! + +You have done this before, so give it a try! + +Add a block that lets the player move the hero sprite around the screen. + +> **Which block lets the player move a sprite?** +> +> The +> ``||controller:move||`` ``||variables(controller):heroSprite||`` +> ``||controller:with buttons||`` +> block is in the **Controller** drawer. + +Need another hint? Select the hint icon below. + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +// @highlight +controller.moveSprite(heroSprite) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) +``` + +## I can go anywhere! + +Move your hero sprite around the screen. + +You can even move the sprite off of the screen! + +This can be confusing to the player. +Move to the next step to see how we can fix this. + +## Let's stay inside today + +Let's keep the player sprite on the screen. + +1. From the **Sprites** drawer, add a +``||sprites:set||`` +``||variables(sprites):mySprite||`` ``||sprites:stay in screen||`` +``||loops(sprites):ON||`` +block. +1. In this new block, click on the down arrow to change the +name of the sprite to your hero sprite. +1. Wait for the simulator to restart. +1. Move the hero sprite around the screen. It stays on the screen now! + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +controller.moveSprite(heroSprite) +// @highlight +heroSprite.setStayInScreen(true) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) + +``` + +## The chase is on! + +Now, let's make the enemy chase the hero! + +1. From the **Sprites** drawer, add a +``||sprites:set||`` +``||variables(sprites):myEnemy||`` ``||sprites:follow||`` +``||variables(sprites):mySprite||`` +block. +1. Make the enemy chase the hero. + * In this new block, make the first variable your enemy sprite. + * In this new block, make the second variable your hero sprite. +1. Wait for the simulator to restart. +1. Move your hero sprite around the screen. +1. How does the enemy sprite react? + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +// @highlight +enemySprite.follow(heroSprite) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) +``` + +## Too fast for you? + +Does the enemy move too fast? Let's see what we can do about that. + +1. Find the new +``||sprites:set||`` +``||variables(sprites):myEnemy||`` ``||sprites:follow||`` +``||variables(sprites):mySprite||`` +block that you just added to your project. +1. *Expand* the block. + +~hint How do I expand a block? +Select the plus sign (+) at the end of the block. +hint~ + +**Questions** + +If your instructor gave you a worksheet, then answer these questions on the worksheet. + +- What new items appear in the block? +- When you change the values, which sprite changes? +- How do different values change the sprite's movement? +- Are there any numbers that are not allowed? + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +// @highlight +enemySprite.follow(heroSprite, 25) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) +``` + +## Time to move! + +We can make a sprite move in any direction we want. Let's try! + +1. From the **Sprites** drawer, add a +``||sprites:set||`` +``||variables(sprites):mySprite||`` +``||sprites:velocity to vx (50) vy (50)||`` +block to your project. +1. In this new block, select the down arrow and change the +variable to your food sprite. +1. Wait for the simulator to restart. +1. Watch your food sprite. It may not be on the screen for very long! +How did it move? +1. Try different numbers for **vx** and **vy**. + +**Questions** + +If your instructor gave you a worksheet, then answer these questions on the worksheet. + +- How do different numbers change the sprite's movement? +- Are there any numbers that are not allowed for **vx** and **vy**? + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +enemySprite.follow(heroSprite, 25) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +// @highlight +foodSprite.setVelocity(50, 50) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) +``` + +## Not that way! This way! + +Can you make the food sprite move in a specific direction? + +![A compass rose.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L01.03.compass_rose.png) +[This image](https://commons.wikimedia.org/wiki/File:Compass_rose_simple.svg) by Henrik is licensed under [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/) + +**Questions** + +What values can you use for **vx** and **vy** to make the food sprite move ... + +- ... north (or up)? +- ... south (or down)? +- ... east (or right)? +- ... west (or left)? +- ... northeast? +- ... southeast? +- ... southwest? +- ... northwest? + +#### ~ tutorialhint + +```blocks +let heroSprite: Sprite = sprites.create(img`1`, SpriteKind.Player) +heroSprite.setPosition(40, 30) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +let enemySprite: Sprite = sprites.create(img`2`, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +enemySprite.follow(heroSprite, 25) +let foodSprite: Sprite = sprites.create(img`3`, SpriteKind.Food) +foodSprite.setPosition(120, 30) +// @highlight +foodSprite.setVelocity(0, 25) +let projectile: Sprite = sprites.create(img`4`, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("This is my story!", DialogLayout.Center) +``` + +```template +let heroSprite: Sprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +heroSprite.setPosition(40, 30) +let enemySprite: Sprite = sprites.create(sprites.castle.skellyFront, SpriteKind.Enemy) +enemySprite.setPosition(120, 90) +let foodSprite: Sprite = sprites.create(sprites.food.smallBurger, SpriteKind.Food) +foodSprite.setPosition(120, 30) +let projectile: Sprite= sprites.create(sprites.projectile.star1, SpriteKind.Projectile) +projectile.setPosition(40, 90) +game.showLongText("Once upon a time in a land far away....", DialogLayout.Center) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0104-part1.md b/docs/courses/csintro/unit-1/s01-lab0104-part1.md new file mode 100644 index 00000000000..0ca8730231b --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0104-part1.md @@ -0,0 +1,108 @@ +# Part 1: A screen full of food + +## A screen full of food! @showdialog + +In this lab, we will write a game where the player must eat all the food +which appears--while avoiding an enemy which bounces around the screen! + +## Sprite-o-rama! + +First, let's add a sprite to the screen every three seconds. + +1. From the **Game** drawer, add an +``||game:on game update every (500) ms||`` +block to your project. Place it anywhere on your workspace. +1. Change the time from 500 milliseconds to **3000** milliseconds. +You can just type the number. You don't have to select an item from the +list that appears. +1. From the **Sprites** drawer, add a +``||variables(sprites):set my sprite to||`` +``||sprites:sprite [] of kind Player||`` +block to the +``||game(noclick):on game update||`` +block that you just added to your workspace. +1. This sprite represents food, so change the sprite kind to **Food**. +1. Select or create any food image that you like for your sprite. +1. Give the sprite variable a meaningful name, like `foodSprite`. + +Watch your game run in the simulator. What's wrong? + +~hint What is a millisecond? +A millisecond is 1/1000 of a second. In other words, 1,000 milliseconds +is the same as 1 second. + +So, 3,000 milliseconds is the same as 3 seconds. +hint~ + +```blocks +let foodSprite: Sprite = null +game.onUpdateInterval(3000, () => { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) +}) +``` + +## Go your own way, food! + +It might look like you only have one sprite on your screen. + +It only *looks* that way, though ... because the sprites are on top of each other! + +Let's put them at random locations on the screen. +Be sure to use the hint button at the bottom of the screen if you want to +see the code that you are trying to build in these steps. + +1. Add a +``||sprites:set||`` ``||variables(sprites):foodSprite||`` +``||sprites:position to x (0) y (0)||`` +block to the **bottom** of +``||game(noclick):on game update every (3000) ms||``. +1. Select the dropdown next to the variable name and select the +variable that you created earlier. +1. Instead of entering a number for the **x** and **y** coordinates, +we are going to use a block that picks a random number. +1. From the **Math** drawer, drag a +``||math:pick random (0) to (10)||`` +block and drop it into the **x** value of the +``||sprites(noclick):set||`` +``||variables(noclick):foodSprite||`` ``||sprites(noclick):position to x (0) y (0)||`` +block. +1. Instead of the numbers **0** and **10**, change the values to pick +a random number from **8** to **152**. + +Let your program run in the simulator. That's a little better, right? +Now, let's pick a random **y** value, too. + +1. Drag another +``||math:pick random (0) to (10)||`` +block and drop it into the **y** value of the +``||sprites(noclick):set||`` +``||variables(noclick):foodSprite||`` ``||sprites(noclick):position to x (0) y (0)||`` +block. +1. Change the random values to include numbers from **8** to **112**. + +Now, you should have food appearing all over the screen! + +**Questions** + +- Why **8** to **152** for **x**? +- Why **8** to **112** for **y**? + +```blocks +let foodSprite: Sprite = null +game.onUpdateInterval(3000, () => { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` + +## Complete + +Good work! Now, we need to add a player. Onward to Part 2! + +```ghost +let foodSprite: Sprite = null +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0104-part2.md b/docs/courses/csintro/unit-1/s01-lab0104-part2.md new file mode 100644 index 00000000000..95498885ce0 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0104-part2.md @@ -0,0 +1,185 @@ +# Part 2: Eat it all! + +## We need a hero! @showdialog + +In this lab, we will write a game where the player must eat all the food +which appears--while avoiding an enemy which bounces around the screen! + +## Hero time! + +Now, let's add a hero sprite who will collect the food on the screen. + +1. Add a +``||variables(sprites):set my sprite to||`` +``||sprites:sprite [] of kind Player||`` +to your +``||loops(noclick):on start||`` +container. +1. Give the variable an appropriate name. +1. Give your hero sprite an appropriate image. +1. Add blocks to +``||loops(noclick):on start||`` +so that the hero sprite: + - Starts in the middle of the screen. + - Stays on the screen. + - Moves with the d-pad buttons. + +Check the hint to see the finished code. + +```blocks +let heroSprite: Sprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +``` + +## What is that? + +Now, let's add an enemy sprite that the hero needs to avoid. + +1. Add another +``||variables(sprites):set my sprite to||`` +``||sprites:sprite [] of kind Player||`` +to your +``||loops(noclick):on start||`` +container to represent the enemy. +1. Give the variable an appropriate name. +1. Give the enemy sprite an appropriate image. +1. Add blocks to +``||loops(noclick):on start||`` +so that the enemy sprite: + - Starts in a random location. + - Moves with a random velocity. + - Bounces off of the edges of the screen. + +Check the hint to see the finished code. + +```blocks +let heroSprite: Sprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +// @highlight +let enemySprite: Sprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +// @highlight +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +// @highlight +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +// @highlight +enemySprite.setBounceOnWall(true) +``` + +## Run! + +Now, we need something to happen when your enemy sprite touches your hero sprite. + +1. From the ``||sprites:Sprites||`` drawer, add an +``||sprites:on||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player) overlaps||`` ``||variables(sprites):otherSprite||`` +``||sprites:of kind (Player)||`` +to your workspace. +1. Change the kind for +``||variables(noclick):otherSprite||`` +to +``||sprites(noclick):Enemy||``. +1. Read the text in this block out loud. It should say: +``||sprites(noclick):on sprite of kind Player overlaps otherSprite of kind Enemy||``. +1. Check the hint to make sure your block looks correct. + +This container block is called an **event handler**. You will learn more +about these kinds of blocks in another lab. + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + +}) +``` + +## Jump out of the way! + +Let's make the enemy sprite jump to a new location on the screen whenever it +collides with our hero sprite. + +1. In the ``||sprites(noclick):on overlap||`` container that you just added to +the workspace, add blocks that: + * Moves the enemy to a random location. + * Moves the enemy with a new, random velocity. + +In your new blocks, drag the +``||variables(noclick):otherSprite||`` +block from the +top of the +``||sprites(noclick):on overlap||`` +block to the blocks that change the +enemy sprite. + +Use the hint to see a screenshot of this and to check your code. + +Play your game in the simulator to see what happens when the enemy sprite +collides with your hero! + +![Using a local variable from a function header.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L01.04.P02.function_use_local_variable.png) + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +``` + +## Eat the fruit + +Now, let's make the fruit disappear when the hero eats it. + +1. Refer to the previous step to add a new ``||sprites:on overlap||`` +block to your workspace. +1. Change the block so that it says the following: +``||sprites(noclick):on sprite of kind Player overlaps otherSprite of kind Food||``. +1. In your new +``||sprites(noclick):on overlap||`` +container, +add a block that +deletes the food sprite with some sort of effect. + +Use the hint to check your code. + +Play your game, eat some fruit, and avoid the enemy! + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) +}) +``` + +## Complete + +Good work! Now, we need to keep track of score and lives. +Onward to Part 3! + +```template +let foodSprite: Sprite = null +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` + +```ghost +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0104-part3.md b/docs/courses/csintro/unit-1/s01-lab0104-part3.md new file mode 100644 index 00000000000..2d00f565837 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0104-part3.md @@ -0,0 +1,142 @@ +# Part 3: Points! Lives! + +## Scores and lives @showdialog + +Your game has a player, an enemy, and some food to eat. +Now, let's track the player's score and lives. + +## Get started! + +Let's give the player a starting score and set of lives at the start of the game. + +From the ``||info:Info||`` drawer, add the following blocks to your +``||loops(noclick):on start||`` container: + +- ``||info:set score to (0)||`` +- ``||info:set life to (3)||`` + +Feel free to change these values if you want the player to start with a +different score or a different number of lives. + +```blocks +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +// @highlight +info.setScore(0) +// @highlight +info.setLife(3) +``` + +## Whoops! + +Now, let's make the player lose a life when they collide with the enemy. + +From the ``||info:Info||`` drawer, drag a +``||info:change life by (-1)||`` +block and add it to the appropriate +``||sprites(noclick):on overlap||`` +container. + +Use the hint to check your code. + +Play your game and make sure you lose a life when you collide into the enemy. + +**Question** + +1. What happens in the game when you run out of lives? + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) + // @highlight + info.changeLifeBy(-1) +}) +``` + +## What's the score? + +Now, let's increase the player's score whenever they eat food. + +From the ``||info:Info||`` drawer, drag a +``||info:change score by (1)||`` +block and add it to the appropriate +``||sprites(noclick):on overlap||`` +container. + +Feel free to change the value in the +block to add different amount to the player's score +whenever they eat food. + +Use the hint to check your code. + +Play your game and make sure you earn points whenever you eat food. + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) + // @highlight + info.changeScoreBy(1) +}) +``` + +## Complete @showdialog + +Good work! Now, make the game your own! + +- Make **both** the player **and** the enemy relocate when they collide. +- Have the player lose points if the enemy eats food. +- Play a sound when the enemy and player collide, and when the player eats food. +- Design your own sprites. +- Add a background. +- What else can you think of? + +```template +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` + +```ghost +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` diff --git a/docs/courses/csintro/unit-1/s01-lab0105.md b/docs/courses/csintro/unit-1/s01-lab0105.md new file mode 100644 index 00000000000..6b45ec33de3 --- /dev/null +++ b/docs/courses/csintro/unit-1/s01-lab0105.md @@ -0,0 +1,223 @@ +# Lab 1.5: Eat some more! + +## Power up! @showdialog + +Different sprite kinds can do different things. + +We'll add a new kind of sprite which, when eaten by the player, +gives them an extra life! + +## Time for a new sprite! + +Let's add a new sprite to the game every 10 seconds. + +1. From the ``||game:Game||`` drawer, add an +``||game:on game update every (500) ms||`` +container to your workspace. +1. Change the interval to `10000` milliseconds. +1. In this new container, add a block that creates a new sprite. This new +sprite will give the player an extra life when they eat it. + - Give this sprite variable an appropriate name. + - Give this sprite an appropriate image. +1. Also in this container, add blocks so that the new sprite: + - Appears in a random location. + - Moves with a random velocity. + +We'll add the new sprite kind in the next step. + +View the hint to check your code. + +```blocks +let extraLifeSprite: Sprite = null +game.onUpdateInterval(10000, function () { + extraLifeSprite = sprites.create(sprites.projectile.bubble1, SpriteKind.Player) + extraLifeSprite.setPosition(randint(8, 152), randint(8, 112)) + extraLifeSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +``` + +## A new kind of sprite! + +Now, let's give our new sprite its own kind. + +1. In the dropdown list that sets the kind for our new sprite, +select **Add a new kind...**. +1. A dialog box appears. Give the new kind a name, like *ExtraLife*. +1. Notice that the new sprite is automatically assigned the new kind. + +View the hint to see this in action! + +~hint Why do we need a new kind? +We need a new kind of sprite because, when the player collides with this +kind of sprite, we want something to happen that is *special* or *unique* +to this kind of sprite. + +If we just made this new sprite a kind of food, then it will act like +the other food in this game. +hint~ + +![Adding a new sprite kind.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L01.05.new_sprite_kind.gif) + +## New life! + +Now, we need to add some blocks to award the player an extra life for +eating the new kind of sprite. + +1. Add a new +``||sprites:on sprite overlaps||`` +block to your workspace. +1. Change the block so that it says the following: +``||sprites(noclick):on sprite of kind Player overlaps otherSprite of kind ExtraLife||``. +(Use your new sprite kind if you called it something else.) +1. Add blocks to your new container so that: + - The extra life sprite is destroyed with some sort of effect. + - The player's lives are increased by 1. + +View the hint to check your code. + +Play your game and get that extra life! + +```blocks +namespace SpriteKind { + export const ExtraLife = SpriteKind.create() +} +sprites.onOverlap(SpriteKind.Player, SpriteKind.ExtraLife, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.hearts, 500) + info.changeLifeBy(1) +}) +``` + +## It went *where*? + +Our extra life sprite leaves the screen. +When a sprite leaves the screen, it continues to exist unless we destroy it. +We have a way to destroy a sprite automatically when it leaves the screen. +Let's make sure that happens to our extra life sprite. + +1. From the ``||sprites:Sprites||`` drawer, drag a +``||sprites:set||`` ``||variables(sprites):mySprite||`` +``||sprites:auto destroy (off)||`` +block and add it to the container +where your extra lives are created. +1. Change the variable to your extra life sprite variable. +1. Select **off** so it changes to **on**. + +View the hint to check your code. + +```blocks +namespace SpriteKind { + export const ExtraLife = SpriteKind.create() +} +let extraLifeSprite: Sprite = null +game.onUpdateInterval(10000, function () { + extraLifeSprite = sprites.create(sprites.projectile.bubble1, SpriteKind.ExtraLife) + // @highlight + extraLifeSprite.setFlag(SpriteFlag.AutoDestroy, true) + extraLifeSprite.setPosition(randint(8, 152), randint(8, 112)) + extraLifeSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +``` + +## Challenge time! + +Your enemy gets hungry, too! Here are some challenges to practice some of +the techniques that you've learned. + +- Allow the enemy to eat **Food** and **ExtraLife** sprites, too! +- Whenever the enemy eats a sprite, the player's score should **decrease**. +- Be sure to destroy the sprites that the enemy eats! +- Use some effects when the sprites are destroyed. + +Check the hint if you need some help. + +```blocks +namespace SpriteKind { + export const ExtraLife = SpriteKind.create() +} +sprites.onOverlap(SpriteKind.Enemy, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.fire, 500) + info.changeScoreBy(-1) +}) +sprites.onOverlap(SpriteKind.Enemy, SpriteKind.ExtraLife, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.ashes, 500) + info.changeScoreBy(-10) +}) +``` + +## Complete @showdialog + +Good work! Now, make the game your own! + +- Add other new sprite kinds to do different things in your game. +- Add other Food sprites which act the same but have different pictures. +- Design your own sprites or backgrounds. + +```template +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` + +```ghost +namespace SpriteKind { + export const ExtraLife = SpriteKind.create() +} +sprites.onOverlap(SpriteKind.Player, SpriteKind.ExtraLife, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.hearts, 500) + info.changeLifeBy(1) +}) +sprites.onOverlap(SpriteKind.Enemy, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.fire, 500) + info.changeScoreBy(-1) +}) +sprites.onOverlap(SpriteKind.Enemy, SpriteKind.ExtraLife, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.ashes, 500) + info.changeScoreBy(-10) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.spray, 500) + info.changeScoreBy(1) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + otherSprite.setPosition(randint(8, 152), randint(8, 112)) + otherSprite.setVelocity(randint(25, 50), randint(25, 50)) + info.changeLifeBy(-1) +}) +let extraLifeSprite: Sprite = null +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.castle.princessFront2, SpriteKind.Player) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +let enemySprite = sprites.create(sprites.builtin.forestBat0, SpriteKind.Enemy) +enemySprite.setPosition(randint(8, 152), randint(8, 112)) +enemySprite.setVelocity(randint(25, 50), randint(25, 50)) +enemySprite.setBounceOnWall(true) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(3000, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +game.onUpdateInterval(10000, function () { + extraLifeSprite = sprites.create(sprites.projectile.bubble1, SpriteKind.ExtraLife) + extraLifeSprite.setFlag(SpriteFlag.AutoDestroy, true) + extraLifeSprite.setPosition(randint(8, 152), randint(8, 112)) + extraLifeSprite.setVelocity(randint(25, 50), randint(25, 50)) +}) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0201-part1.md b/docs/courses/csintro/unit-2/s01-lab0201-part1.md new file mode 100644 index 00000000000..9dc305a1804 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0201-part1.md @@ -0,0 +1,169 @@ +# Lab 2.1 Part 1: Shooting gallery + +## Fire away! @showdialog + +In this lab, you will learn about event handlers and how they can be used +in your projects. + +You also will learn ways to play sounds. + +## Step right up! + +We will be creating a "shooting gallery" game. +First, let's add a hero sprite to our project. + +1. From the ``||sprites:Sprites||`` drawer, add a block to your +``||loops(noclick):on start||`` container to create your player's sprite. +1. Give your variable an appropriate name. +1. Give the sprite an appropriate image. +1. Add more blocks so that the player sprite: + 1. Starts near the bottom of the screen. + 1. Moves when the player uses the d-pad. + 1. Stays on the screen. + +Test your project to make sure your code runs as expected. +View the hint to check your code. + +```blocks +let heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +``` + +## Press the button! + +Let's add our first event handler. + +- From the ``||controller:Controller||`` drawer, drag an +``||controller:on A button pressed||`` +container block onto your workspace. + +Any blocks that you place in this container will run whenever the player +presses the **A** button on their controller. + +```block +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + +}) +``` + +## Projectile ... what? + +Now, let's launch a *projectile* every time the player presses the **A** button. + +1. Inside the +``||controller(noclick):on A button pressed||`` +container that you just added to your workspace, +add a +``||sprites:Sprites||`` block that +creates a new sprite. This sprite will be the projectile. +1. Change the sprite's kind to **Projectile**. +1. Give the sprite an appropriate image. +1. Give the sprite an appropriate name. + +Now, let's make the sprite look like it is launched from the player's sprite! + +~hint What is a projectile? +A projectile is something that is thrown or launched forward, like a ball, +a bullet, or a laser beam. +hint~ + +```blocks +let plasmaSprite: Sprite = null +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) +}) +``` + +## Fire away! + +Let's add some blocks so that the projectile looks like it was launched +by the player. + +1. To the bottom of your +``||controller(noclick):on A button pressed||`` +container, add a +``||sprites:set||`` ``||variables(sprites):mySprite||`` +``||sprites:position to x (0) y (0)||`` +block. +1. Change the variable name to your projectile's name. +1. For the x-coordinate, add a +``||variables(sprites):mySprite||`` +``||sprites:x||`` +block. You'll find that block in the +``||sprites:Sprites||`` drawer. +1. In the new block for the x-coordinate, change the variable name to +your player's sprite. +1. Add another +``||variables(sprites):mySprite||`` +``||sprites:x||`` +block for the y-coordinate. Use the dropdown to change the +**x** to **y**. Also, change the variable name to match your player's sprite, +just like before. + +These blocks will move the projectile so that it at the same location +as your player sprite. + +Test your project to make sure that it runs as expected. +View the hint to check your code. + +```blocks +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) +}) +``` + +## Get a move on! + +It's not much of a projectile if it doesn't move! Let's make the projectile +move up the screen when it is launched. + +1. To the bottom of your +``||controller(noclick):on A button pressed||`` +container, add a +``||sprites:set||`` ``||variables(sprites):mySprite||`` +``||sprites:velocity to vx (50) vy (50)||`` +block. You'll find that block +in the ``||sprites:Sprites||`` drawer. +1. Change the variable name to your projectile. +1. Set the **vx** and **vy** values to make the projectile move up towards +the top of the screen. +1. Add a block to destroy the projectile when it moves off of the screen. + +Use the hint if you get stuck! + +```blocks +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +## Complete! @showdialog + +Good work! You just made a project where the player can launch some +projectiles. In the next part, we'll add some enemies to hurl those +projectiles at! + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0201-part2.md b/docs/courses/csintro/unit-2/s01-lab0201-part2.md new file mode 100644 index 00000000000..0a7b40cd1be --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0201-part2.md @@ -0,0 +1,111 @@ +# Lab 2.1 Part 2: Shooting gallery + +## Here come the enemies! @showdialog + +A game without enemies isn't much of a game. Let's add some! + +## Standard orbit, Mr. Sulu. + +Let's park some enemies at the top of the screen. + +1. From the ``||game:Game||`` drawer, add an +``||game:on game update every (500) ms||`` +container block to your workspace. +1. Change the interval from `500` ms to `1000` ms. +**Question**: How long is 1,000 milliseconds? +1. Within your new +``||game(noclick):on game update every (1000) ms||`` +container, +add blocks to accomplish the following: + 1. Add an enemy sprite to the screen. + 1. Give the enemy sprite variable an appropriate name. + 1. Give the enemy sprite an appropriate image. + 1. Place the enemy sprite just above the top of the screen. + Make sure at least part of the image is visible, though! + 1. Give the enemy sprite a random x-coordinate. + +Test your code to make sure it runs as you expect it. +You should see a bunch of enemies created at the top of the screen, with only +part of the image peeking into the screen. +View the hint to check your code. + +```blocks +let enemySprite: Sprite = null +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) +}) +``` + +## Let's roll! + +Now, let's move the enemies toward the player! + +1. At the bottom of your +``||game(noclick):on game update every (1000) ms||`` +container, add a +``||sprites:set||`` ``||variables(sprites):mySprite||`` +``||sprites:velocity to vx (50) vy (50)||`` +block. +1. Change the variable name to your enemy sprite. +1. Change the velocity values so that the sprites move slowly +toward the bottom of the screen. +1. Add another block so that the enemy sprite is destroyed when it leaves +the screen. + +Test your code to make sure it runs as you expect it. +View the hint to check your code. + +```blocks +let enemySprite: Sprite = null +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + // @highlight + enemySprite.setVelocity(0, 25) + // @highlight + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +## Complete! @showdialog + +Good work! You've added enemies to your project that move toward the player. +In the next part, we'll add the ability to destroy those enemies! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0201-part3.md b/docs/courses/csintro/unit-2/s01-lab0201-part3.md new file mode 100644 index 00000000000..190dd33d44a --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0201-part3.md @@ -0,0 +1,120 @@ +# Lab 2.1 Part 3: Shooting gallery + +## Villains be gone! @showdialog + +Our project allows the player to fire at enemies moving toward them, +but nothing happens to the enemies when they are hit. Let's fix that! + +## Gotta start somewhere! + +First, let's give the player a starting score and set of lives. + +1. At the bottom of your +``||loops(noclick):on start||`` +container, add blocks +from the ``||info:Info||`` drawer to give the player: + 1. A starting score + 1. A starting set of lives. + +Test your project to see if your code runs as expected. +View the hint if you need help. + +```blocks +let enemySprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +// @highlight +info.setScore(0) +// @highlight +info.setLife(3) +``` + +## Bye bye, enemies! + +Now, let's make our projectiles remove the enemy it strikes. +Let's add to our player's score, too! + +1. From the ``||sprites:Sprites||`` drawer, add an +``||sprites:on||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player) overlaps||`` ``||variables(sprites):otherSprite||`` +``||sprites:of kind (Player)||`` +container to your workspace. +1. Change the kinds so that the block reads as follows: +``||sprites(noclick):on sprite of kind Projectile overlaps otherSprite of kind Enemy||`` +1. Into your new container, drag a block from the +``||info:Info||`` drawer +that increases the player's score. Feel free to change the value to anything +you like. +1. Add more blocks so that +``||variables(noclick):sprite||`` and +``||variables(noclick):otherSprite||`` are destroyed. Use any effect +that you like! + +Test your project to see if your code runs as expected. +View the hint if you need help. + +```block +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +``` + +## Complete! @showdialog + +Good work! The player now has a way to destroy enemies and earn points. +Now we need to put the player in some jeopardy. On to part 4! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0201-part4.md b/docs/courses/csintro/unit-2/s01-lab0201-part4.md new file mode 100644 index 00000000000..8f314734d0b --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0201-part4.md @@ -0,0 +1,97 @@ +# Lab 2.1 Part 4: Shooting gallery + +## Collision alert! @showdialog + +When enemies hit your player, the player should lose a life. Let's finish +the game by adding one more event handler. + +## Ouch! + +1. From the ``||sprites:Sprites||`` drawer, add another +``||sprites:on||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player) overlaps||`` ``||variables(sprites):otherSprite||`` +``||sprites:of kind (Player)||`` +container to your workspace. +1. Change the block so that it reads as follows: +``||sprites(noclick):on sprite of kind Player overlaps otherSprite of kind Enemy||`` +1. Into your new container, drag a block from the +``||info:Info||`` drawer +that removes one of the player's lives. +1. Add another block that destroys the enemy. Use any effect that you like. + +Test your project to see if your code runs as expected. +View the hint if you need help. + +```block +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) +}) +``` + +## Complete! @showdialog + +Good work! Your game is now complete! If you have time, then move on to the bonus +section, where we will add some sound effects! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0201-part5.md b/docs/courses/csintro/unit-2/s01-lab0201-part5.md new file mode 100644 index 00000000000..3efb55a8ee2 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0201-part5.md @@ -0,0 +1,165 @@ +# Lab 2.1 Part 5 (BONUS): Shooting gallery + +## BONUS -- Pew pew! @showdialog + +Time to add some sound effects to your project! + +## Pew pew! + +Let's add a sound whenever a projectile is fired. +We'll use a new event handler for this. + +1. From the ``||sprites:Sprites||`` drawer, add an +``||sprites:on created||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player)||`` +container to your workspace. +1. Change the block so that it reads as follows: +``||sprites(noclick):on created sprite of kind Projectile||`` +1. Into your new container, drag a +``||music:play sound (ba ding) until done||`` +block from the +``||music:Music||`` drawer. +1. Change the sound to **pew pew**. +1. Change the playback mode to **in background**. + +This new event handler will run anytime a projectile is created in your project. + +Test your project to see if your code runs as expected. +View the hint if you need help. + +Feel free to try different sounds! + +```block +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +``` + +## Crash! + +Now, let's add a sound whenever an enemy is destroyed. +We'll use yet another new event handler for this. + +1. From the ``||sprites:Sprites||`` drawer, add an +``||sprites:on destroyed||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player)||`` +container to your workspace. +1. Change the block so that it reads as follows: +``||sprites(noclick):on created sprite of kind Enemy||`` +1. Into your new container, drag a +``||music:play sound (ba ding) until done||`` +block from the +``||music:Music||`` drawer. +1. Change the sound to **small crash**. +1. Change the playback mode to **in background**. + +This new event handler will run anytime an enemy is destroyed. + +Test your project to see if your code runs as expected. +View the hint if you need help. + +Feel free to try different sounds! + +**Question**: Did you notice that the crash plays when an enemy flies off of the screen, +too? Why is that? How could you fix it? + +~hint Answer +Instead of using the new "on destroyed" event handler, you could add the +sound blocks to the existing event handlers where the enemies are destroyed. +hint~ + +```block +sprites.onDestroyed(SpriteKind.Enemy, function (sprite) { + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +``` + +## Complete! @showdialog + +Good work! If you still have some time, then give these other bonuses a try! + +- Let the player fire projectiles with the **B** button also, but use +this block instead: +```block +let projectile = sprites.createProjectileFromSprite(sprites.projectile.explosion1, heroSprite, 0, -50) +``` +How does this block work compared to the blocks that you used for the **A** button? + +- Create your own images for the sprites. +- Create a background image. + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +controller.B.onEvent(ControllerButtonEvent.Pressed, function () { + projectile = sprites.createProjectileFromSprite(sprites.projectile.explosion1, heroSprite, 0, -50) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Enemy, function (sprite) { + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +let projectile: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0202-part1.md b/docs/courses/csintro/unit-2/s01-lab0202-part1.md new file mode 100644 index 00000000000..aec064a486c --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0202-part1.md @@ -0,0 +1,226 @@ +# Lab 2.2 Part 1: Introduction to variables + +## Introduction to variables @showdialog + +Variables help us keep track of information that our project needs. +MakeCode Arcade has a bunch of built-in variables that we can use, like +a player's score or lives. + +We can create our own variables, too! + +## Splash! + +Let's learn about a new block that you can use to display a message on +the screen. + +1. In your +``||loops(noclick):on start||`` +container, add a +``||game:splash ("")||`` +block. You can find that block in the ``||game:Game||`` drawer of the toolbox. +1. Type a phrase into the new block. Any phrase will do! + +Run your project to see how this block works. + +```blocks +game.splash("Hello, world!") +``` + +## Join together! + +Instead of just one space for text, let's give ourselves some more room. +We need a new block ... and this time, it's in a secret location! + +The drawer that we need is called ``||text:Text||`` **Text**, +and it is in the **Advanced** section of the toolbox. +Click on **Advanced** to see the secret drawers in the toolbox! + +Check the hint to see a screenshot showing this secret drawer. + +1. From the +``||text:Text||`` +**Text** +drawer, drag a +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block into your +``||game(noclick):splash("")||`` +block. + +Run your project to see how these blocks work together. +Check the hint if you need help. + +![Advanced drawers in the toolbox.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L02.02.P01.text_drawer.png) + +```blocks +game.splash("Hello" + "World") +``` + +## Speak your mind! + +Let's learn more about how the **Join** block works. + +1. Change the text in your +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block. +1. Run your project and see how it's changed. +1. Do this a few times until your understand how this block works. + +Now, let's try something else! + +- Expand the +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block. + +~hint How do I expand a block? +Some blocks have a plus sign on the right side of the block. Select the +plus sign to expand it. The block will show more information! +hint~ + +- Now, collapse the +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block. + +~hint How do I collapse a block? +Some blocks will have a minus sign on the right side of the block. +Select the minus sign to collapse it. The block will hide some information! +hint~ + +Play around with the +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block. +Expand it, collapse it, and enter your own text. +Watch how your project responds. + +When you are ready, move on to the next step. + +## Only room for three! + +Let's get our project ready for our first variable. + +1. Expand or collapse your +``||text:join ("Hello") ("World")||`` +**join ("Hello") ("World")** +block +so that it shows three spaces for text. +1. In the first space, enter **You are ** *with a space at the end*. +1. In the second space, enter your age (or any number that you wish). +1. In the third space, enter ** years old** *with a space at the beginning*. + +Run your project to see how it works. +Check the hint if you need help. + +**Question**: Why were the spaces in steps 2 and 4 necessary? + +```blocks +game.splash("You are " + "0" + " years old") +``` + +## Whose age? + +Our project works, but it doesn't show the player's age ... it shows yours. +Sure, we could ask the player to change the code and type in their age, +but that's not very friendly! + +Let's get our project ready so that we can ask the player to enter their age. +To do that, we need to create a variable. + +1. Open the ``||variables:Variables||`` drawer. +1. At the top of the drawer, select the +**Make a Variable...** +button. +1. In the dialog that appears, enter an appropriate name (like *age*). +1. Select the **Ok** button. + +Now, we have a variable that we can use! + +1. Drag a +``||variables:set age to (0)||`` +block **to the top** of your +``||loops(noclick):on start||`` +container. +1. Set the variable's value to your own age. + +We've created a variable. Now, we need to use it! + +1. From the +``||variables:Variables||`` drawer, drag an +``||variables:age||`` +block and drop it in the middle spot of your +``||text:join ("You are ") ("0") (" years old.")||`` +**join ("You are ") ("0") (" years old.")** +block. +1. Run your project to see how it works. +1. Change the value of the **age** variable and watch how your program +responds. +1. Do this a few times until you are comfortable with how the variable +works with the **join** block. + +Check the hint if you need help. + +```blocks +let age: number = 14 +game.splash("You are " + age + " years old.") +``` + +## Does order matter? + +What happens when we switch the order of these two blocks? + +1. Switch the order of the blocks in your +``||loops(noclick):on start||`` +container. +1. Run your code to see how your program responds. + +**Question**: Does the order of these two blocks matter? Why or why not? + +## I want your input! + +We have a variable now, but we still haven't asked the player for their age. +Let's do that now! + +1. From the +``||game:Game||`` drawer, drag an +``||game:ask for number ("")||`` +block and drop it into the red block +that sets the value of your variable. +1. In this new block, enter a prompt for the player, +like "How old are you?" + +Check the hint if you need help. + +```blocks +let age = game.askForNumber("How old are you?") +game.splash("You are " + age + " years old.") +``` + +## Ooh! A keyboard! + +Run your program and notice how it responds now. + +Now you know how to display a keyboard on the screen! + +Use these instructions to interact with the keyboard. + +- Use the D-pad (up, down, left, and right) to move the cursor. +- To press a key, use the **A** button. +- If you make a mistake, use the **B** button as a backspace. +- When you are done, use the D-pad to move the cursor to the **Ok** button. +Then, use the **A** button to select **Ok**. + +Run your project a few times so that you see how your project works +and to get used to the on-screen keyboard. + +## Complete! @showdialog + +Good work! We will return to these ideas in the next couple of lessons. +For now, move on to Part 2! + +```ghost +let age = game.askForNumber("How old are you?") +game.splash("You are " + age + " years old.") +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0202-part2.md b/docs/courses/csintro/unit-2/s01-lab0202-part2.md new file mode 100644 index 00000000000..02a472f6f61 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0202-part2.md @@ -0,0 +1,173 @@ +# Lab 2.2 Part 2: Introduction to variables + +## How many items? @showdialog + +Let's look at another way that we can use variables. + +In this project, we will use a variable to keep track of how many sprites +are on the screen. + +## Let's find a hero! + +First, let's create a hero for our story. + +Create your hero sprite. Add block to your project so that your hero: + +- Has an appropriate variable name. +- Has an image assigned to it. +- Is controlled by the player with the directional pad. +- Stays on the screen. + +Check the hint if you need help and to verify your code. + +```blocks +let heroSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +``` + +## Add some sprites! + +Now, let's add a sprite to the screen whenever the player wants one. + +Add an event handler to your project so that, whenever the player +presses the **A** button, a new sprite appears. Make sure the new sprite: + +- Has an appropriate variable name. +- Has an image assigned to it. +- Has a kind assigned to it (anything except *Player*). +- Appears at a random location on the screen. + +Run your project to see if it works as you expect it to. +Check the hint if you need help. + +```blocks +let foodSprite: Sprite = null +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + foodSprite = sprites.create(sprites.food.smallStrawberry, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +``` + +## Story time! + +Let's create a simple story for your project. + +- Who is your hero? +- What are the objects that your hero is adding to the screen? +- Add an appropriate splash screen at the start of your game +that explains your story. + +When you have added a story to your game, move on to the next step. + +## Count 'em up! + +Now, let's keep track of how many items the player has added to the screen. + +1. Make a new variable for your project. This variable will store +the number of sprites that the player has created. Give the variable +an appropriate name. +1. Add a block to your +``||loops(noclick):on start||`` +container that sets +the value of the variable to zero. +1. In your event handler for the **A** button, add a block that changes +the value of your variable by **1**. + +~hint What is a increment? +When we increase the value of a variable by one, we often say that we are +"incrementing" the variable. +hint~ + +We've created the variable, but we aren't using it yet. We'll do that next! + +```blocks +let foodSprite: Sprite = null +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + foodSprite = sprites.create(sprites.food.smallStrawberry, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) + // @highlight + foodCount += 1 +}) +``` + +## You don't say! + +Let's show a message whenever the player wants to know how many sprites +are on the screen. + +Add an event handler for the **B** button to your workspace. +In your event handler: + +- Use a +``||game:splash||`` +block or a +``||sprites:say||`` +block to display the value of your variable. +- Feel free to use a +**join** block to make your message more interesting! + +Run your project to see if it works as expected. +Check the hint if you need some help. + +```blocks +let foodCount = 0 +controller.B.onEvent(ControllerButtonEvent.Pressed, function () { + game.splash("I see " + foodCount + " strawberries!") +}) +``` + +## Pick up after yourself! + +Now, let's say that the player can pick up objects, too. + +1. Add an +``||sprites:on overlap||`` +event handler to your workspace. +1. Change the block so that it runs when the player collides with another sprite. +1. In the event handler, destroy the sprite when the player touches it. +1. Remember to update your counting variable! + +Run your project to see if it works as expected. +Check the hint if you need some help. + +~hint What is a decrement? +When we decrease the value of a variable by one, we often say that we are +"decrementing" the variable. +hint~ + +```blocks +let foodCount = 0 +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + foodCount += -1 +}) +``` + +## Complete! @showdialog + +Good work! You have learned a few ways to use variables! + +Submit your project to your instructor if requested to do so. + +```ghost +controller.B.onEvent(ControllerButtonEvent.Pressed, function () { + game.splash("I see " + foodCount + " strawberries!") +}) +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + foodSprite = sprites.create(sprites.food.smallStrawberry, SpriteKind.Food) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) + foodCount += 1 +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + foodCount += -1 +}) +let foodSprite: Sprite = null +let foodCount = 0 +foodCount = 0 +let heroSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +heroSprite.say("Hi!") +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-2/s01-lab0203.md b/docs/courses/csintro/unit-2/s01-lab0203.md new file mode 100644 index 00000000000..c9ea3aabc2b --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0203.md @@ -0,0 +1,91 @@ +# Lab 2.3: Variables and math + +## Variables and math! @showdialog + +Variables are helpful for our programs, +since they let us store information that we need in our program. + +Variables become even more powerful when we can combine them! + +In this lab, you will discover different ways to use math with variables. + +## Ooh! A playground! + +First, let's build a playground. + +Add blocks to your +``||loops(noclick):on start||`` +container that: + +- Asks the player for two numbers. +- Stores those numbers in two different variables. + +View the hint to check your code. + +```blocks +let number1 = game.askForNumber("First number?") +let number2 = game.askForNumber("Second number?") +``` + +## Sum? Product? What's the difference? + +Now, let's use these two numbers that your project has collected from the player. + +Add blocks to your +``||loops(noclick):on start||`` +container so that your project shows the *sum* of the two numbers. +The block to add two numbers is in the +``||math:Math||`` +drawer. + +Run your project to test that it works. Try different numbers. +View the hint to check your code. + +~hint What is a sum? +The sum is the result of two numbers added together. In other words, +use the addition (or "plus") operator. +hint~ + +```blocks +let number1 = game.askForNumber("First number?") +let number2 = game.askForNumber("Second number?") +game.splash("" + number1 + " + " + number2 + " = " + (number1 + number2)) +``` + +## Complete @showdialog + +Good work! Now, learn about some of the blocks in the ``||math:Math||`` drawer! + +- Start with the block that you already have in your project. +Notice that the "plus sign" can be changed to different symbols. +- For each of these operations, run your project a few times. + - Enter some numbers. (Try small ones at first.) + - Make a record of each of your trials. + (In other words, write down the numbers that you enter each time + you run your program.) + - See if you can figure out what each operation does. +- Once you have explored all of the operators in this first math block, +try some of the remaining blocks in the +``||math:Math||`` +drawer in the same way. + - You may not understand all of the operators that you find. That's OK! + - Be sure to write down all of your trials to show the work you have done. + +Your instructor may give you a worksheet that you can use to write down +your trials and your explanations. If not, then use any method that you like +to record your trials and your results. + +Have fun! + +```ghost +let number1 = game.askForNumber("First number?") +let number2 = game.askForNumber("Second number?") +game.splash("" + number1 + " + " + number2 + " = " + (number1 + number2)) +let number3 = Math.sqrt(number1) +number3 = 0 % 1 +number3 = Math.min(0, number1) +number3 = Math.abs(number1) +number3 = Math.round(number1) +number3 = Math.constrain(0, 0, 0) +number3 = Math.map(0, 0, 1023, 0, 4) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0204.md b/docs/courses/csintro/unit-2/s01-lab0204.md new file mode 100644 index 00000000000..a71a0d2e792 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0204.md @@ -0,0 +1,93 @@ +# Lab 2.4: Silly story time! + +## Silly stories @showdialog + +In this lab, you will create a silly story in MakeCode Arcade! + +## First draft + +First, you need to create a silly story. + +Start by writing a story. Nothing very long. +Just two or three sentences for now. + +To create a silly version of your story, remove some of the words +and replace them with blanks. +For each blank, decide what prompt you will use. + +You could ask for a part of speech (like, "Enter a noun"). +Or, you could ask for something a little more specific +(like, "Enter a number between 1 and 10"). + +It's up to you! + +## Ask me anything! + +Now, let's collect information from the player. + +1. For each of the blanks in your silly story, create a variable. +Give your variable a good name (like *adjective* or *firstNoun*). +1. Ask the player to provide a value for each variable. + - Use the + ``||game:ask for number||`` + for variables that will hold numbers. + - For the rest of the variables, use the + ``||game:ask for string||`` + block instead. + +Run your project to make sure that it asks the player for all of the +information that you need for your story. + +Check the hint if you need some help. + +```blocks +let aNumber = game.askForNumber("Enter a number.") +let aColor = game.askForString("Enter a color.") +``` + +## Tell me a story! + +Now it's time to show your story. We'll start with a simple presentation. + +Use a +``||game:show long text||`` +block with a **join** block +to display your silly story. + +Remember that the **join** block is the **Text** drawer in the +**Advanced** section of the toolbox. + +Check the hint if you need some help. + +```blocks +let aNumber = game.askForNumber("Enter a number.") +let aColor = game.askForString("Enter a color.") +game.showLongText("I am " + aNumber + " years old and my hair color is " + aColor + "!", DialogLayout.Center) +``` + +## Complete @showdialog + +Good work! Now, get creative! Try some of these ideas, or try some of your own! + +- Illustrate your story with a background and sprites. +- Is there a hero sprite, and if so, will the player be in control of it? Will any sprites move automatically? +- Expand your story. Perhaps include multiple scenes. +- Add sound effects to your story. +- Add background music to your story. Explore the + ``||music:play melody||`` + block and the + ``||music:play song||`` + block, found in the + ``||music:Music||`` + drawer of the toolbox. + +Have fun! + +```ghost +let aNumber = game.askForNumber("Enter a number.") +let aColor = game.askForString("Enter a color.") +game.splash("I am " + aNumber + " years old and my hair color is " + aColor + "!") +game.showLongText("", DialogLayout.Center) +music.play(music.stringPlayable("- - - - - - - - ", 120), music.PlaybackMode.UntilDone) +music.play(music.createSong(hex`00780004080200`), music.PlaybackMode.UntilDone) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0205-part1.md b/docs/courses/csintro/unit-2/s01-lab0205-part1.md new file mode 100644 index 00000000000..b3397fd97d5 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0205-part1.md @@ -0,0 +1,181 @@ +# Lab 2.5 Part 1: Guess what! + +## Pick a number! @showdialog + +Let's make a game where the player guesses a number that the game show host +has chosen. + +## Set the stage + +Let's set the stage with a sprite for the game show host. + +1. To your +``||loops(noclick):on start||`` +container, add a block that creates a +sprite for your game show host. + - Give the sprite an appropriate variable name. + - Give the sprite an appropriate image. + - Have the game show host say, + "Guess which number I am thinking of." + - At the bottom of your + ``||loops(noclick):on start||`` + container, add a + ``||loops:pause (500) ms||`` + block from the + ``||loops:Loops||`` + drawer. + - Set the pause to `1000` milliseconds. We want the game to pause + long enough for the player to read the prompt. + - Feel free to change the length of the pause to a different value. + +Run your project to make sure it works as expected. +View the hint if you need some help. + +```blocks +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(1000) +``` + +## Let's be random! + +Now, we need the host to pick a number. + +1. Create a new variable that will hold your game show host's secret number. +1. To the **bottom** of your +``||loops(noclick):on start||`` +container, +set the value of your new variable to a random number from 1 to 10. + - Remember that the + ``||math:pick random||`` + block is in the + ``||math:Math||`` + drawer. + +View the hint if you need some help. + +```blocks +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(2000) +// @highlight +let hostsNumber = randint(1, 10) +``` + +## Take a guess! + +Now, let's get the player's guess. + +1. Create a new variable that will hold the player's guess. +1. To the **bottom** of your +``||loops(noclick):on start||`` +container, ask the player for a number. +Store the guess in your new variable. + +Run your project to make sure it works as expected. +View the hint if you need some help. + +```blocks +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(2000) +let hostsNumber = randint(1, 10) +// @highlight +let playerGuess = game.askForNumber("Choose a number between 1 and 10.") +``` + +## Was I right? + +Now, let's see if the player was correct! To do so, we need to create a +*conditional statement*. + +~hint What is a conditional statement? +A conditional statement is sometimes called an "if" statement. +It tests whether something is true or false. +hint~ + +1. To the **bottom** of your +``||loops(noclick):on start||`` +container, +add an +``||logic:if (true) then [] else []||`` +block. You'll find that block in the +``||logic:Logic||`` +drawer. +1. In place of the +``||logic(noclick):(true)||`` +value, drop a +``||logic:(0) = (0)||`` +block. You will find that in the +``||logic:Logic||`` drawer, also. +1. Use blocks from the +``||variables:Variables||`` +drawer to make the +block say something like this: +``||logic(noclick):if||`` ``||variables(noclick):hostsNumber||`` +``||logic(noclick):=||`` ``||variables(noclick):playerGuess||`` + +Use the hint to check your code. We'll fill in the +``||logic(noclick):if||`` +container next. + +```blocks +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(2000) +let hostsNumber = randint(1, 10) +let playerGuess = game.askForNumber("Choose a number between 1 and 10.") +if (hostsNumber == playerGuess) { + +} else { + +} +``` + +## Say what? + +Now, complete the ``||logic(noclick):if||`` container. + +- In the top half of the +``||logic(noclick):if||`` +container, add blocks to make the game show host +say that the player was correct. +Use a **join** block to also show the host's number. +- In the bottom half of the +``||logic(noclick):if||`` +container, add block to make the game show host +say that the player was incorrect. +Use a **join** block to also show the host's number. + +Run your project to see if your code works as expected. +Use the hint to check your code. + +```blocks +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(2000) +let hostsNumber = randint(1, 10) +let playerGuess = game.askForNumber("Choose a number between 1 and 10.") +if (hostsNumber == playerGuess) { + hostSprite.sayText("Great job! " + hostsNumber + " was my number!") +} else { + hostSprite.sayText("Sorry! " + hostsNumber + " was my number.") +} +``` + +## Complete @showdialog + +Good work! Let's use conditional statements to create another game in Part 2! + +```ghost +let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) +hostSprite.sayText("Guess which number I am thinking of.") +pause(2000) +let hostsNumber = randint(1, 10) +let playerGuess = game.askForNumber("Choose a number between 1 and 10.") +if (hostsNumber == playerGuess) { + hostSprite.sayText("Great job! " + hostsNumber + " was my number!") +} else { + hostSprite.sayText("Sorry! " + hostsNumber + " was my number.") +} +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0205-part2.md b/docs/courses/csintro/unit-2/s01-lab0205-part2.md new file mode 100644 index 00000000000..d451b3db8cc --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0205-part2.md @@ -0,0 +1,72 @@ +# Lab 2.5 Part 2: Guess what! + +## Is it even? @showdialog + +Many programs need to test whether a number is even or odd. Let's write one! + +## Collecting the evidence + +First, let's get a number to test from the player. + +1. Create a variable that will store the player's number. +1. To your +``||loops(noclick):on start||`` +container, +add blocks that ask the player for a number. +Store the response in your new variable. + +Run your project to test your code. You can also check the hint. + +```blocks +let theNumber = game.askForNumber("Enter a number.") +``` + +## So, is it even or not? + +Now, let's display a message to say whether the number is even. + +You guessed it: We need to write another conditional statement! + +1. To the **bottom** of your +``||loops(noclick):on start||`` +container, add an +``||logic:if (true) then [] else []||`` +block. +1. Use blocks from the +``||variables:Variables||``, +``||logic:Logic||``, and +``||math:Math||`` +drawers to make the block say the following: +``||logic(noclick):if||`` ``||math(noclick):remainder of||`` +``||variables(noclick):(your variable)||`` ``||math(noclick):/ (2)||`` +``||logic(noclick):= (0) then||``. +1. In each half of the ``||logic(noclick):if||`` container, +add blocks to display an appropriate message. + +~hint How do I know if the number is even? +If the number is even then, when you divide it by two, the remainder is zero. +hint~ + +Run your project to test your code. Check the hint if you get stuck. + +```blocks +let theNumber = game.askForNumber("Enter a number.") +if (theNumber % 2 == 0) { + game.splash("" + theNumber + " is even!") +} else { + game.splash("" + theNumber + " is not even.") +} +``` + +## Complete @showdialog + +Good work! Let's make a fortune telling device in Part 3! + +```ghost +let theNumber = game.askForNumber("Enter a number.") +if (theNumber % 2 == 0) { + game.splash("" + theNumber + " is even!") +} else { + game.splash("" + theNumber + " is not even.") +} +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0205-part3.md b/docs/courses/csintro/unit-2/s01-lab0205-part3.md new file mode 100644 index 00000000000..9e7a8935a3c --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0205-part3.md @@ -0,0 +1,109 @@ +# Lab 2.5 Part 3: Guess what! + +## Magic four ball! @showdialog + +Some people need help making big decisions. +You can help them by making a magic four ball. +It's like a magic eight ball, but with only four answers! + +## Ask me anything (again)! + +Let's set the scene so that the player has a character to talk to. + +1. In your +``||loops(noclick):on start||`` +container, create a sprite that represents +the fortune teller. + - Give the sprite variable an appropriate name. + - Give the sprite an appropriate image. + - Make the sprite say something like, + "Think of a question, then press the A button." + +Run your program and see if it behaves as expected. +Check the hint if you need some help. + +```blocks +let fortuneTellerSprite: Sprite = null +scene.setBackgroundColor(9) +fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +fortuneTellerSprite.sayText("Think of a question, then press the A button.") +``` + +## The future is ... anything! + +Now, let's respond to the player's question with a random response. + +1. Add a +``||controller:on (A) button (pressed)||`` +container to your +workspace. All of the following blocks will go in this container. +1. Create a new variable called **answer**. +1. Set this new variable to a random number from 1 to 4. +Remember that the +``||math:pick random||`` block is in the +``||math:Math||`` drawer. +1. Now, add an +``||logic:if (true) then [] else []||`` +block. +1. Select the **(+)** plus sign to add enough branches to your +``||logic(noclick):if||`` +block to handle four different options. +1. Add blocks to your +``||logic(noclick):if||`` +block to make each branch say +something like +``||logic(noclick):if||`` ``||variables(noclick):answer||`` +``||logic(noclick): = (1) then||`` +1. In each branch of the +``||logic(noclick):if||`` +block, make the fortune teller say a different message. + - Make each message unique. + - Be creative! + - Try to have an equal number of positive and negative responses. + +Run your program and see if it behaves as expected. +Check the hint if you need some help. + +```blocks +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + option = randint(1, 4) + if (option == 1) { + fortuneTellerSprite.sayText("Signs look good!") + } else if (option == 2) { + fortuneTellerSprite.sayText("Not very likely.") + } else if (option == 3) { + fortuneTellerSprite.sayText("Could be!") + } else { + fortuneTellerSprite.sayText("Try again later.") + } +}) +let option = 0 +let fortuneTellerSprite: Sprite = null +scene.setBackgroundColor(9) +fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +fortuneTellerSprite.sayText("Think of a question, then press the A button.") +``` + +## Complete @showdialog + +Good work! What are some other ways that you could use conditional statements? + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + option = randint(1, 4) + if (option == 1) { + fortuneTellerSprite.sayText("Signs look good!") + } else if (option == 2) { + fortuneTellerSprite.sayText("Not very likely.") + } else if (option == 3) { + fortuneTellerSprite.sayText("Could be!") + } else { + fortuneTellerSprite.sayText("Try again later.") + } +}) +let option = 0 +let fortuneTellerSprite: Sprite = null +scene.setBackgroundColor(9) +fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +fortuneTellerSprite.sayText("Think of a question, then press the A button.") +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0206-part1.md b/docs/courses/csintro/unit-2/s01-lab0206-part1.md new file mode 100644 index 00000000000..3b52685072a --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0206-part1.md @@ -0,0 +1,215 @@ +# Lab 2.6 Part 1: Changing conditions + +## There's only room for three of us! @showdialog + +Many games limit the number of projectiles that you can create at any one time. +Let's update one of your previous projects to do just that! + +## How many do you want? + +First, let's define the maximum number of projectiles that we can have +on the screen. + +1. Create a new variable that will hold the maximum number of projectiles +allowed on the screen. Call it something like **maxProjectiles**. +1. We also need a new variable that will keep track of the number of +projectiles currently on the screen. Call it something like +**projectileCount**. +1. In your +``||loops(noclick):on start||`` +container, set the value of +``||variables:maxProjectiles||`` +to **3**. +1. In your +``||loops(noclick):on start||`` +container, set the value of +``||variables:projectileCount||`` +to **0**. + +Check the hint if you need help. + +```blocks +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +// @highlight +maxProjectiles = 3 +// @highlight +projectileCount = 0 +``` + +## Count 'em up! + +Now we need to *increment* our variable when we create a projectile. + +1. In your +``||controller(noclick):on (A) button (pressed)||`` +container, +add a block that changes the +``||variables:projectileCount||`` +variable by **1**. + +We also need to *decrement* our variable when a projectile is destroyed. +The easiest way to do this is to add a new event handler. + +1. From the ``||sprites:Sprites||`` drawer, add an +``||sprites:on destroyed||`` ``||variables(sprites):sprite||`` +``||sprites:of kind (Player)||`` +block. +1. In this new container, change the kind to **Projectile**. +1. In this new container, +add a block that changes the +``||variables:projectileCount||`` +variable by **-1**. + +Run your project. You should not see any difference from before. Why not? +View the hint to check your code. + +```blocks +let plasmaSprite: Sprite = null +let projectileCount = 0 +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + // @highlight + projectileCount += 1 +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +``` + +## Testing! Testing! 1 ... 2 ... 3! + +Nothing seems different in your project. +We are counting the number of projectiles on the screen, +but we aren't doing anything to limit them. +Let's fix that! + +1. To the **top** of your +``||controller(noclick):on (A) button (pressed)||`` +container, add an +``||logic:if||`` +block. +1. Move all of the blocks beneath the +``||logic(noclick):if||`` +block inside of it. +1. Add blocks so that the ``||logic:if||`` block reads: +``||logic(noclick):if||`` ``||variables(noclick):projectileCount||`` +``||logic(noclick):is less than||`` ``||variables(noclick):maxProjectiles||``. + +Run your project and see if it limits the number of projectiles that you are +able to create. View the hint if you need help. + +```blocks +let plasmaSprite: Sprite = null +let projectileCount = 0 +let maxProjectiles = 0 +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +``` + +## Conclusion @showdialog + +Good job! Now, let's make the enemies speed up! On to Part 2! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0206-part2.md b/docs/courses/csintro/unit-2/s01-lab0206-part2.md new file mode 100644 index 00000000000..6c889b1d708 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0206-part2.md @@ -0,0 +1,170 @@ +# Lab 2.6 Part 2: Changing conditions + +## Here come the enemies ... faster! @showdialog + +Many games get more difficult the longer you play. +Let's update your game so that enemies fall faster as you play! + +## Variable speed + +We need to keep track of the current speed of the enemies. + +1. Take a look at your +``||game(noclick):on game update every (1000) ms||`` +container. +Make a note of the **vy** value for your enemy sprites. +1. Create a new variable that will keep track of the enemy speed. +Call it something like **enemySpeed**. +1. In your +``||loops(noclick):on start||`` +container, set the value of your new +variable to the value that you noted in Step 1. +1. Drop your variable in place of the number for your **vy** value. + +Run your project to make sure nothing has changed. +Check the hint if you need help. + +```blocks +let enemySprite: Sprite = null +let enemyVelocity = 25 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + // @highlight + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +## Let's speed things up! + +Now, let's make the game more difficult the longer you play. + +1. Find the +``||sprites(noclick):on overlap||`` +container where enemies are +destroyed when they collide when a projectile. +1. In that +``||sprites(noclick):on overlap||`` +container, add a block that +changes the enemy speed variable. Set the change to a small value. + +Run your project and see how it works. +As enemies are destroyed, you should see new enemies moving faster. +Experiment with different values to find a good speed. +Check the hint if you need help. + +```blocks +let enemyVelocity = 25 +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + // @highlight + enemyVelocity += 5 +}) +``` + +## Conclusion @showdialog + +Good job! But maybe that's too fast? Let's put a speed limit on the enemies. +On to Part 3! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, 25) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +let enemyVelocity = 25 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0206-part3.md b/docs/courses/csintro/unit-2/s01-lab0206-part3.md new file mode 100644 index 00000000000..9ee65694723 --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0206-part3.md @@ -0,0 +1,187 @@ +# Lab 2.6 Part 3: Changing conditions + +## Not too fast! @showdialog + +At some point, your enemies will be moving too fast. +Let's update your game so that enemies have a speed limit! + +## What's the limit? + +First, let's determine the enemy's speed limit. + +1. Create a new variable that sets the enemy speed limit. +Call it something like **maxEnemySpeed**. +1. In your +``||loops(noclick):on start||`` +container, set your new variable to +a reasonable speed limit. + +Run your project to make sure nothing has changed ... yet! +Check the hint to verify your code. + +```blocks +let maxEnemySpeed = 0 +let enemyVelocity = 0 +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +enemyVelocity = 25 +// @highlight +maxEnemySpeed = 150 +``` + +## Mind your speed! + +Now, let's enforce our new speed limit. + +1. Go back to that +``||sprites(noclick):on overlap||`` +container where enemies are +destroyed when they collide when a projectile. +1. Add blocks **to the bottom** of that container +to create the following ``||logic(noclick):if||`` statement: + +``||logic:if||`` ``||variables:enemyVelocity||`` +``||logic:is greater than||`` +``||variables:maxEnemySpeed||`` ``||logic:then||`` + +- ``||variables:set (enemyVelocity) to (maxEnemySpeed)||`` + +Run your project to test your speed limit. Try different speed limit values +and see what works best for your project. +Check the hint if you need help. + +```blocks +let enemyVelocity = 0 +let maxEnemySpeed = 0 +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 + // @highlight + if (enemyVelocity > maxEnemySpeed) { + enemyVelocity = maxEnemySpeed + } +}) +``` + +## Conclusion @showdialog + +Good job! Now, let's ask the player how difficult they want the game to be. +On to Part 4! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +let enemyVelocity = 25 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 + if (enemyVelocity > maxEnemySpeed) { + enemyVelocity = maxEnemySpeed + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let maxEnemySpeed = 0 +let enemyVelocity = 0 +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +enemyVelocity = 25 +maxEnemySpeed = 150 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` diff --git a/docs/courses/csintro/unit-2/s01-lab0206-part4.md b/docs/courses/csintro/unit-2/s01-lab0206-part4.md new file mode 100644 index 00000000000..3dfe71428ed --- /dev/null +++ b/docs/courses/csintro/unit-2/s01-lab0206-part4.md @@ -0,0 +1,234 @@ +# Lab 2.6 Part 4: Changing conditions + +## Starting difficulty @showdialog + +Let's update your game so that the player can choose a difficulty level! + +## Selecting difficulties + +Let review some of the variables that we have set for your project. +Let's consider this the "normal difficulty" level. + +**Normal difficulty** + +- Maximum projectiles: 3 +- Starting enemy speed: 25 +- Maximum enemy speed: 150 + +Jot down some values that you think are reasonable for an **easy** difficulty +level. + +Also jot down some values for a **challenging** difficulty level. + +## What would you like? + +To being, let's ask the player for a difficulty level. + +1. Create a new variable that will store the player's choice of difficulty. +Give the variable a good name. How about **difficulty**? +1. In your +``||loops(noclick):on start||`` +container, ask the player for a +difficulty number and store it in your new variable. + +Run your project to make sure nothing has changed after choosing a difficulty. +Check the hint to verify your code. + +```blocks +let projectileCount = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +projectileCount = 0 +// @highlight +let difficulty = game.askForNumber("Difficulty?") +``` + +## Set 'em up! + +Now, let's set some values to reflect the player's difficulty selection. + +1. At the **bottom** of your +``||loops(noclick):on start||`` +container, add an +``||logic:if (true) then [] else []||`` +block. +1. Add enough branches to test three options for our difficulty. +1. Add conditional statements to test whether the player selected +a difficulty of +**1**, **2**, or **3**. +1. In each branch of the +``||logic(noclick):if||`` block, +set the three variables +to the values that you noted at the beginning of this activity. + +Run your project to test the three different difficulties. +Try different values until you are happy with the three difficulties. + +Check the hint if you need help. + +```blocks +let maxEnemySpeed = 0 +let enemyVelocity = 0 +let maxProjectiles = 0 +let projectileCount = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +projectileCount = 0 +let difficulty = game.askForNumber("Difficulty?") +// @highlight +if (difficulty == 1) { + maxProjectiles = 5 + enemyVelocity = 15 + maxEnemySpeed = 100 +} else if (difficulty == 3) { + maxProjectiles = 2 + enemyVelocity = 50 + maxEnemySpeed = 200 +} else { + maxProjectiles = 3 + enemyVelocity = 25 + maxEnemySpeed = 150 +} +``` + +## Conclusion @showdialog + +Congratulations! You've built a game that changes as the game is played and +allows the player to choose a difficulty. + +- What other settings could you change or add to make your game +easier or harder to play? +- Are there other changes you could make to make the game easier or harder? + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 + if (enemyVelocity > maxEnemySpeed) { + enemyVelocity = maxEnemySpeed + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let maxEnemySpeed = 0 +let enemyVelocity = 0 +let projectileCount = 0 +let maxProjectiles = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +maxProjectiles = 3 +projectileCount = 0 +enemyVelocity = 25 +maxEnemySpeed = 150 +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile) + plasmaSprite.setPosition(heroSprite.x, heroSprite.y) + plasmaSprite.setVelocity(0, -50) + plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true) + projectileCount += 1 + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(1) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.spray, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + enemyVelocity += 5 + if (enemyVelocity > maxEnemySpeed) { + enemyVelocity = maxEnemySpeed + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeLifeBy(-1) + sprites.destroy(otherSprite, effects.fire, 500) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let plasmaSprite: Sprite = null +let maxEnemySpeed = 0 +let enemyVelocity = 0 +let maxProjectiles = 0 +let projectileCount = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player) +heroSprite.setPosition(80, 110) +heroSprite.setStayInScreen(true) +controller.moveSprite(heroSprite) +info.setScore(0) +info.setLife(3) +projectileCount = 0 +let difficulty = game.askForNumber("Difficulty?") +if (difficulty == 1) { + maxProjectiles = 5 + enemyVelocity = 15 + maxEnemySpeed = 100 +} else if (difficulty == 3) { + maxProjectiles = 2 + enemyVelocity = 50 + maxEnemySpeed = 200 +} else { + maxProjectiles = 3 + enemyVelocity = 25 + maxEnemySpeed = 150 +} +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy) + enemySprite.setPosition(randint(8, 152), 0) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` diff --git a/docs/courses/csintro/unit-3/s01-lab0301-part1.md b/docs/courses/csintro/unit-3/s01-lab0301-part1.md new file mode 100644 index 00000000000..94a0a05ec44 --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0301-part1.md @@ -0,0 +1,159 @@ +# Lab 3.1 Part 1: Introduction to loops + +## Repeat that, please! @showdialog + +In this lab, we will explore a family of loops called *definite loops*. + +*Definite loops* are loops that run a specific number of times. + +In Part 1, we'll use one of those loops: The **repeat** loop. + +```block +let foodSprite: Sprite = null +for (let index = 0; index < 6; index++) { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Player) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +} +``` + +## Take an apple; leave an apple + +Let's create a hero character and drop food randomly on the screen. + +1. Create a sprite for your hero character. + - Give the sprite's variable an appropriate name. + - Give the sprite an image. +1. Allow the player to move the hero sprite around the screen. +1. Whenever the player presses **A**, add a sprite to the screen. + - Give the new sprite's variable an appropriate name. + - Give the sprite an image. + - Place the sprite at a random location on the screen. + +Run your project and verify that it works as described. +Check the hint if you need any help. + +```blocks +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Player) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) +}) +let foodSprite: Sprite = null +let heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +controller.moveSprite(heroSprite) +``` + +## Drop two! + +Instead of dropping just one piece of fruit (or other food), let's say we +wanted to drop two pieces of food. That's easy enough to do: just duplicate +the blocks that we have. + +But what if we wanted to drop three? Or five? +Or ten? Or what if you wanted to change the number of sprites throughout +the game? + +There is a better way to do this: Use a **repeat** loop. + +1. From the +``||loops:Loops||`` drawer, drop a +``||loops:repeat (4) times||`` +loop into your +``||controller(noclick): on (A) button (pressed)||`` +container. +1. Move the other blocks in that container to the **inside** of the +``||loops(noclick):repeat||`` container. +1. Change the number of repeats to **2**. + +Run your project and verify that the player drops **two** pieces of food +each time you press **A**. + +Check the hint if you need help. + +```blocks +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + for (let index = 0; index < 2; index++) { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Player) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) + } +}) +let foodSprite: Sprite = null +``` + +## Kick the tires! + +Give your new loop a try! As you try different **repeat** values, +answer the questions below. + +**Questions** + +- Are there any numbers that are **not** allowed as a repeat value? +- Are there any numbers that work in unexpected ways? +- How might you use a **repeat** block in your own projects? + +## Food fight! + +Instead of dropping food at random locations, let's throw projectiles +from the player. + +1. **Delete** all of the blocks inside of the ``||loops(noclick):repeat||`` container. +Keep the loop, though! +1. Add the following blocks to your ``||loops(noclick):repeat||`` loop: + 1. Create a variable called **speedX**. + 1. Set **speedX** to a random value between 10 and 40. + 1. Create another variable called **speedY**. + 1. Add blocks so that it reads: + ``||variables:set speedY to||`` ``||math:50 -||`` + ``||variables:speedX||``. + 1. Create a projectile that starts at your hero sprite with + velocities **speedX** and **speedY**. + +These blocks will send the projectiles in random directions, but will +keeps their speeds roughly the same. + +Run your project and see how it operates differently from before. + +Try different repeat values! + +How might you use this mechanism in your own projects? + +Check the hint if you need any help. + +```block +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + for (let index = 0; index < 2; index++) { + let speedX = randint(10, 40) + let speedY = 50 - speedX + let foodSprite: Sprite = sprites.createProjectileFromSprite(sprites.food.smallApple, heroSprite, speedX, speedY) + } +}) +``` + +## Complete! @showdialog + +Good work! You have worked with the **repeat** loop! + +Try these extensions if you have time: + +- Can you generate a random number of projectiles with each button press? +- Because both speed values are positive, the projectiles always move +toward the bottom-right corner of the screen. Can you find a way to make +the directions more random? +- Instead of sending the projectiles in random directions, can you +distribute them more uniformly around the hero? + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + for (let index = 0; index < 2; index++) { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Player) + foodSprite.setPosition(randint(8, 152), randint(8, 112)) + speedX = randint(10, 40) + speedY = 50 - speedX + foodSprite = sprites.createProjectileFromSprite(sprites.food.smallApple, heroSprite, speedX, speedY) + } +}) +let speedY = 0 +let speedX = 0 +let heroSprite: Sprite = null +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +controller.moveSprite(heroSprite) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-3/s01-lab0301-part2.md b/docs/courses/csintro/unit-3/s01-lab0301-part2.md new file mode 100644 index 00000000000..deae28770bd --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0301-part2.md @@ -0,0 +1,168 @@ +# Lab 3.1 Part 2: Introduction to loops + +## For! @showdialog + +In this lab, we will explore a family of loops called *definite loops*. + +*Definite loops* are loops that run a specific number of times. + +In Part 1, we learned about the **repeat** loop. + +Now, we will learn about the **for** loop. + +```block +let foodSprite: Sprite = null +for (let index = 0; index < 6; index++) { + foodSprite = sprites.create(sprites.food.smallApple, SpriteKind.Player) + foodSprite.setPosition(10 + index * 20, 10) +} +``` + +## What's the same? What's different? + +Sometimes, we want to repeat a set of blocks, but we need to make some +calculations based on how many times we've been through the loop. + +The simplest tool for this task is the **for** loop. + +Look at the code in this project. Run it and see how the sprites appear. + +Now, look *closely* at the blocks that create the sprites. + +Each sprite uses a pair of blocks. + +- What is the same about the blocks in each pair? +- What is different in each pair? + +Head to the next step when you are ready. + +## For! Again! + +Did you notice that the *only* difference in each pair is the number +that is multiplied with the **distance** variable? + +- In the first pair, that multiplier is **zero**. +- In the second pair, the multiplier is **one**. +- In the next, it is **two**. +- In the last, it is **three**. + +We have a loop that does *exactly* that! +It counts starting at zero, and counts up to a number that you choose. +It's the ``||loops(noclick):for||`` block! + +Move to the next step to learn how to use the ``||loops(noclick):for||`` loop +in this project. + +## Step aside! + +Let's replace these repetitive blocks with a **for** loop. + +1. Drag the blocks that create the sprites off to the side. +We will use a couple of them shortly. +1. At the bottom of the +``||loops(noclick):on start||`` +container, add a +``||loops:for||`` ``||variables(loops):index||`` +``||loops:from 0 to (4)||`` +block. +1. Change the ``||loops(noclick):for||`` loop so that +``||variables(noclick):index||`` +counts from +**0** to **3** (or any other number that you like). +1. Drag **just one pair** of blocks that creates and places a sprite +on the screen into the +``||loops(noclick):for||`` container. + +Run your project and check the simulator. It might not look like it's +working correctly, but it is! We need to make one minor adjustment, though. + +Compare your code to the hint before moving forward. + +```blocks +let duckSprite: Sprite = null +let spriteX = 15 +let spriteY = 10 +let distance = 20 +for (let index = 0; index <= 4; index++) { + duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) + duckSprite.setPosition(spriteX + 0 * distance, spriteY) +} +``` + +## Use the index! + +The ``||loops(noclick):for||`` loop uses the ``||variables(noclick):index||`` variable +to count, but we are not using it inside of our loop! Let's fix that. + +- From the top of the +``||loops(noclick):for||`` container, drag a copy of the +``||variables(noclick):index||`` variable and drop it into the place +that is being multiplied by +``||variables(noclick):distance||``. + +Run your project again and see that the ducks are in a row again! + +Check the hint if you need help. + +```blocks +let duckSprite: Sprite = null +let spriteX = 15 +let spriteY = 10 +let distance = 20 +for (let index = 0; index <= 4; index++) { + duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) + duckSprite.setPosition(spriteX + index * distance, spriteY) +} +``` + +## Complete! @showdialog + +Good work! + +Notice how much simpler your code looks now that you've used a +**for** loop! + +How might you use this in your own projects? + +Try these extensions if you have time: + +- Change the numbers and notice how the sprites are drawn on the screen. +- Can you generate a single column of sprites instead of a row? +- Can you generate a series of sprites drawn diagonally? +- Notice that the loop control variable, ``||variables(noclick):index||``, +is the same shape and color as any other variable. +If you don't like the name of the loop control variable, +you can drop one of your own in its place. Give it a try! +- Let's say you want to draw a grid of sprites on the screen, +like the image below: +![Ducks in a grid.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L03.01.P02.duck_grid.png) +How might you do that? +- Create an interesting pattern of sprites. +Challenge your "helping trios" teammates to duplicate your pattern using loops. +Compare your code and see if you came up with different ways to produce +the same pattern. + +```template +let spriteX = 15 +let spriteY = 10 +let distance = 20 +let duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +duckSprite.setPosition(spriteX + 0 * distance, spriteY) +duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +duckSprite.setPosition(spriteX + 1 * distance, spriteY) +duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +duckSprite.setPosition(spriteX + 2 * distance, spriteY) +duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +duckSprite.setPosition(spriteX + 3 * distance, spriteY) +``` + +```ghost +let duckSprite: Sprite = null +let spriteX = 15 +let spriteY = 10 +let distance = 20 +for (let index = 0; index <= 4; index++) { + duckSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) + duckSprite.setPosition(spriteX + index * distance, spriteY) +} +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-3/s01-lab0304-part1.md b/docs/courses/csintro/unit-3/s01-lab0304-part1.md new file mode 100644 index 00000000000..78bf04bcdea --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0304-part1.md @@ -0,0 +1,295 @@ +# Lab 3.4 Part 1: High scores + +## High scores! @showdialog + +In this project, you will work with arrays in MakeCode to build a +high scores table. + +You will be able to add this to other projects, too! + +## Let's start at the beginning + +We will begin with a project that you created in labs 2.1 and 2.6. + +If you would like to use your own project, then check with your instructor. + +Run the project to refresh your memory. When you are ready, move on to the +next step. + +## More scores! @showdialog + +MakeCode Arcade can hold a single high score for any project that you create, +but what if you wanted to keep the top five scores and player names instead? + +Let's build a high score table that does just that! + +## Variables! + +1. Use the +``||variables:Variables||`` drawer to create three variables: + - One variable will hold the **high scores**. + - One variable will hold the **high score names**. + - One variable will hold the **number of high scores**. +1. Add a block to your +``||loops(noclick):on start||`` +container to set the +**number of high scores** to `3`. +1. Add blocks to your +``||loops(noclick):on start||`` +container to set the +**high scores** variable to an array with three numbers. + - Add whatever scores you like for your initial high score table! + - Make sure the scores are in *descending* order. In other words, + make sure the highest score is first and the lowest score is last. +1. Add blocks to your +``||loops(noclick):on start||`` +container to set the +**high score names** variable to a list of three empty strings. +Add whatever names you like for your initial high score table. + +Check the hint if you need help. + +```blocks +let number_of_high_scores = 3 +let high_scores = [500, 300, 100] +let high_score_names = ["Charlie", "Bravo", "Alfa"] +``` + +## When does it end! + +When the game ends, we need to check the high scores table and add an entry +if needed. But how do we know when the game ends? + +In our current project, the game ends when the player runs out of lives. +We have an event handler that can run when that happens. + +- From the ``||info:Info||`` drawer, add an +``||info:on life zero||`` +container to your workspace. + +Any blocks that we add to this container will run when the player runs +out of lives. Because we added this event handler, we need to remember +to make the game end, because it will not end on its own now! + +## Show me! + +Before we end the game, let's display the high scores table. + +1. Create a new variable called **high scores text**. +1. In your +``||info(noclick):on life zero||`` +container, +set the value of +**high scores text** to the string +**High scores\n**. + - Those special characters at the end ask MakeCode to put +the characters on their own line. + - Remember that you can find an empty string block in the **Text** drawer +of the toolbox. +1. To your +``||info(noclick):on life zero||`` +container, add a +``||loops:for||`` ``||variables(loops):index||`` +``||loops:from 0 to (4)||`` +container. The +``||variables(noclick):index||`` +variable will count through the +indexes of your array. +1. In place of the +``||loops(noclick):(4)||`` value in your loop, use blocks +to build the following expression: +``||variables:number of high scores||`` +``||math:- (1)||``. +Remember that computers start counting at zero, and the highest index +for an array is one less than its size. +1. In the +``||loops(noclick):for||`` loop, build your high score message. +Set the +**high scores text** variable to join the following strings: + 1. ``||variables:high scores text||`` + (In other words, you are adding to the existing value.) + 1. ``||variables(arrays):high score names||`` + ``||arrays:get value at||`` ``||variables(arrays):index||`` + 1. The string + **`: `**. (That's a colon followed by a space.) + 1. ``||variables(arrays):high scores||`` + ``||arrays:get value at||`` ``||variables(arrays):index||`` + 1. The string + **`\n`**. This special character + will put each high score on a separate line. +1. To your +``||info(noclick):on life zero||`` +container, display +**high scores message** with a +``||game:show long text||`` +block, and then end the game. + +Run your project to see if your empty high scores table appears before +the game ends. Check the hint if you need help. + +```blocks +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let high_scores_message: string = "" +info.onLifeZero(function () { + high_scores_message = "High scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +``` + +## Complete! @showdialog + +Good work! We have created a high scores table and displayed it at the end +of the game. Now, we can add scores to it! On to Part 2! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let projectile: Sprite = null +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +info.onLifeZero(function () { + high_scores_message = "High Scores\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let high_scores_message = "" +let projectile: Sprite = null +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +number_of_high_scores = 3 +high_scores = [500, 300, 100] +high_score_names = ["Charlie", "Bravo", "Alfa"] +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-3/s01-lab0304-part2.md b/docs/courses/csintro/unit-3/s01-lab0304-part2.md new file mode 100644 index 00000000000..4915983ea88 --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0304-part2.md @@ -0,0 +1,369 @@ +# Lab 3.4 Part 2: High scores + +## My high score! @showdialog + +We've added a high scores table to our project and displayed it at the end +of the game. Now, let's add the player's entry if they qualify! + +## Where does it go? + +Let's figure out where we need to insert our high score. To do that, we will +go through the high scores table one entry at a time. If we find a score that +is smaller, then we've found the right spot! + +1. **At the beginning** of your +``||info(noclick):on life zero||`` +container, insert another +``||loops:for||`` ``||variables(loops):index||`` +``||loops:from 0 to (4)||`` +container. Again, the +``||variables(noclick):index||`` variable will count through the +indexes of your array. +1. Again, in place of the +``||loops(noclick):(4)||`` value in your loop, use blocks +to build the following expression: +``||variables:number of high scores||`` ``||math:- (1)||``. +Feel free to duplicate the blocks from your other +``||loops(noclick):for||`` loop for that expression. +1. Inside of this new +``||loops(noclick):for||`` +loop, add an +``||logic:if (true) then||`` +block. +1. Replace the +``||logic(noclick):(true)||`` value with blocks that build +the following conditional statement: +``||logic:if||`` ``||info:score||`` +``||logic:is greater than||`` ``||variables(arrays):high scores||`` +``||arrays:get value at||`` ``||variables(noclick):index||`` + - Remember to drag the + ``||varibles(noclick):index||`` + variable from the top of your + ``||loops(noclick):for||`` loop. + - If the editor has changed the name of the variable to something + like + ``||variables(noclick):index2||``, + then that's OK! Use whatever variable + is shown in the top of your + ``||loops(noclick):for||`` loop. + - The ``||info:score||`` value is in the ``||info:Info||`` drawer. + +Feel free to check the hint to verify your code. In the next step, we'll +be able to test your logic! + +```blocks +let high_scores: number[] = [] +let high_score_names: string[] = [] +let number_of_high_scores = 0 +let high_scores_message = "" +info.onLifeZero(function () { + // @highlight + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + + } + } + high_scores_message = "High Scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +``` + +## What's your name? + +If the player gets a high score, then we should collect their name. +Let's do that now! + +1. Create a new variable called something like **playerName**. +1. Inside of the empty +``||logic(noclick):if||`` block that you just added +to your code, prompt the player for their name and place the value +in your new variable. + +Now, play your game and try to get a high score! If you do, then your project +should ask you for your name. + +Check the hint if you need help. + +```blocks +let high_scores: number[] = [] +let number_of_high_scores = 0 +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + // @highlight + let playerName = game.askForString("High score! What is your name?") + } + } +}) +``` + +## Add the score + +Now, let's add the player's score to the table! + +After asking for the player's name, add the blocks described below. +These blocks all go inside of the +``||logic(noclick):if||`` container. + +1. ``||variables(arrays):high scores||`` ``||arrays:insert at||`` +``||variables(noclick):index||`` ``||arrays:value||`` +``||info:score||``. +1. ``||variables(arrays):high score names||`` +``||arrays:insert at||`` +``||variables(noclick):index||`` ``||arrays:value||`` +``||variables:playerName||``. + +Again, play your game and try to get a high score! If you do, then your project +should ask you for your name. When your project displays the high score table, +your name and score should appear in the list! + +You may notice a problem, though. We'll fix that in the next step. + +Check the hint if you need help. + +```blocks +let high_scores: number[] = [] +let high_score_names: string[] = [] +let number_of_high_scores = 0 +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + } + } +}) +``` + +## Too many! + +Inserting those values into our arrays makes them too long. Let's get rid of the +extra entries at the end of our arrays. + +Add the following blocks inside of your +``||logic(noclick):if||`` container, +beneath the ones that you already have there. + +1. ``||arrays:remove last value from||`` +``||variables(arrays):high scores||`` +1. ``||arrays:remove last value from||`` +``||variables(arrays):high score names||`` +1. ``||loops:break||`` + +Remember that error that we mentioned in the previous step? Once we add +the player's name and score to the arrays, then we are done. We don't need to +continue with the rest of the entries in the array. The +``||loops:break||`` +block jumps out of the +``||loops:for||`` loop early. + +You can find that block in the ``||loops:Loops||`` drawer. + +Your new high score table should work correctly now! + +Check the hint if you need help. + +```blocks +let high_scores: number[] = [] +let high_score_names: string[] = [] +let number_of_high_scores = 0 +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + high_scores.pop() + high_score_names.pop() + break; + } + } +}) +``` + +## Complete! @showdialog + +Good work! We have made a high scores table that works! + +You might notice that, when you play the game multiple times, +the high scores table resets after each play. + +In Part 3, we will learn how to save your high scores table! + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +info.onLifeZero(function () { + high_scores_message = "High Scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let high_scores_message = "" +let projectile: Sprite = null +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +number_of_high_scores = 3 +high_scores = [500, 300, 100] +high_score_names = ["Charlie", "Bravo", "Alfa"] +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + high_scores.pop() + high_score_names.pop() + break; + } + } + high_scores_message = "High Scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let high_scores_message = "" +let playerName = "" +let projectile: Sprite = null +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +number_of_high_scores = 3 +high_scores = [500, 300, 100] +high_score_names = ["Charlie", "Bravo", "Alfa"] +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-3/s01-lab0304-part3.md b/docs/courses/csintro/unit-3/s01-lab0304-part3.md new file mode 100644 index 00000000000..e983830228a --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0304-part3.md @@ -0,0 +1,312 @@ +# Lab 3.4 Part 3: High scores + +## Don't lose it! @showdialog + +We've added a high scores table to our project, displayed it at the end +of the game, and added the player's name if they qualify. + +Now, let's save the high scores table so that it doesn't get lost each +time we play our game! + +## Where is the table? + +We've added an extension to your project, and you'll notice a new +drawer in your toolbox called **BetterSettings**. + +In your ``||loops(noclick):on start||`` blocks, we simply create the **high scores** +and **high score names** arrays and add some values to it. + +Instead, let's load the high score table if one has been saved. + +- First, find the two blocks where you create the +**high scores** and +**high score names** variables, and drag them off to the side. You'll use +them again later. + +Now, at the bottom of your +``||loops(noclick):on start||`` container, add the +following blocks. + +1. Add an +``||logic:if (true) then else||`` container and add blocks so that it reads +as follows: +``||logic:if||`` ``||blockSettings:setting with name ("high scores") exists||`` +``||logic:then||`` +1. In the +``||logic(noclick):if||`` branch, add blocks that read as follows: +``||variables:set (high scores) to||`` +``||blockSettings:read settings ("high scores") as number array||`` +1. In the +``||logic:else||`` branch, place your block that you moved +off to the side that +creates the +**high scores** array with your starting values. + +Do something similar for your **high score names** variable. + +*Watch your spelling and capitalization!* + +Check the hint if you need some help. + +```blocks +if (blockSettings.exists("high scores")) { + let high_scores = blockSettings.readNumberArray("high scores") +} else { + let high_scores = [500, 300, 100] +} +if (blockSettings.exists("high score names")) { + let high_score_names = blockSettings.readStringArray("high score names") +} else { + let high_score_names = ["Charlie", "Bravo", "Alfa"] +} +``` + +## Save it! + +We've loaded the high score table if one has been saved. Now, we need to save +the high score table when we change it! + +In your +``||info(noclick):on life zero||`` container, after we update the +**high scores** and **high score names** variables +and right before the +``||loops:break||`` block, +add the following blocks: + +- ``||blockSettings:set setting ("high scores") to number array||`` +``||variables:high scores||`` +- ``||blockSettings:set setting ("high score names") to string array||`` +``||variables:high score names||`` + +Give it a try! Your high score table should save between plays! + +Check the hint if you need some help. + +```blocks +let number_of_high_scores = 0 +let high_scores: number [] = [] +let high_score_names: string[] = [] +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + let playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + high_scores.pop() + high_score_names.pop() + // @highlight + blockSettings.writeNumberArray("high scores", high_scores) + // @highlight + blockSettings.writeStringArray("high score names", high_score_names) + break; + } + } +}) +``` + +## Complete! @showdialog + +Good work! We have made a high scores table that works! + +Feel free to use this in any of your projects! + +If you would like to use **BetterSettings** or its cousin, simply called +**Settings**, in your own projects, then ask your instructor. + +```template +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + high_scores.pop() + high_score_names.pop() + break; + } + } + high_scores_message = "High Scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let high_scores_message = "" +let playerName = "" +let projectile: Sprite = null +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +number_of_high_scores = 3 +high_scores = [500, 300, 100] +high_score_names = ["Charlie", "Bravo", "Alfa"] +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```ghost +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < MAX_PROJECTILES) { + projectileCount += 1 + projectile = sprites.create(sprites.food.smallApple, SpriteKind.Projectile) + projectile.setPosition(heroSprite.x, heroSprite.y) + projectile.setVelocity(0, -50) + projectile.setFlag(SpriteFlag.AutoDestroy, true) + } +}) +info.onLifeZero(function () { + for (let index = 0; index <= number_of_high_scores - 1; index++) { + if (info.score() > high_scores[index]) { + playerName = game.askForString("High score! What is your name?") + high_scores.insertAt(index, info.score()) + high_score_names.insertAt(index, playerName) + high_scores.pop() + high_score_names.pop() + blockSettings.writeNumberArray("high scores", high_scores) + blockSettings.writeStringArray("high score names", high_score_names) + break; + } + } + high_scores_message = "High Scores\\n" + for (let index = 0; index <= number_of_high_scores - 1; index++) { + high_scores_message = "" + high_scores_message + high_score_names[index] + ": " + high_scores[index] + "\\n" + } + game.showLongText(high_scores_message, DialogLayout.Center) + game.gameOver(false) +}) +sprites.onCreated(SpriteKind.Projectile, function (sprite) { + music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground) +}) +sprites.onDestroyed(SpriteKind.Projectile, function (sprite) { + projectileCount += -1 +}) +sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) { + info.changeScoreBy(100) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) + sprites.destroy(sprite) + sprites.destroy(otherSprite, effects.coolRadial, 500) + if (enemyVelocity < MAX_ENEMY_VELOCITY) { + enemyVelocity += 1 + } +}) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) { + sprites.destroy(otherSprite) + info.changeLifeBy(-1) + music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground) +}) +let enemySprite: Sprite = null +let high_scores_message = "" +let playerName = "" +let projectile: Sprite = null +let high_score_names: string[] = [] +let high_scores: number[] = [] +let number_of_high_scores = 0 +let heroSprite: Sprite = null +let projectileCount = 0 +let enemyVelocity = 0 +let MAX_ENEMY_VELOCITY = 0 +let MAX_PROJECTILES = 0 +let difficulty = game.askForNumber("Enter starting difficulty (1, 2, or 3)") +if (difficulty == 1) { + MAX_PROJECTILES = 5 + MAX_ENEMY_VELOCITY = 100 + enemyVelocity = 10 +} else if (difficulty == 3) { + MAX_PROJECTILES = 2 + MAX_ENEMY_VELOCITY = 200 + enemyVelocity = 50 +} else { + MAX_PROJECTILES = 3 + MAX_ENEMY_VELOCITY = 150 + enemyVelocity = 25 +} +projectileCount = 0 +heroSprite = sprites.create(sprites.food.smallTaco, SpriteKind.Player) +heroSprite.setPosition(80, 100) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +number_of_high_scores = 3 +if (blockSettings.exists("high scores")) { + high_scores = blockSettings.readNumberArray("high scores") +} else { + high_scores = [500, 300, 100] +} +if (blockSettings.exists("high score names")) { + high_score_names = blockSettings.readStringArray("high score names") +} else { + high_score_names = ["Charlie", "Bravo", "Alfa"] +} +game.onUpdateInterval(1000, function () { + enemySprite = sprites.create(sprites.food.smallBurger, SpriteKind.Enemy) + enemySprite.setPosition(randint(10, 150), -5) + enemySprite.setVelocity(0, enemyVelocity) + enemySprite.setFlag(SpriteFlag.AutoDestroy, true) +}) +``` + +```package +betterSettings=github:sargedev/bettersettings +``` \ No newline at end of file diff --git a/docs/courses/csintro/unit-3/s01-lab0305-part1.md b/docs/courses/csintro/unit-3/s01-lab0305-part1.md new file mode 100644 index 00000000000..fa8621c9b89 --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0305-part1.md @@ -0,0 +1,416 @@ +# Lab 3.5 Part 1: Animated sprites + +## Starting difficulty @showdialog + +In this lab, you'll learn different ways to create animated sprites! + +Have you created a flipbook? Flipbooks have images on each page. If you +flip through the pages quickly, then it looks like the image is moving! + +This is the style of animation that MakeCode Arcade uses. +It is called *frame-based animation*. +![An example of a flipbook.](https://alex-kulcsar.github.io/introcs-tutorials/assets/images/S01.L03.05.P01.flipbook.jpg) +Image credit: John Barnes Linnett. Public domain. + +## I like to do things the hard way! + +Let's manually animate a sprite. We'll learn some automated ways later, +but sometimes, you will need to animate a sprite yourself. + +1. Create a new variable that will hold the frames (images) of your +animation. Name your variable something like **frameList**. +1. Set your new variable to an array of images. + 1. Drag a + ``||variables:set (frameList) to (0)||`` + block into your + ``||loops(noclick):on start||`` block. + 1. Drag an + ``||arrays:empty array||`` + block into the block for your + variable. This changes the variable into an array. + 1. Select the **(+)** sign to add an element to your array. + Notice that the new element is blank. + 1. Drag an empty image from the + ``||images:Images||`` + **Images** + drawer into the blank + space in your array. The + ``||images:Images||`` + **Images** + drawer is in the + **Advanced** section of the toolbox. + Your array now is an array of images! +1. Edit the new image in your array. Choose a bright color and fill in +a single pixel near the center of the image. +1. Duplicate the image block and add it as a new element in the array. +1. Edit the new image and add a couple of pixels to each side of the +single pixel, turning it into a line. +1. Repeat a couple of times, extending the line a few pixels in each frame. +1. Repeat a few more times, this time removing a few pixels from the line +until it returns to a single pixel. + +Check the hint if you need any help. + +```blocks +let frameList = [ +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 6 . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . 6 6 6 6 6 . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . 6 6 6 6 6 6 6 6 6 . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . 6 6 6 6 6 6 6 6 6 6 6 6 6 . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . 6 6 6 6 6 6 6 6 6 . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . 6 6 6 6 6 . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 6 . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + ` +] +``` + +## Where to hang these new images? + +Now, we need a place for our images. Let's create a sprite, and then let's +keep track of which frame in our array we're viewing. + +1. Add a block to your +``||loops(noclick):on start||`` +container that creates a +sprite. + - Give the sprite variable an appropriate name. + - It does not need an image. We'll take care of that later. +1. Create a new variable to store your +**frameNumber**. +1. Add a block to +``||loops(noclick):on start||`` that sets the +frame number to +**zero**. + +Check the hint if you need any help. + +```blocks +let animatedSprite = sprites.create(img` + . + `, SpriteKind.Player) +let frameNumber = 0 +``` + +## Time to animate! + +Now, let's animate your sprite! + +1. Add an +``||game:on game update every (500) ms||`` +container to your +workspace. +1. Add these blocks to your new container: + - Use blocks from the + ``||sprites:Sprites||`` and the + ``||arrays:Arrays||`` drawer to set the sprite's image to the + current frame in the array. + - Increment the current frame number. + - If the current frame number is too big, then reset it to zero. + +Run your project -- your sprite should be animated! The animation should +repeat without errors. + +Try different values in the +``||game:on game update every (500) ms||`` +container to speed up or slow down the animation. + +Check the hint if you need any help. + +```blocks +let frameNumber = 0 +let frameList: Image[] = [] +let animatedSprite: Sprite = null +game.onUpdateInterval(500, function () { + animatedSprite.setImage(frameList[frameNumber]) + frameNumber += 1 + if (frameNumber >= frameList.length) { + frameNumber = 0 + } +}) +``` + +## Conclusion @showdialog + +Congratulations! You've manually animated a sprite! + +Try some other animations of your own creation. + +There are several frame-based animations available in the gallery, too. +Be sure to take a look at those! + +Have fun! + +```ghost +let frameList = [ +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 6 . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . 6 6 6 6 6 . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . 6 6 6 6 6 6 6 6 6 . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . 6 6 6 6 6 6 6 6 6 6 6 6 6 . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . 6 6 6 6 6 6 6 6 6 . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . 6 6 6 6 6 . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, +img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . 6 . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + ` +] +let animatedSprite = sprites.create(img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, SpriteKind.Player) +let frameNumber = 0 +game.onUpdateInterval(500, function () { + animatedSprite.setImage(frameList[frameNumber]) + frameNumber += 1 + if (frameNumber >= frameList.length) { + frameNumber = 0 + } +}) +``` diff --git a/docs/courses/csintro/unit-3/s01-lab0305-part2.md b/docs/courses/csintro/unit-3/s01-lab0305-part2.md new file mode 100644 index 00000000000..731df530dcf --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0305-part2.md @@ -0,0 +1,154 @@ +# Lab 3.5 Part 2: Animated sprites + +## Built-in animations! @showdialog + +In the previous tutorial, you learned how to manually animate a sprite. +In this tutorial, you will use a built-in block to do the same thing. + +## Two simple steps! + +To create an animated sprite using the built-in blocks takes just two +simple steps! + +1. In your +``||loops(noclick):on start||`` +container, create a new sprite. + - Name your sprite anything you like. + - As before, don't worry about setting an image. We will do that + next. +1. Open the +**Advanced** +section of the toolbox. From the +``||animation:Animation||`` +drawer, add an +``||animation:animate||`` ``||variables(animation):mySprite||`` +``||animation:frames [ ] interval (ms) (500) loop (OFF)||`` +block. + - Set the variable name to your sprite's variable name. + - Select the blank animation. (It's the block next to the word + *frames*.) Switch to the gallery and select any of the built-in + animations. + - Notice that, in this block, you also can set the speed of the + animation and whether the animation repeats. + +That's it! Give it a try! Check the hint if you need help. + +```blocks +let animatedSprite = sprites.create(img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `, SpriteKind.Player) +animation.runImageAnimation( +animatedSprite, +[img` + . . f f f . . . . . . . . f f f + . f f c c . . . . . . f c b b c + f f c c . . . . . . f c b b c . + f c f c . . . . . . f b c c c . + f f f c c . c c . f c b b c c . + f f c 3 c c 3 c c f b c b b c . + f f b 3 b c 3 b c f b c c b c . + . c b b b b b b c b b c c c . . + . c 1 b b b 1 b b c c c c . . . + c b b b b b b b b b c c . . . . + c b c b b b c b b b b f . . . . + f b 1 f f f 1 b b b b f c . . . + f b b b b b b b b b b f c c . . + . f b b b b b b b b c f . . . . + . . f b b b b b b c f . . . . . + . . . f f f f f f f . . . . . . + `,img` + . . f f f . . . . . . . . . . . + f f f c c . . . . . . . . f f f + f f c c . . c c . . . f c b b c + f f c 3 c c 3 c c f f b b b c . + f f b 3 b c 3 b c f b b c c c . + . c b b b b b b c f b c b c c . + . c b b b b b b c b b c b b c . + c b 1 b b b 1 b b b c c c b c . + c b b b b b b b b c c c c c . . + f b c b b b c b b b b f c . . . + f b 1 f f f 1 b b b b f c c . . + . f b b b b b b b b c f . . . . + . . f b b b b b b c f . . . . . + . . . f f f f f f f . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `,img` + . . . . . . . . . . . . . . . . + . . c c . . c c . . . . . . . . + . . c 3 c c 3 c c c . . . . . . + . c b 3 b c 3 b c c c . . . . . + . c b b b b b b b b f f . . . . + c c b b b b b b b b f f . . . . + c b 1 b b b 1 b b c f f f . . . + c b b b b b b b b f f f f . . . + f b c b b b c b c c b b b . . . + f b 1 f f f 1 b f c c c c . . . + . f b b b b b b f b b c c . . . + c c f b b b b b c c b b c . . . + c c c f f f f f f c c b b c . . + . c c c . . . . . . c c c c c . + . . c c c . . . . . . . c c c c + . . . . . . . . . . . . . . . . + `,img` + . f f f . . . . . . . . f f f . + f f c . . . . . . . f c b b c . + f c c . . . . . . f c b b c . . + c f . . . . . . . f b c c c . . + c f f . . . . . f f b b c c . . + f f f c c . c c f b c b b c . . + f f f c c c c c f b c c b c . . + . f c 3 c c 3 b c b c c c . . . + . c b 3 b c 3 b b c c c c . . . + c c b b b b b b b b c c . . . . + c b 1 b b b 1 b b b b f c . . . + f b b b b b b b b b b f c c . . + f b c b b b c b b b b f . . . . + . f 1 f f f 1 b b b c f . . . . + . . f b b b b b b c f . . . . . + . . . f f f f f f f . . . . . . + `], +500, +true +) +``` + +## Change that animation! + +Select the animation again to open the animation editor. Take a look around. + +- Notice that it looks just like the image editor. After all, each frame +in an animation is just an image! +- Notice the extra toolbar on the right side of the screen. That is the +*frame list*. You can change the order of the frames, add frames, and delete +frames with this tool. + +Give the animation editor a try! Change some of the frames of the animation, +click **Done** (just like in the image editor), and then watch your new +animation in the simulator. + +## Conclusion @showdialog + +Congratulations! You've animated a sprite using the built-in block! +You also learned how to use the animation editor. + +Try some other animations of your own creation. + +In Part 3, you'll try something a bit more challenging. + +Have fun! diff --git a/docs/courses/csintro/unit-3/s01-lab0305-part3.md b/docs/courses/csintro/unit-3/s01-lab0305-part3.md new file mode 100644 index 00000000000..fa6c93a167d --- /dev/null +++ b/docs/courses/csintro/unit-3/s01-lab0305-part3.md @@ -0,0 +1,119 @@ +# Lab 3.5 Part 3: Animated sprites + +## What a great character! @showdialog + +In the previous tutorial, you learned use a built-in block to animate a sprite. + +In this tutorial, we will use an extension to do some more complex actions! + +## One sprite to start! + +First, we need a hero sprite for our project. + +1. In your +``||loops(noclick):on start||`` +container, add blocks that +do the following: + - Create a hero sprite for your player. + - Give the sprite an appropriate image and variable name. + - Let the player control the hero sprite using the d-pad. + - Keep the hero sprite on the screen. + +Check the hint if you need any help. + +```blocks +let movingSprite = sprites.create(sprites.builtin.forestMonkey0, SpriteKind.Player) +controller.moveSprite(movingSprite) +movingSprite.setStayInScreen(true) +``` + +## Show some character! + +We've added an extension for this tutorial. Notice the new +``||characterAnimations:Character||`` drawer in your toolbox. + +1. Add a +``||variables(characterAnimations):mySprite||`` +``||characterAnimations:loop frames [ ] (500) when (not moving)||`` +block to the bottom of your +``||loops(noclick):on start||`` +container. +1. Change the variable name to your hero sprite's variable name. + +Give this new block a try! Use the built-in images and animations in the +gallery to learn about this new block. + +Can you make your hero sprite animate appropriately when it is moving +in any of the four directions on the screen? + +```blocks +let movingSprite = sprites.create(sprites.builtin.forestMonkey0, SpriteKind.Player) +controller.moveSprite(movingSprite) +movingSprite.setStayInScreen(true) +characterAnimations.loopFrames( +movingSprite, +[img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `], +500, +characterAnimations.rule(Predicate.NotMoving) +) +``` + +## Conclusion @showdialog + +Congratulations! You've used the **Character** extension to do some complex +animations with sprites! If you want to use the **Character** extension in +your own projects, then check with your instructor. + +Try some other animations of your own creation. + +Have fun! + +```ghost +let movingSprite = sprites.create(sprites.builtin.forestMonkey0, SpriteKind.Player) +controller.moveSprite(movingSprite) +movingSprite.setStayInScreen(true) +characterAnimations.loopFrames( +movingSprite, +[img` + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + `], +500, +characterAnimations.rule(Predicate.NotMoving) +) +``` + +```package +characterAnimations=github:microsoft/arcade-character-animations +``` \ No newline at end of file diff --git a/docs/courses/csintro_archive.md b/docs/courses/csintro_archive.md new file mode 100644 index 00000000000..f1177af0f11 --- /dev/null +++ b/docs/courses/csintro_archive.md @@ -0,0 +1,57 @@ +# CS Intro + +A collection of courses meant to teach introductory programmers using Blocks and JavaScript + +### ~hint + +These courses are currently in beta - this means that they are likely to have bugs and changes made fairly regularly. If you see anything that doesn't seem quite right, or if you have any suggestions, please file an issue on [github](https://github.com/microsoft/pxt-arcade). + +### ~ + +## Courses on Flipgrid + +Flipcode for the **Intro to CS** course grid: **[csintroarcade](https://flipgrid.com/csintroarcade)** + +## Course Sections + +```codecard +[ + { + "name": "CS Intro 1", + "description": "A semester length computer science course for beginning coders", + "url":"/courses/csintro1", + "imageUrl": "/static/courses/csintro1.gif" + }, { + "name": "CS Intro 2", + "description": "A continuation of the Intro to CS course", + "url":"/courses/csintro2", + "imageUrl": "/static/courses/csintro2.gif" + }, { + "name": "CS Intro 3", + "description": "A quarter length transition from blocks to JavaScript", + "url": "/courses/csintro3", + "imageUrl": "/static/courses/csintro3.gif" + } +] +``` + +## About the CS Intro Series + +The CS Intro Series is designed to teach new developers how to code from the ground up. + +In CS Intro 1, students are introduced to programming through the MakeCode Blocks editor. They can create their own games, while learning concepts that are crucial to software development: creating variables, responding to events, and using iteration to simplify and extend their programs. Throughout the course, they will learn to develop their own games through small daily tasks, as well as projects that guide them through the process of turning basic ideas into full-fledged games. + +In CS Intro 2, students will continue to develop the software development skills they were introduced to in the first course, with more advanced programming concepts such as functions, logical comparisons, and arrays. These new skills will allow students to create more advanced and compelling games. + +### ~hint + +In the future CS Intro 3 and CS Intro 4 courses, students will transition the skills they have learned in a Block based environment into skills in a text based coding environment, allowing them to dig deeper into the games they make, as well as transition their skills in the @boardname@ into other environments. + +### ~ + +## See also + +[Courses Home Page](/courses), +[CS Intro 1](/courses/csintro1), +[CS Intro 2](/courses/csintro2), +[CS Intro 3](/courses/csintro3) \ No newline at end of file diff --git a/docs/static/hero-gallery/hubble_banner.jpg b/docs/static/hero-gallery/hubble_banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae081bde2ac681f06fd479b0a7ee6e8fa85f81a0 GIT binary patch literal 220357 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

D$VK~ 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

22{DKi1iB2wpV=FIR%~#B#8ID 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 literal 0 HcmV?d00001 diff --git a/docs/static/tutorials/hubble/hubble_4x3.jpg b/docs/static/tutorials/hubble/hubble_4x3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23f33b183d012c50601e6e437c5e23ea20bb434b GIT binary patch literal 136274 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 M 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 P@B{v+ixkx3zX$#wHYf3B literal 0 HcmV?d00001 diff --git a/docs/test/tutorials/rockscout.md b/docs/test/tutorials/rockscout.md index 281bf1e6ad5..c769dab8d49 100644 --- a/docs/test/tutorials/rockscout.md +++ b/docs/test/tutorials/rockscout.md @@ -77,14 +77,24 @@ let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) --- -You might notice that you can design your own sprite image (aka avatar) if you click on the rockscout already in the workspace. +You might notice that you can design your own sprite image (aka avatar) by clicking on the rockscout already in the workspace. While it might look like you're drawing with pixels, what you are really doing is -creating an array of numbers that tells the computer what your avatar should look like. +creating an array of symbols that tells the computer what your avatar should look like. ![Look at your array](/static/skillmap/rockstar/rockscout-imgs-array.gif "Your sprite image is an array of hexadecimal digits.") +~hint What's an array? 💡 + +--- + +In Arcade, an **Array** is an ordered list of items. + +In this activity, you won't see the array of image symbols until the very end, but they're + + +hint~ diff --git a/docs/test/tutorials/stackem_smurfs.md b/docs/test/tutorials/stackem_smurfs.md new file mode 100644 index 00000000000..7417638ca64 --- /dev/null +++ b/docs/test/tutorials/stackem_smurfs.md @@ -0,0 +1,567 @@ +# Stack'em Smurfs +### @explicitHints true + + +## Introduction @showdialog + +![Game animation](/static/tutorials/chase-the-pizza/chasing.gif) + +Create a game where the goal is to eat as much pizza as you can +before the time runs out! + + +## {Step 2} + +**Set the background color** + +--- + +- :tree: Open the
+``||scene:Scene||``
+toolbox drawer and drag
+``||scene:set background color [ ]||``
+into **the empty** ``||loops(noclick):on start||`` container already in your workspace. + +~hint What does that mean? 🤷🏽 + +--- + +When giving instructions, we'll highlight some text to give you a better idea of what you are looking for. + +For example, when we suggest the
+``||scene:set background color to [ ]||``
+block, we are pointing you toward
+ +```block +scene.setBackgroundColor(13) +``` + +hint~ + +💡 _Feel free to choose your own color if you don't like the swatch in the block._ + + +--- + +- :mouse pointer: Click the button that says **Next** to go to the +next step of the tutorial. + + +#### ~ tutorialhint +```blocks +// @highlight +scene.setBackgroundColor(13) +``` + + +## {Step 3} + +Add a player **sprite**. + +--- + +- :paper plane: Open the ``||sprites:Sprites||`` drawer and drag
+``||variables(sprites):set [mySprite] to sprite [ ] of kind [Player]||``
+into **the end of** the ``||loops(noclick):on start||`` block already in your workspace. + +--- + + +~hint What's a sprite? 💡 + +--- + +In Arcade, each character or image that does something is called a **SPRITE**. + +Sprites have properties that you can use and change — +things like scale, position, and lifespan are all properties of sprites. + +Our player will be a sprite, too. + +hint~ + + +~hint Show me 🔍 + +![Add a sprite block](/static/tutorials/chase-the-pizza/mySprite.gif) + +hint~ + + +#### ~ tutorialhint +```blocks +let mySprite: Sprite = null +scene.setBackgroundColor(13) +// @highlight +mySprite = sprites.create(img`.`, SpriteKind.Player) +``` + +## {Step 4} + +- :mouse pointer: Draw your sprite by clicking on the empty grey square in the
+``||variables(sprites):set [mySprite] to sprite [ ] of kind [Player]||``
+block to open the **Sprite Editor**. + + +- :mouse pointer: Click **Done** when you are finished drawing. + +~hint Show me 🔍 + +![Image editor](/static/tutorials/chase-the-pizza/draw.gif) + +hint~ + + + +#### ~ tutorialhint +```blocks +let mySprite: Sprite = null +scene.setBackgroundColor(13) +// @highlight +mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 5 . . . . +. . . 5 5 5 5 5 5 5 5 5 5 5 . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 5 f 5 5 5 5 f 5 5 5 5 5 +. 5 5 5 5 f f 5 5 5 f f 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 f f f f f f f f f 5 5 5 +. 5 5 5 5 f b b b b b f 5 5 5 5 +. . 5 5 5 5 f b b b f 5 5 5 5 . +. . 5 5 5 5 5 f f f 5 5 5 5 5 . +. . . 5 5 5 5 5 5 5 5 5 5 5 . . +. . . . . 5 5 5 5 5 5 5 . . . . +. . . . . . . . . . . . . . . . +`, SpriteKind.Player) +``` + + +## {Step 5} + +**Make the sprite move** + +--- + +- :game: Open ``||controller:Controller||`` and drag
+``||controller:move [mySprite] with buttons||``
+into **the end of** the
+``||loops(noclick):on start||`` block already in your workspace. + +Now you can move your sprite around the screen using the arrow buttons on the game pad or your keyboard. + + +~hint Show me 🔍 + +![Add the move block](/static/tutorials/chase-the-pizza/move.gif) + +hint~ + + +#### ~ tutorialhint +```blocks +let mySprite: Sprite = null +scene.setBackgroundColor(13) +mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 5 . . . . +. . . 5 5 5 5 5 5 5 5 5 5 5 . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 5 f 5 5 5 5 f 5 5 5 5 5 +. 5 5 5 5 f f 5 5 5 f f 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +. 5 5 5 f f f f f f f f f 5 5 5 +. 5 5 5 5 f b b b b b f 5 5 5 5 +. . 5 5 5 5 f b b b f 5 5 5 5 . +. . 5 5 5 5 5 f f f 5 5 5 5 5 . +. . . 5 5 5 5 5 5 5 5 5 5 5 . . +. . . . . 5 5 5 5 5 5 5 . . . . +. . . . . . . . . . . . . . . . +`, SpriteKind.Player) +// @highlight +controller.moveSprite(mySprite) +``` + + + + +## {Step 6} + + +- :binoculars: Test your project in the game window! + +You should be able to move your sprite with the joypad or arrow keys on your keyboard. + + +![Look for the game window in the lower right](/static/tutorials/chase-the-pizza/game.png) + + + + + + + +## {Step 7} + +**Add some pizza** + +--- + +- :paper plane: Open ``||sprites:Sprites||`` and drag
+``||variables(sprites):set [pizza] to sprite [ ] of kind [Player]||``
+into **the end of** the
+``||loops(noclick):on start||`` block already in your workspace. + + +- :mouse pointer: Click **Player** in
+``||variables(noclick):set [pizza] to sprite [ ] of kind [Player]||``
+and choose **Food** instead. + +--- + +~hint Show me 🔍 + +![Change the pizza to food](/static/tutorials/chase-the-pizza/food.gif) + +hint~ + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + + +#### ~ tutorialhint +```blocks +let mySprite: Sprite = null +let pizza: Sprite = null +scene.setBackgroundColor(13) +mySprite = sprites.create(img` +. . . . 5 5 5 5 5 5 5 . . . . . +. . 5 5 5 5 5 5 5 5 5 5 5 . . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +5 5 5 5 f 5 5 5 5 f 5 5 5 5 5 . +5 5 5 5 f f 5 5 5 f f 5 5 5 5 . +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +5 5 5 f f f f f f f f f 5 5 5 . +5 5 5 5 f b b b b b f 5 5 5 5 . +5 5 5 5 5 f b b b f 5 5 5 5 5 . +. 5 5 5 5 5 f f f 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . 5 5 5 5 5 5 5 5 5 5 5 . . . +. . . . 5 5 5 5 5 5 5 . . . . . +. . . . . . . . . . . . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +// @highlight +pizza = sprites.create(img`.`, SpriteKind.Food) +``` + + +## {Step 8} + + +- :mouse pointer: Choose your pizza by clicking the empty grey square inside
+``||variables(noclick):set [pizza] to sprite [ ] of kind [Food]||``
+to open the **Sprite Editor**. + +- :mouse pointer: Switch to the **Gallery** tab at the top. +![Select the gallery](/static/skillmap/assets/gallery.png) + + +- :mouse pointer: Choose your pizza, then click **Done**. + +~hint Show me 🔍 + +![Image gallery](/static/tutorials/chase-the-pizza/gallery.gif) + +hint~ + + +💡 _Feel free to draw your own pizza if you prefer!_ + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + + +#### ~ tutorialhint +```blocks +let pizza: Sprite = null +let mySprite: Sprite = null +scene.setBackgroundColor(13) +mySprite = sprites.create(img` +. . . . 5 5 5 5 5 5 5 . . . . . +. . 5 5 5 5 5 5 5 5 5 5 5 . . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +5 5 5 5 f 5 5 5 5 f 5 5 5 5 5 . +5 5 5 5 f f 5 5 5 f f 5 5 5 5 . +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +5 5 5 f f f f f f f f f 5 5 5 . +5 5 5 5 f b b b b b f 5 5 5 5 . +5 5 5 5 5 f b b b f 5 5 5 5 5 . +. 5 5 5 5 5 f f f 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . 5 5 5 5 5 5 5 5 5 5 5 . . . +. . . . 5 5 5 5 5 5 5 . . . . . +. . . . . . . . . . . . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +pizza = sprites.create(img` +. . . . . . b b b b . . . . . . +. . . . . . b 4 4 4 b . . . . . +. . . . . . b b 4 4 4 b . . . . +. . . . . b 4 b b b 4 4 b . . . +. . . . b d 5 5 5 4 b 4 4 b . . +. . . . b 3 2 3 5 5 4 e 4 4 b . +. . . b d 2 2 2 5 7 5 4 e 4 4 e +. . . b 5 3 2 3 5 5 5 5 e e e e +. . b d 7 5 5 5 3 2 3 5 5 e e e +. . b 5 5 5 5 5 2 2 2 5 5 d e e +. b 3 2 3 5 7 5 3 2 3 5 d d e 4 +. b 2 2 2 5 5 5 5 5 5 d d e 4 . +b d 3 2 d 5 5 5 d d d 4 4 . . . +b 5 5 5 5 d d 4 4 4 4 . . . . . +4 d d d 4 4 4 . . . . . . . . . +4 4 4 4 . . . . . . . . . . . . +`, SpriteKind.Food) +``` + + + +## {Step 9} + +**Make something happen when the sprites overlap!** + +--- + +- :paper plane: Open ``||sprites:Sprites||`` and drag the
+``||sprites:on [sprite] of kind [Player] overlaps [otherSprite] of kind [Food]||``
+container into **an empty area** of the workspace. + + +🤷🏽‍♀️ _Need help? Click the lightbulb in the circle below to see what blocks you need in this step._ + + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + + +#### ~ tutorialhint +```blocks +// @highlight +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + +}) +``` + + + +## {Step 10} + +**Add a point when the sprites overlap** + +--- + +- :id card: Open ``||info:Info||`` and drag
+``||info:change score by [1]||``
+into **the empty**
+``||sprites(noclick):on [sprite] ... overlaps [otherSprite]||``
+container already in the workspace. + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + +#### ~ tutorialhint +```blocks +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + // @highlight + info.changeScoreBy(1) +}) +``` + + + + + +## {Step 11} + + +- :binoculars: Check your game! + +Notice that you get WAAAYYYYY too many points when your player +sprite overlaps the pizza? + +We'll fix that in the next step. + + + + +## {Step 12} + +**Teleport the pizza to a random location each time the sprites overlap.** + +~hint What is random? 🤷🏽‍♀️ + +--- + +A "random" number is a value that you can't predict ahead of time. + +In Arcade, we use this block: + +```block +randint(0, scene.screenWidth()) +``` + +to ask for a random number between **0** and the **width of the screen**. + +hint~ + +--- + +- :paper plane: Open ``||sprites:Sprites||``, and drag
+``||sprites:set [pizza] position to...||``
+into the **end of the**
+``||sprites(noclick):on [sprite] ... overlaps [otherSprite]||``
+container already in the workspace. + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + +#### ~ tutorialhint +```blocks +let pizza: Sprite = null +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + // @highlight + pizza.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) +}) +``` + + + + +## {Step 13} + +**Let’s start a countdown each time the sprites overlap.** + +--- + +- :id card: From ``||info:Info||``, drag
+``||info:start countdown [3] (s)||``
+into the **end of the**
+``||sprites(noclick):on [sprite] ... overlaps [otherSprite]||``
+container already in the workspace. + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + +#### ~ tutorialhint +```blocks +let pizza: Sprite = null +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + pizza.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) + // @highlight + info.startCountdown(3) +}) +``` + + +## {Finale} + +**🎉 Great job! 🎉** + +You've made a **Chase the Pizza** game. + +Try playing your game. How many points can you get before time runs out? + +When you're finished playing, click **Done** to share your game with family and friends! + + + +```blockconfig.local +let pizza = sprites.create(img`.`, SpriteKind.Player) +``` + +#### ~ tutorialhint +```blocks +let pizza: Sprite = null +let mySprite: Sprite = null +scene.setBackgroundColor(13) +mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 . . . . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 f f 5 5 5 5 f f 5 5 5 . +5 5 5 5 f f 5 5 5 5 f f 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 f 5 5 5 5 5 5 5 5 5 5 f 5 5 +5 5 5 f 5 5 5 5 5 5 5 5 f 5 5 5 +. 5 5 5 f 5 5 5 5 5 5 f 5 5 5 . +. 5 5 5 5 f f f f f f 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . . . . 5 5 5 5 5 5 . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +pizza = sprites.create(img` +. . . . . . b b b b . . . . . . +. . . . . . b 4 4 4 b . . . . . +. . . . . . b b 4 4 4 b . . . . +. . . . . b 4 b b b 4 4 b . . . +. . . . b d 5 5 5 4 b 4 4 b . . +. . . . b 3 2 3 5 5 4 e 4 4 b . +. . . b d 2 2 2 5 7 5 4 e 4 4 e +. . . b 5 3 2 3 5 5 5 5 e e e e +. . b d 7 5 5 5 3 2 3 5 5 e e e +. . b 5 5 5 5 5 2 2 2 5 5 d e e +. b 3 2 3 5 7 5 3 2 3 5 d d e 4 +. b 2 2 2 5 5 5 5 5 5 d d e 4 . +b d 3 2 d 5 5 5 d d d 4 4 . . . +b 5 5 5 5 d d 4 4 4 4 . . . . . +4 d d d 4 4 4 . . . . . . . . . +4 4 4 4 . . . . . . . . . . . . +`, SpriteKind.Food) + +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + pizza.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) + info.startCountdown(3) +}) +``` + + +```blockconfig.global +let pizza: Sprite = null + +scene.setBackgroundColor(13) +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) {}) +randint(0, scene.screenWidth()) +pizza.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) +info.startCountdown(3) + +``` + +```package +chase-the-pizza=github:kiki-lee/chase-the-pizza +``` \ No newline at end of file diff --git a/docs/tutorials/rockscout.md b/docs/tutorials/rockscout.md new file mode 100644 index 00000000000..4ecdbaad49f --- /dev/null +++ b/docs/tutorials/rockscout.md @@ -0,0 +1,540 @@ +# Florida Rockscout +### @explicitHints true + + +## {Welcome @showdialog} + +Congratulations! You've just accepted a job managing Terri, the last remaining **Florida Rockscout!** + +![Navigate the maze backstage](/static/skillmap/rockstar/rockscout.png "Look what we're about to do today!") + +We'll walk you through the skills you'll need to help Terri navigate backstage to collect equipment from the show while avoiding screaming fans! + +To win, you need to get to the exit before time runs out. + + + + +## {2. We need a HERO} + +**👏 We need a sprite!** + +--- + +- :paper plane: From the ``||sprites:Sprites||`` category, drag +``||variables(sprites):set [rockscout] to sprite [ ] of kind [Player]||`` +into **the empty**
+``||loops(noclick):on start||``
+container that's already in the workspace. + + +~hint What does that mean? 🤷🏽 + +--- + +When giving instructions, we'll highlight some text to give you a better idea of +what you are looking for. + +For example, when we suggest the
+``||variables(sprites):set [rockscout] to sprite [ ] of kind [Player]||``
+block, we are pointing you toward
+ +```block +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +``` + +which is located in the ``||sprites:Sprites||`` category in the toolbox. + +hint~ + + + +~hint What's a sprite? 💡 + +--- + +In Arcade, each character or image that does something is called a **SPRITE**. + +Sprites have properties that you can use and change — things like scale, position, and lifespan are all properties of sprites. + +Our rockscout will be a sprite, too. + +hint~ + + + + +#### ~ tutorialhint +```blocks +// @highlight +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +``` + + + + +## {3. Drawing an Avatar} + +**Designing an Avatar** + +--- + +You might notice that you can design your own sprite image (aka avatar) by clicking on the rockscout already in the workspace. + +While it might look like you're drawing with pixels, what you are really doing is +creating an array of symbols that tells the computer what your avatar should look like. + +![Look at your array](/static/skillmap/rockstar/rockscout-imgs-array.gif "Your sprite image is an array of hexadecimal digits.") + + +~hint What's an array? 💡 + +--- + +In Arcade, an **Array** is an ordered list of items. + +In this activity, you won't see the array of image symbols until the very end, but they're + + +hint~ + + + +## {4. Control the Player} + +**Time to get the sprite moving** + +--- + +- :game: From ``||controller: Controller||``, drag
+``||controller:move [rockscout] with buttons ⊕||``
+to **the end** of the ``||loops(noclick):on start||`` container. + + + +#### ~ tutorialhint +```blocks +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +// @highlight +controller.moveSprite(rockscout) +``` + + +## {5. Try It} + +**Check the Game Window** + +Terri appears in the middle of a wall and gets completely lost when moving off screen! + +We'll fix that over the next couple of steps. + + + +## {6. Trapped Backstage} + +The Rockscout sprite should start at the stage door. + +--- + +- :tree: To start Terri at the stage door, go to ``||scene:Scene||`` and drag
+``||scene: place [rockscout] on top of random [ ]||``
+to **the end** of the
+``||loops(noclick):on start||``
+container. + +- :mouse pointer: Click the checkered tile and select the teal stage door called **stage** from the grid. + +_💡 Don't forget to play with your project after each step to see the changes your code has made._ + + + +#### ~ tutorialhint +```blocks +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +controller.moveSprite(rockscout) +// @highlight +tiles.placeOnRandomTile(rockscout, assets.tile`stage`) + +``` + + +## {7. Follow with Camera} + + +- :tree: To keep Terri in sight, go to ``||scene:Scene||`` and drag
+``||scene:camera follow sprite [rockscout]||``
+to **the end** of the
+``||loops(noclick):on start||`` container. + +#### ~ tutorialhint +```blocks +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +controller.moveSprite(rockscout) +tiles.placeOnRandomTile(rockscout, assets.tile`stage`) +// @highlight +scene.cameraFollowSprite(rockscout) + +``` + + +## {8. Look Again} + +**🕹️ Try your maze in the game window** + +--- + +You should be able to see your sprite as you move it around backstage. + +Can you get to the exit? + + + +## {9. Add Points} + +**🎸 Award points when Terri grabs an instrument**
+ +--- + + +- :tree: To detect an overlap, go to ``||scene:Scene||`` and drag an
+``||scene:on [sprite] of kind [Player] overlaps [ ] at [location]||``
+bundle into an empty area of the workspace. + +- :mouse pointer: Change the "overlaps" checkerboard to the red guitar called **instrument1**. + + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + + +#### ~ tutorialhint +```blocks +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + +## {10. Try It!} + +**🕹️ Try your maze in the game window** + +--- + +You should get one point for every guitar you collect. + +What about the drums and keyboard? + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + + + +## {11. More Instruments} + +**🎹 Do it all again**
+Follow the same steps two more times to add points for the **drums** and **keyboard** tiles. + + + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + +#### ~ tutorialhint +```blocks +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument0`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument4`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + + +## {12. Look Again...Again} + +**🕹️ Try your maze again** + +--- + +You should get one point for every instrument you collect! + +Can you make it to the exit? + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +``` + + +## {13. Out the Door} + +**🚪 Make it out the door** + +Let's finish the game with a WIN when Terri overlaps the exit door! + +--- + +- :tree: To detect an overlap, go to ``||scene:Scene||`` and drag the
+``||scene:on [sprite] of kind [Player] overlaps [ ] at [location]||``
+bundle into an empty area of the workspace. + +- :mouse pointer: Change the checkerboard to the red door tile named **exit**. + + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`exit`, function (sprite, location) { + game.over(true) +}) +``` + + +#### ~ tutorialhint +```blocks +scene.onOverlapTile(SpriteKind.Player, assets.tile`exit`, function (sprite, location) { + game.over(true) +}) +``` + + + +## {14. Spot the Fan} + +**Remove points when Terri runs into a screaming fan 📸** + +When your sprite overlaps a fan, change the score. + +--- + +- :tree: To detect an overlap, go to ``||scene:Scene||`` and drag the
+``||scene:on [sprite] of kind [Player] overlaps [ ] at [location]||``
+bundle into an empty area of the workspace. + +- :mouse pointer: Change the checkerboard to the tile called **fan1**. + + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) +``` + + +#### ~ tutorialhint +```blocks +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) +``` + + +## {15. More Fans} + +**🎤 Encore 🎤** + +Follow the same steps two more times to include the other two fans. + + +```blockconfig.local +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) +``` + + +#### ~ tutorialhint +```blocks +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan2`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan3`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) +``` + + +## {16. Look Again} + +**🕹️ Try your maze in the game window** + +--- + +You should lose one point for every fan you run into. + +How many points can you keep on your way to the door? + + +## {17. Out of Time} + +**🕒 Make it out in time** + +Use a timer to add some hustle to the whole experience! + +--- + +- :id card: From ``||info:Info||``, drag
+``||info:start countdown [30] (s)||``
+into **the end** of the
+``||loops(noclick):on start||``
+container. + + +#### ~ tutorialhint +```blocks +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +controller.moveSprite(rockscout) +scene.cameraFollowSprite(rockscout) +tiles.placeOnRandomTile(rockscout, assets.tile`stage`) +//@highlight +info.startCountdown(30) +``` + + + +## {18. Go Further} + +**Make it your own!** + +--- + +Now that you have created this game, what else could you gamify? + +What new skill could you help your friends/sister scouts learn? +_(For example, pilots and astronauts may use simulation games to learn how to fly a plane or land a rover.)_ + + + +## {19. Decision Tree} + + +Now you can change anything you want. + +Sometimes it's easiest to write down your plan so you know how each change will affect the game. + +Try making a decision tree! + +![Map it out](/static/skillmap/rockstar/decision-tree.png "Draw a decision tree - or flow chart - to detail what happens for each decision.") + + + + +## {Finale} + +🔥 **Congratulations** 🔥 + +--- + +Grab your instruments and get Terri to the end of the maze before time runs out! + +When you're done playing, click **Done** to share your final game for feedback. + + + +```blockconfig.global +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +controller.moveSprite(rockscout) +scene.cameraFollowSprite(rockscout) +tiles.placeOnRandomTile(rockscout, assets.tile`stage`) +game.over(true) +info.startCountdown(30) +``` + + + +```package +pxt-tilemaps=github:microsoft/pxt-tilemaps/ +``` + + +```ghost + +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument0`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument4`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`exit`, function (sprite, location) { + game.over(true) +}) + + +let rockscout = sprites.create(assets.image`Rockscout`, SpriteKind.Player) +controller.moveSprite(rockscout) +scene.cameraFollowSprite(rockscout) +tiles.placeOnRandomTile(rockscout, assets.tile`stage`) + + +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument3`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument2`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`instrument1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(1) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`door`, function (sprite, location) { + game.over(true) +}) +scene.onOverlapTile(SpriteKind.Player, assets.tile`fan1`, function (sprite, location) { + tiles.setTileAt(location, assets.tile`transparency16`) + info.changeScoreBy(-1) +}) + +``` + +```customts +scene.setBackgroundColor(13) +tiles.setTilemap(tilemap`level1`) + +``` + + + +```assetjson +{ + "README.md": " ", + "assets.json": "", + "images.g.jres": "{\n \"HR6MQZ`+AH8fF_EGjDHy\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAADw////DwAA8P/v7u5NAAD/7//k/v8AAP/ustEe0f8A7+7y3xTR/wDv7kLdFNEPAF/u8t8U0f8AX+Wy0R7R/wD/5f/k/v8AAPD/7+7uTQAAAPD///8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"displayName\": \"Rockscout\"\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myImages\"\n }\n}", + "images.g.ts": "// Auto-generated code. Do not edit.\nnamespace myImages {\n\n helpers._registerFactory(\"image\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"HR6MQZ`+AH8fF_EGjDHy\":\n case \"Rockscout\":return img`\n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . f f f f f f f . . . . . \n. . . f f f e e 5 5 f f . . . . \n. . . f f e e e e 5 5 f . . . . \n. . f f e e e e e e e f f . . . \n. . f f f 2 2 2 2 2 f f f . . . \n. . f e f b f 4 f b f e f . . . \n. . f e 4 1 f d f 1 4 e f . . . \n. . f e e d d d d d e e f . . . \n. . f e e e 4 4 4 e e e f . . . \n. . f e f 1 1 1 1 1 f e f . . . \n. . f d f 1 1 1 1 1 f d f . . . \n. . . 4 f d d d d d f 4 . . . . \n. . . . . f f f f f . . . . . . \n. . . . . f f . f f . . . . . . \n`;\n }\n return null;\n })\n\n helpers._registerFactory(\"animation\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n", + "main.blocks": "PlayerProjectileFoodEnemyrockscoutlist", + "main.ts": "\n", + "pxt.json": "{\n \"name\": \"80s Rockscout - Assets Only\",\n \"description\": \"\",\n \"dependencies\": {\n \"device\": \"*\",\n \"tilemaps\": \"github:microsoft/pxt-tilemaps#v1.11.0\"\n },\n \"files\": [\n \"main.blocks\",\n \"main.ts\",\n \"README.md\",\n \"assets.json\",\n \"tilemap.g.jres\",\n \"tilemap.g.ts\",\n \"images.g.jres\",\n \"images.g.ts\"\n ],\n \"targetVersions\": {\n \"branch\": \"v1.5.56\",\n \"tag\": \"v1.5.56\",\n \"commits\": \"https://github.com/microsoft/pxt-arcade/commits/fb33e381b78eca2163bc40e2b26bdfdc9e7ebd81\",\n \"target\": \"1.5.56\",\n \"pxt\": \"7.1.35\"\n },\n \"preferredEditor\": \"blocksprj\"\n}\n", + "tilemap.g.jres": "{\n \"transparency16\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true\n },\n \"tile4\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8//////////zu7u7u7u7+/P7u7v/u/v787u7+u+/u/vzu7r/M++7+/O7uv8z77v787u7+u+/u/vz+7u7/7v7+/O7u7u7u7v78/////////8zMzMzMzMzMzMzMzMzMzAwAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"instrument3\"\n },\n \"tile5\": {\n \"data\": \"hwQQABAAAAAAwBEREQwAAADAETMRDAAAAMARMRMMAAAAwBEzEQwAAADAERERDAAAAMD87s8MAAAAAPDuwQAAAAD///8RDADA8O/v7h7LDM/P7+///xGM/8/s7vEvEWb///zu8SIRhgD//P7u7v9m/8/8/u7+7o//wP/v7v/uD88A////D/8AwA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"fan1\"\n },\n \"tile6\": {\n \"data\": \"hwQQABAAAAAAwBEREQwAAADAETMRDAAAAMARMRMMAAAAwBEzEQwAAADAERERDAAAAAD/RMwMAAAA8P9EwQAAAAD//7wRDADA8L9PRBvLDM/Pv0/u7hGM/8+8S+EuEWb//8xL4SIRhgD//PtEtMxm/8/8+/S/RIj/wP+7/89EDM8A////D8wAwA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"fan2\"\n },\n \"tile7\": {\n \"data\": \"hwQQABAAAAAAwBEREQwAAADAETMRDAAAAMARMRMMAAAAwBEzEQwAAADAERERDAAAAMDM3cwMAAAAAMDdwQAAAAD7/88RDADA0LXf3RvLDM8dtdzu7hGM/x3R2+EuEWb/XVHb4SIRhgBdUcvdvbtm/x1R+9293Yj/EFW13cvdC88AXVXPDLsAwA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"fan3\"\n },\n \"tile3\": {\n \"data\": \"hwQQABAAAAAAAAAA/+8AAAAAAPD/7g4AAAAA8G5E5AAAAADwRkREDgAA8P9GRETkAAD/L0TuROQAAO9GRORO5AAAb0T+Qk7kAABuRP9PROQAAOBE8k5EDgAA/09EJO4AAPDv7kTkAADw/+4A7g4AAO/kDgAAAAAAT+QAAAAAAADvDgAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"instrument2\"\n },\n \"tile9\": {\n \"data\": \"hwQQABAAAAAAAAAAy8wMAAAAALDb280AAAAA+xHbzQAAALD7G73dDAAA+/0fsd0MALD727/R280A+/3fzBHbzbD727/RHbHMsP3fzBEd3c2w3b/RHbHLDADbzBEd3c0AANvRHbHLDAAAsBEd3c0AAACwHbHLDAAAAAAb3c0AAAAAALvLDAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"instrument4\"\n },\n \"tile10\": {\n \"data\": \"hwQQABAAAAAAwMz8////AAC8LLLMzPwAwLss0sy7/AC8u9zdvMzLD7y7u93f37wPvLvL3dv/vA+8u8vdzf2/D8C7y9v93Pv/wLu73L3////Au7vcvf///MC7u8zMzMz8ALy7MzMzM/sAvDuzu7u7DAC8M7u7u8sAADyzu7u7DAAAwMzMzMwAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"camera\"\n },\n \"tile2\": {\n \"data\": \"hwQQABAAAAAAAAAA/+4AAAAAAPDu7g4AAAAA4G4i4gAAAADwJiIiDgDw7/8mzCLiAP/u/yLcLOIA7yIiIrHN4gAuIiISEcziAC4C8BMRIeIA7gDvPhEiDgAA8O4u4+4AAADvDi7iAADw/+4AIuIAAO/kDgDuDgAAT+QAAAAAAADvDgAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"instrument1\"\n },\n \"tile12\": {\n \"data\": \"hwQQABAAAADM/P//zPzM/Mz8zPzMzMz8zMzM/MzMzPzM/Mz8zPzM/Mz8zPzM/Mz8zPzMzMz8zPzM/MzMzPzMzP//zPzM/MzMzPzM/Mz8zPzM/Mz8zPzM/Mz8zPz//8z8zMzM/Mz8zPzMzMz8zPzM/Mz8zPzM/Mz8zPzMzMz8zMzM/MzMzPz/zw==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"wall\"\n },\n \"tile13\": {\n \"data\": \"hwQQABAAAAD//////////x/RHbHbu9u9H7u7sd3P/L3fu7u9/c/8v9+7u73/zMz/37u7vczMzMzfu7u9zMzMzN+7u73MzMzM37u7vczMzMzfu7u9zMzMzN+7u73MzMzM37u7vf/MzP/fu7u9/c/8vx+7u7Hdz/y9H9Edsdu7273//////////w==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"stack\"\n },\n \"tile11\": {\n \"data\": \"hwQQABAAAAC7iIiIiIiIiLGIERZmZmZmEYhhEWZmZmYRiGdmZoiIZxGIERFmaGZnEYhnZmZoZmcRiBERZmhmZxGIcWdmaGZnEYgWEWZoZmcRiGZmZmhmZxGIEXFmaGZnEYhhEWZIaGcRiGZmZlSFZxGIERFmVIVmsYhxFmZGaGa7iIiIiIiIiA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"stage\"\n },\n \"tile1\": {\n \"data\": \"hwQQABAAAAC77u7u7u7u7rHuIiIiIiIiEe4SESEiIiIR7hIjIe7uIxHuIiIiLiIjEe4SMyEuIiMR7iIRIi4iIxHuEjMhLiIjEe4iIiIuIiMR7hIRIS4iIxHuIiIiLiIjEe4SIiJOLiMR7hIR4VTlIxHuEiLiVOUise4iIiJOLiK77u7u7u7u7g==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"exit\"\n },\n \"tile8\": {\n \"data\": \"hwQQABAAAAAAALALsAsAAAAA27u7vQAAAAC7HdG9DgAAsB0RsfvrALDbEd0R+78O2xvR3RHr/uu7Hd3d0dvuv7AR3R2x3ev+sBEREbu/3e67vRG96/LS7du9u9svIi/tsPvv3fsi8g4Avu++LS8iDwDg++7d8uIAAAC+797tDgAAAOD77g4AAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"instrument0\"\n },\n \"level1\": {\n \"id\": \"level1\",\n \"mimeType\": \"application/mkcd-tilemap\",\n \"data\": \"MTAxMDAwMTAwMDBhMGEwYTBhMGEwYTBhMGEwYTBhMGEwYTBhMGEwYjBiMGEwMDAwMDAwMDAwMDAwYTAwMDAwMDAwMDAwMDAwMGEwOTAwMGIwYjAwMGEwNTBhMDAwYjAwMGEwMDBiMDAwYTBhMDAwYjBiMDAwYTBhMGEwMDBhMDAwYTAwMGEwMDBhMGEwMDAwMDAwYjBhMDMwYTAwMGEwMDBiMDAwYTAwMGEwYTAwMGEwYTBhMGEwMDBiMDAwYTAwMDAwMDBhMDAwYTBhMDAwMDAwMDAwMDAwMDAwMDBhMDMwYTAwMGEwMDBhMGEwMDA3MGEwYTBhMGEwYjAwMGEwYTBhMDAwYTAwMGEwYTAwMDAwMDBhMDAwNDAwMDAwYTA4MGEwMDBhMDAwYTBhMDAwYTBhMGEwMDBhMGEwYTBhMDAwYjAwMGEwMDBhMGEwMDAwMDAwMDAwMGEwMDAwMDAwMDAwMDAwYTAwMGEwYTAwMGIwYTBhMGEwYjBhMGEwYTBhMGEwNjBhMDAwYTBhMDAwMDAwMDAwYzBhMGIwYjBiMDAwMDAwMGEwMDBhMGEwMDBhMGEwYTBhMGEwYTBhMGEwYTBhMGEwYjAwMGIwYTA2MGEwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhMGEwYTBhMGEwYTBhMGEwYTBhMGEwYTBhMGEwYTAyMjIyMjIyMjIyMjIyMjIyMjAyMDAwMDIwMDAwMDAwMjAwMDIyMjAyMDAwMjAwMDIwMDIyMjIwMjIyMDIwMjAyMDAyMDAyMjIwMjAwMDIwMjAwMjIyMjIwMDIwMDAyMDIwMDIwMDAwMDAyMDIwMjAyMDAyMjAyMjIyMjAyMjIwMjAwMjAwMDIwMjIwMjAyMDIwMDIyMjAyMjIyMjAwMjAyMDAyMDAwMDAyMDAwMDIwMjAwMjIwMjIyMjIyMjIyMDIwMDIwMDAwMDIwMDAwMjAyMDAyMjIyMjIyMjIyMjIyMDAwMjAyMDAwMDAwMDAwMDAwMjIyMjIyMjIyMjIyMjIwMg==\",\n \"tileset\": [\n \"myTiles.transparency16\",\n \"myTiles.tile1\",\n \"sprites.castle.tileGrass2\",\n \"myTiles.tile2\",\n \"myTiles.tile4\",\n \"myTiles.tile5\",\n \"myTiles.tile6\",\n \"myTiles.tile7\",\n \"myTiles.tile8\",\n \"myTiles.tile11\",\n \"myTiles.tile12\",\n \"myTiles.tile13\",\n \"myTiles.tile9\"\n ],\n \"displayName\": \"level1\"\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myTiles\"\n }\n}", + "tilemap.g.ts": "// Auto-generated code. Do not edit.\nnamespace myTiles {\n //% fixedInstance jres blockIdentity=images._tile\n export const transparency16 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile4 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile5 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile6 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile7 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile3 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile9 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile10 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile2 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile12 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile13 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile11 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile1 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile8 = image.ofBuffer(hex``);\n\n helpers._registerFactory(\"tilemap\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"level1\":\n case \"level1\":return tiles.createTilemap(hex`100010000a0a0a0a0a0a0a0a0a0a0a0a0a0a0b0b0a0000000000000a000000000000000a09000b0b000a050a000b000a000b000a0a000b0b000a0a0a000a000a000a000a0a0000000b0a030a000a000b000a000a0a000a0a0a0a000b000a0000000a000a0a00000000000000000a030a000a000a0a00070a0a0a0a0b000a0a0a000a000a0a0000000a000400000a080a000a000a0a000a0a0a000a0a0a0a000b000a000a0a00000000000a0000000000000a000a0a000b0a0a0a0b0a0a0a0a0a060a000a0a000000000c0a0b0b0b0000000a000a0a000a0a0a0a0a0a0a0a0a0a0a0b000b0a060a080000000000000000000000010a0a0a0a0a0a0a0a0a0a0a0a0a0a0a02`, img`\n2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \n2 . . . . . . 2 . . . . . . . 2 \n. . 2 2 . 2 . 2 . . . 2 . . . 2 \n2 . 2 2 . 2 2 2 . 2 . 2 . 2 . 2 \n2 . . . 2 2 . 2 . 2 . . . 2 . 2 \n2 . 2 2 2 2 . . . 2 . . . 2 . 2 \n2 . . . . . . . . 2 . 2 . 2 . 2 \n2 . . 2 2 2 2 2 . 2 2 2 . 2 . 2 \n2 . . . 2 . 2 . . 2 . 2 . 2 . 2 \n2 . 2 2 2 . 2 2 2 2 . . . 2 . 2 \n2 . . . . . 2 . . . . . . 2 . 2 \n2 . . 2 2 2 2 2 2 2 2 2 . 2 . 2 \n2 . . . . . 2 . . . . . . 2 . 2 \n2 . 2 2 2 2 2 2 2 2 2 2 2 2 . . \n2 . 2 . . . . . . . . . . . . . \n2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 . \n`, [myTiles.transparency16,myTiles.tile1,sprites.castle.tileGrass2,myTiles.tile2,myTiles.tile4,myTiles.tile5,myTiles.tile6,myTiles.tile7,myTiles.tile8,myTiles.tile11,myTiles.tile12,myTiles.tile13,myTiles.tile9], TileScale.Sixteen);\n }\n return null;\n })\n\n helpers._registerFactory(\"tile\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"transparency16\":return transparency16;\n case \"instrument3\":\n case \"tile4\":return tile4;\n case \"fan1\":\n case \"tile5\":return tile5;\n case \"fan2\":\n case \"tile6\":return tile6;\n case \"fan3\":\n case \"tile7\":return tile7;\n case \"instrument2\":\n case \"tile3\":return tile3;\n case \"instrument4\":\n case \"tile9\":return tile9;\n case \"camera\":\n case \"tile10\":return tile10;\n case \"instrument1\":\n case \"tile2\":return tile2;\n case \"wall\":\n case \"tile12\":return tile12;\n case \"stack\":\n case \"tile13\":return tile13;\n case \"stage\":\n case \"tile11\":return tile11;\n case \"exit\":\n case \"tile1\":return tile1;\n case \"instrument0\":\n case \"tile8\":return tile8;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n" +} +``` + + +