From 1113e05f958ed4271e0b093988a9d1083a0f3f13 Mon Sep 17 00:00:00 2001 From: Kiki Prottsman Date: Mon, 24 Feb 2025 10:38:48 -0800 Subject: [PATCH] Polishing off changes to Unit 2 (#6724) --- .../csintro/blocks/unit-2/lab0202-part1.md | 273 ++++++++++++------ .../csintro/blocks/unit-2/lab0202-part2.md | 143 +++++++-- docs/courses/csintro/blocks/unit-2/lab0203.md | 85 ++++-- docs/courses/csintro/blocks/unit-2/lab0204.md | 130 +++++++-- .../csintro/blocks/unit-2/lab0205-part1.md | 188 ++++++++---- .../csintro/blocks/unit-2/lab0205-part2.md | 60 ++-- .../csintro/blocks/unit-2/lab0205-part3.md | 89 ++++-- .../csintro/Unit2LabThumbnail-2-1-1.png | Bin 923 -> 2717 bytes .../csintro/Unit2LabThumbnail-2-1-2.png | Bin 1840 -> 3625 bytes .../csintro/Unit2LabThumbnail-2-1-3.png | Bin 2179 -> 4882 bytes .../csintro/Unit2LabThumbnail-2-1-4.png | Bin 2130 -> 3694 bytes .../csintro/Unit2LabThumbnail-2-1-5.png | Bin 3712 -> 11448 bytes .../csintro/Unit2LabThumbnail-2-6-1.png | Bin 1582 -> 3286 bytes .../csintro/Unit2LabThumbnail-2-6-2.png | Bin 2050 -> 4087 bytes .../csintro/Unit2LabThumbnail-2-6-3.png | Bin 2207 -> 4207 bytes .../csintro/Unit2LabThumbnail-2-6-4.png | Bin 3268 -> 4886 bytes 16 files changed, 699 insertions(+), 269 deletions(-) diff --git a/docs/courses/csintro/blocks/unit-2/lab0202-part1.md b/docs/courses/csintro/blocks/unit-2/lab0202-part1.md index 5d50a005d46..a71a50fa539 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0202-part1.md +++ b/docs/courses/csintro/blocks/unit-2/lab0202-part1.md @@ -1,4 +1,5 @@ # Lab 2.2 Part 1: How Old Are You? +### @explicitHints true ## Introduction to variables @showdialog @@ -8,49 +9,63 @@ a player's score or lives. We can create our own variables, too! +![Lab 2.2.1](https://arcade.makecode.com/api/_RdC9TMWEuKR1/thumb) + ## 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 ("")||`` +--- + +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. +#### ~ tutorialhint + ```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! +Instead of just one slot for text, let's give ourselves 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**, +The drawer that we need is called ``||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. +![Advanced drawers in the toolbox.](/static/courses/csintro/S01.L02.02.P01.text_drawer.png) + +--- -1. From the -``||text:Text||`` -**Text** -drawer, drag a -``||text:join ("Hello") ("World")||`` -**join ("Hello") ("World")** -block into your -``||game(noclick):splash("")||`` + +1. From the +``||text:Text||`` drawer, drag a
+``||text: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.](/static/courses/csintro/S01.L02.02.P01.text_drawer.png) + +#### ~ tutorialhint ```blocks game.splash("Hello" + "World") @@ -58,169 +73,263 @@ game.splash("Hello" + "World") ## Speak your mind! -Let's learn more about how the **Join** block works. +Let's learn more about how the ``||text(noclick):join ("Hello") ("World")||`` +block works. + +--- + -1. Change the text in your -``||text:join ("Hello") ("World")||`` -**join ("Hello") ("World")** +1. Change the text in your
+``||text: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")** +- Expand the
+``||text: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 + + +~hint How do I expand a block? 🤷🏽 + +--- + +Some blocks have a plus sign (+) on the right side of the block. Click the plus sign to expand it. The block will show more information! hint~ -- Now, collapse the -``||text:join ("Hello") ("World")||`` -**join ("Hello") ("World")** +- Now, collapse the
+``||text: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 How do I collapse a block? 🤷🏻‍♀️ + +--- + +Some blocks will have a minus sign (-) on the right side of the block. +Click the minus sign to collapse it. The block will hide some information! hint~ -Play around with the -``||text:join ("Hello") ("World")||`` -**join ("Hello") ("World")** +Play around with the
+``||text: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! +## 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")** +--- + + +1. Expand or collapse your
+``||text: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? +#### ~ tutorialhint + ```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! +Our project works, but it doesn't show the player's age...it shows yours. -Let's get our project ready so that we can ask the player to enter their age. +Let's get our project ready to 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. +2. At the top of the drawer, select
+**Make a Variable...**
+3. In the dialog that appears, enter an appropriate name (like *playerAge*). +4. Select the **Ok** button. + +~hint Why not just age? 🤷🏿‍♀️ + +--- + +You'll find that many programming languages have special words. +Short words like time, score, date, (etc.) often already have special meanings attatched to them. + +For this reason, whenever you're thinking of a variable for a common word (sprite, age, name, etc.) +it's best to add a modifier to make sure it's special. That's why we default to variables like +mySprite, playerAge, userName, and such! + +hint~ + 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||`` +5. Drag a
+``||variables:set [playerAge] to (0)||``
+block **to the top** of your
+``||loops(noclick):on start||``
container. -1. Set the variable's value to your own age. +6. Set the variable's starting value to your own age. + + + +#### ~ tutorialhint + +```blocks +let age: number = 14 +game.splash("You are " + "0" + " years old.") +``` + + + + +## What's my age again? 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.")** +--- + + +1. From the +``||variables:Variables||`` drawer, drag
+``||variables:playerAge||``
+into the middle spot of your
+``||text: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. Change the value of **playerAge** in your _initialization_ block +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. + + +~hint What is initialization? 🤷🏻 + +--- + +The word _initialization_ comes from the word _initial_...meaning _first_. We use that term +because, before you can use a variable, you need to _first_ tell the computer what it is. + +The first time a
``||variables:set [variable] to [0]||``
+block is used in a program, several things happen: +- The new variable name is added to our ``||variables:Variables||`` category +- The variable is given a starting value +- The computer recognizes the _type_ (number, image, string, etc.) of the variable, and knows +that it needs to make sure that type matches everywhere in the program + +hint~ + +--- + + Check the hint if you need help. +#### ~ tutorialhint + ```blocks let age: number = 14 -game.splash("You are " + age + " years old.") +game.splash("You are " +playerAge+ " years old.") ``` ## Does order matter? -What happens when we switch the order of these two blocks? +What happens when we switch the order of your two blocks? + +--- -1. Switch the order of the blocks in your -``||loops(noclick):on start||`` + +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? +--- + + +**Question**: Does the order of these two blocks matter? Why do you think that is? + ## 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?" +--- + + +1. From the
+``||game:Game||`` drawer, drag
+``||game:ask for number ("")||``
+into the red initialization block. +1. In the text field of the ``||game:ask||`` block, enter a prompt for the player, +like. "How old are you?" + +--- Check the hint if you need help. + +#### ~ tutorialhint + ```blocks -let age = game.askForNumber("How old are you?") -game.splash("You are " + age + " years old.") +letplayerAge= game.askForNumber("How old are you?") +game.splash("You are " +playerAge+ " years old.") ``` -## Ooh! A keyboard! +## Ooh! A number pad! -Run your program and notice how it responds now. +Run your program and notice how it responds. -Now you know how to display a keyboard on the screen! +Use these instructions to interact with the number pad. + +--- -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. +- To select a number, 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.") +letplayerAge= game.askForNumber("How old are you?") +game.splash("You are " +playerAge+ " years old.") ``` \ No newline at end of file diff --git a/docs/courses/csintro/blocks/unit-2/lab0202-part2.md b/docs/courses/csintro/blocks/unit-2/lab0202-part2.md index 1c4e69e8875..aea230f8f2d 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0202-part2.md +++ b/docs/courses/csintro/blocks/unit-2/lab0202-part2.md @@ -1,4 +1,5 @@ # Lab 2.2 Part 2: How Many Items? +### @explicitHints true ## How many items? @showdialog @@ -7,19 +8,28 @@ 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. +![Lab 2.2.2](https://arcade.makecode.com/api/_LoRf3w2ruPUc/thumb) + ## 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: +--- + +Create your hero sprite using an appropriate name and image. + +Add blocks to your project so that your hero: + +- Is controlled by the player with the directional pad +- Stays on the screen at all times + +--- -- 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. +#### ~ tutorialhint + ```blocks let heroSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) controller.moveSprite(heroSprite) @@ -28,19 +38,27 @@ heroSprite.setStayInScreen(true) ## Add some sprites! -Now, let's add a sprite to the screen whenever the player wants one. +Now, let's add more sprites to the screen whenever the player to. + + +--- 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: +presses the **A** button, a new sprite appears. Make sure each new sprite: + +- Has an appropriate variable name +- Has an image assigned to it +- Has a kind other than _Player_ assigned to it +- Appears at a random location on the screen + +--- -- 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. +#### ~ tutorialhint + ```blocks let foodSprite: Sprite = null controller.A.onEvent(ControllerButtonEvent.Pressed, function () { @@ -53,36 +71,73 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () { Let's create a simple story for your project. +--- + +Add a splash screen at the start of your game +that explains your story. + - 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. +- Why is that happening? + +--- + When you have added a story to your game, move on to the next step. +#### ~ tutorialhint + +```blocks + +game.splash("I'm a hungry duck who needs strawberries so I can fuel up for my long flight!") +let heroSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +controller.moveSprite(heroSprite) +heroSprite.setStayInScreen(true) +``` + ## 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 +the total number of sprites the player has created. Give the variable an appropriate name. -1. Add a block to your -``||loops(noclick):on start||`` +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**. +the initial value of the variable to zero. +1. In your event handler for the **A** button, add a block to increment your new variable. + +--- + + +~hint What's "increment" again? + +--- -~hint What is a increment? When we increase the value of a variable by one, we often say that we are "incrementing" the variable. + +(Although, it's also possible to increment by 3, 5, 10, or even 1000.) + hint~ We've created the variable, but we aren't using it yet. We'll do that next! +#### ~ tutorialhint + ```blocks +let foodCount = 0 let foodSprite: Sprite = null +game.splash("I'm a hungry duck who needs strawberries so I can fuel up for my long flight!") +let heroSprite = sprites.create(sprites.duck.duck3, SpriteKind.Player) +controller.moveSprite(heroSprite) +//@highlight +foodCount = 0 + controller.A.onEvent(ControllerButtonEvent.Pressed, function () { foodSprite = sprites.create(sprites.food.smallStrawberry, SpriteKind.Food) foodSprite.setPosition(randint(8, 152), randint(8, 112)) @@ -96,20 +151,28 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () { 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||`` +- 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! +- Feel free to use a +``||text: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. +#### ~ tutorialhint + ```blocks let foodCount = 0 controller.B.onEvent(ControllerButtonEvent.Pressed, function () { @@ -121,21 +184,35 @@ controller.B.onEvent(ControllerButtonEvent.Pressed, function () { Now, let's say that the player can pick up objects, too. -1. Add an -``||sprites:on overlap||`` +--- + + +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! +1. Change the block so that it runs when the Player collides with your other sprite kind. +1. In the event handler, destroy the other sprite when the player touches it. +1. Remember to decrement 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? +~hint What's "decrement" again? + +--- + When we decrease the value of a variable by one, we often say that we are "decrementing" the variable. + +(Though we _can_ decrement by other numbers, as well.) + hint~ +#### ~ tutorialhint + ```blocks let foodCount = 0 sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { @@ -150,6 +227,8 @@ 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!") diff --git a/docs/courses/csintro/blocks/unit-2/lab0203.md b/docs/courses/csintro/blocks/unit-2/lab0203.md index b9029f69f32..69555d628f5 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0203.md +++ b/docs/courses/csintro/blocks/unit-2/lab0203.md @@ -1,27 +1,38 @@ # Lab 2.3: Variables and Math +### @explicitHints true ## Variables and math! @showdialog -Variables are helpful for our programs, -since they let us store information that we need in our program. +Variables are really helpful, +since they let us store information we want to use in our program. -Variables become even more powerful when we can combine them! +Variables become even more powerful when we combine them! -In this lab, you will discover different ways to use math with variables. +In this lab, you'll discover different ways to do math with variables. + +![Lab 2.3](https://arcade.makecode.com/api/_6rp7vgR10M1P/thumb) ## Ooh! A playground! -First, let's build a playground. +Time for a coding playground. + +--- -Add blocks to your -``||loops(noclick):on start||`` + +Add blocks to your
+``||loops(noclick):on start||``
container that: -- Asks the player for two numbers. -- Stores those numbers in two different variables. +- Ask the player for numbers two times +- Store those numbers in two different variables + +--- + View the hint to check your code. +#### ~ tutorialhint + ```blocks let number1 = game.askForNumber("First number?") let number2 = game.askForNumber("Second number?") @@ -29,54 +40,78 @@ 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. +Let's use the two numbers collected from the player. + +--- -Add blocks to your -``||loops(noclick):on start||`` + +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? +~hint What is a sum? 🤷🏽‍♀️ + +--- + The sum is the result of two numbers added together. In other words, -use the addition (or "plus") operator. +use the addition (or "plus") operator from the ``||math:Math||`` drawer to get the sum. + hint~ + +--- + + +Run your project to test that it works. Try lots of different numbers! + + +#### ~ tutorialhint + ```blocks let number1 = game.askForNumber("First number?") let number2 = game.askForNumber("Second number?") game.splash("" + number1 + " + " + number2 + " = " + (number1 + number2)) ``` -## Complete @showdialog +## It's all in the numbers + +Let's learn about some of the other blocks in the ``||math:Math||`` drawer! -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 + (In other words, write down the numbers that you enter...and the result...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||`` +experiment with 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 +your trials and your explanations. If not, use any method that you like to record your trials and your results. Have fun! + +## Complete + +**Great work!** + +Make sure to turn in your lab if your instructor has asked you to do so. + + + ```ghost let number1 = game.askForNumber("First number?") let number2 = game.askForNumber("Second number?") diff --git a/docs/courses/csintro/blocks/unit-2/lab0204.md b/docs/courses/csintro/blocks/unit-2/lab0204.md index 3dca55a1090..a4127a496a5 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0204.md +++ b/docs/courses/csintro/blocks/unit-2/lab0204.md @@ -1,15 +1,16 @@ # Lab 2.4: Silly Story Time! +### @explicitHints true ## Silly stories @showdialog -In this lab, you will create a silly story in MakeCode Arcade! +In this lab, you'll create a silly story in Microsoft MakeCode Arcade! -## First draft +![Lab 2.4](https://arcade.makecode.com/api/_6YYL5gDzd48J/thumb) -First, you need to create a silly story. +## First draft -Start by writing a story. Nothing very long. -Just two or three sentences for now. +First, you need to write a very short story. Use a piece of paper or a word processor. +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. @@ -21,25 +22,34 @@ Or, you could ask for something a little more specific 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*). +Give your variable a good name (like *adjective1* or *firstNoun*). 1. Ask the player to provide a value for each variable. - - Use the - ``||game:ask for number||`` + - Use
+ ``||game:ask for number||``
for variables that will hold numbers. - - For the rest of the variables, use the + - 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. +#### ~ tutorialhint + ```blocks let aNumber = game.askForNumber("Enter a number.") let aColor = game.askForString("Enter a color.") @@ -49,16 +59,24 @@ let aColor = game.askForString("Enter a color.") 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 +--- + + +Use a
+``||game:show long text||``
+block with a ``||text:join||`` block to display your silly story. -Remember that the **join** block is the **Text** drawer in the +Remember that the **join** block is the ``||text:Text||`` drawer in the **Advanced** section of the toolbox. +--- + + Check the hint if you need some help. +#### ~ tutorialhint + ```blocks let aNumber = game.askForNumber("Enter a number.") let aColor = game.askForString("Enter a color.") @@ -67,22 +85,29 @@ game.showLongText("I am " + aNumber + " years old and my hair color is " + aColo ## Complete @showdialog -Good work! Now, get creative! Try some of these ideas, or try some of your own! +Good work! Now, you can 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||`` +- 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.") @@ -90,4 +115,69 @@ 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) +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + if (projectileCount < maxProjectiles) { + fireSprite = sprites.create(lab2imgs.flame, SpriteKind.Projectile) + fireSprite.setPosition(flamethrower.x, flamethrower.y) + fireSprite.setVelocity(0, -200) + fireSprite.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 > maxEnemyVY) { + enemyVelocity = maxEnemyVY + } +}) +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 iceSprite: Sprite = null +let fireSprite: Sprite = null +let maxEnemyVY = 0 +let enemyVelocity = 0 +let maxProjectiles = 0 +let projectileCount = 0 +let flamethrower: Sprite = null +scene.setBackgroundColor(11) +flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player) +flamethrower.setPosition(80, 110) +controller.moveSprite(flamethrower) +flamethrower.setStayInScreen(true) +info.setScore(0) +info.setLife(3) +projectileCount = 0 +let difficulty = game.askForNumber("Difficulty?") +if (difficulty == 1) { + maxProjectiles = 5 + enemyVelocity = 15 + maxEnemyVY = 100 +} else if (difficulty == 3) { + maxProjectiles = 2 + enemyVelocity = 50 + maxEnemyVY = 200 +} else { + maxProjectiles = 3 + enemyVelocity = 25 + maxEnemyVY = 150 +} +game.onUpdateInterval(1000, function () { + iceSprite = sprites.create(lab2imgs.icecube, SpriteKind.Enemy) + iceSprite.setPosition(randint(8, 152), 0) + iceSprite.setVelocity(0, enemyVelocity) + iceSprite.setFlag(SpriteFlag.AutoDestroy, true) +}) ``` diff --git a/docs/courses/csintro/blocks/unit-2/lab0205-part1.md b/docs/courses/csintro/blocks/unit-2/lab0205-part1.md index b66cda0286f..c3ec68e17d5 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0205-part1.md +++ b/docs/courses/csintro/blocks/unit-2/lab0205-part1.md @@ -1,63 +1,80 @@ # Lab 2.5 Part 1: Pick a Number! +### @explicitHints true ## Pick a number! @showdialog -Let's make a game where the player guesses a number that the game show host +Let's make a game where the player tries to guess a number that the game show host has chosen. +![Lab 2.5.1](https://arcade.makecode.com/api/_cMkLyW8wc8vk/thumb) + + + ## Set the stage Let's set the stage with a sprite for the game show host. -1. To your -``||loops(noclick):on start||`` +--- + + +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. +sprite for your 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||`` + - 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 + - Set the pause to something between **`2000`** and **`5000`** 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. + + + +#### ~ tutorialhint ```blocks let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) hostSprite.sayText("Guess which number I am thinking of.") -pause(1000) +pause(5000) ``` ## 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||`` +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||`` +set the value of your new variable to a random number between 1 and 10. + - Remember that the
+ ``||math:pick random||``
+ block is in the
+ ``||math:Math||``
drawer. -View the hint if you need some help. + +#### ~ tutorialhint ```blocks let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) hostSprite.sayText("Guess which number I am thinking of.") -pause(2000) +pause(5000) // @highlight let hostsNumber = randint(1, 10) ``` @@ -66,19 +83,27 @@ let hostsNumber = randint(1, 10) 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||`` +``||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. +#### ~ tutorialhint + ```blocks let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) hostSprite.sayText("Guess which number I am thinking of.") -pause(2000) +pause(5000) let hostsNumber = randint(1, 10) // @highlight let playerGuess = game.askForNumber("Choose a number between 1 and 10.") @@ -87,42 +112,67 @@ 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*. +*conditional* statement. + +~hint What is a conditional? + +--- + +A conditional tests whether something is true or false. It only +runs the associated code under the _condition_ that the statement was true. + +We are going to add a conditional in the form of an ``||logic(noclick):if / else||`` statement. + +```block +if (true) { + +} else { + +} +``` + -~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||`` +--- + + +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||`` +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 +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||`` +1. Use blocks from the
+``||variables:Variables||``
drawer to make the -block say something like this: +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||`` + +--- + +Use the hint to check your code. + +We'll fill in the +``||logic(noclick):if / else||`` container next. +#### ~ tutorialhint + ```blocks let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) hostSprite.sayText("Guess which number I am thinking of.") -pause(2000) +pause(5000) let hostsNumber = randint(1, 10) let playerGuess = game.askForNumber("Choose a number between 1 and 10.") if (hostsNumber == playerGuess) { @@ -134,26 +184,34 @@ if (hostsNumber == playerGuess) { ## Say what? -Now, complete the ``||logic(noclick):if||`` container. +Time to fill up the ``||logic(noclick):if / else||`` container. + +--- + + +- In the top half of the container,
+(the ``||logic(noclick):if||``)
+add blocks to make the host +say that the player was correct.
+ - Use a **join** block to also show the correct number +- In the bottom half of the container,
+(the ``||logic(noclick):else||``)
+add blocks to make the host +say that the player was incorrect.
+ - Use a **join** block to also show the correct number + +--- -- 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. +#### ~ tutorialhint + ```blocks let hostSprite = sprites.create(sprites.castle.princessFront0, SpriteKind.Player) hostSprite.sayText("Guess which number I am thinking of.") -pause(2000) +pause(5000) let hostsNumber = randint(1, 10) let playerGuess = game.askForNumber("Choose a number between 1 and 10.") if (hostsNumber == playerGuess) { @@ -165,12 +223,18 @@ if (hostsNumber == playerGuess) { ## Complete @showdialog -Good work! Let's use conditional statements to create another game in Part 2! +**Good work!** +🥳 🥳 🥳 + +We'll 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) +pause(5000) let hostsNumber = randint(1, 10) let playerGuess = game.askForNumber("Choose a number between 1 and 10.") if (hostsNumber == playerGuess) { diff --git a/docs/courses/csintro/blocks/unit-2/lab0205-part2.md b/docs/courses/csintro/blocks/unit-2/lab0205-part2.md index 4bb09ba0572..07a5a4c3b11 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0205-part2.md +++ b/docs/courses/csintro/blocks/unit-2/lab0205-part2.md @@ -1,42 +1,57 @@ # Lab 2.5 Part 2: Can You Even? +### @explicitHints true ## Is it even? @showdialog -Many programs need to test whether a number is even or odd. Let's write one! +Many programs need to test whether a number is even or odd. + +Let's write a tool for that! + +![Lab 2.5.2](https://arcade.makecode.com/api/_bFJerdL13K0e/thumb) + ## 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. +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. +#### ~ tutorialhint + ```blocks let theNumber = game.askForNumber("Enter a number.") ``` -## So, is it even or not? +## 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 []||`` +--- + + +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: +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||``. @@ -44,11 +59,19 @@ drawers to make the block say the following: 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. +#### ~ tutorialhint + ```blocks let theNumber = game.askForNumber("Enter a number.") if (theNumber % 2 == 0) { @@ -60,7 +83,10 @@ if (theNumber % 2 == 0) { ## Complete @showdialog -Good work! Let's make a fortune telling device in Part 3! +**Good work!** +🎉 🎉 🎉 + +Let's make a fortune telling device in Part 3! ```ghost let theNumber = game.askForNumber("Enter a number.") diff --git a/docs/courses/csintro/blocks/unit-2/lab0205-part3.md b/docs/courses/csintro/blocks/unit-2/lab0205-part3.md index d2ed7dd1ce9..14f3daf8366 100644 --- a/docs/courses/csintro/blocks/unit-2/lab0205-part3.md +++ b/docs/courses/csintro/blocks/unit-2/lab0205-part3.md @@ -1,4 +1,5 @@ # Lab 2.5 Part 3: Magic Four Ball! +### @explicitHints true ## Magic four ball! @showdialog @@ -6,26 +7,37 @@ 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! +![Lab 2.5.3](https://arcade.makecode.com/api/_59T26bVHiHV8/thumb) + ## 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||`` +--- + + +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. + - 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. +#### ~ tutorialhint + ```blocks let fortuneTellerSprite: Sprite = null -scene.setBackgroundColor(9) -fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +scene.setBackgroundColor(1) +fortuneTellerSprite = sprites.create(lab2imgs.crystal_ball, SpriteKind.Player) fortuneTellerSprite.sayText("Think of a question, then press the A button.") ``` @@ -33,37 +45,42 @@ fortuneTellerSprite.sayText("Think of a question, then press the A button.") Now, let's respond to the player's question with a random response. -1. Add a -``||controller:on (A) button (pressed)||`` +--- + + +Add an
+``||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 +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. +1. Add an
+``||logic:if (true) then [] else []||``
+container. +1. Select the **(+)** plus sign to add enough branches to your
+``||logic(noclick):if / else||``
+container to handle four different options. +1. Add enough conditionals from the ``||logic(noclick):Logic||`` drawer to your
+``||logic(noclick):if / else||`` container to make the branches say +something like
+``||logic(noclick):if < answer = (1) > then||`` +1. In each branch of the
``||logic(noclick):if / else||`` container, 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. + - 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. +#### ~ tutorialhint + ```blocks controller.A.onEvent(ControllerButtonEvent.Pressed, function () { option = randint(1, 4) @@ -79,14 +96,24 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () { }) let option = 0 let fortuneTellerSprite: Sprite = null -scene.setBackgroundColor(9) -fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +scene.setBackgroundColor(1) +fortuneTellerSprite = sprites.create(lab2imgs.crystal_ball, 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? +Great work! +🎈 🎈 🎈 + +What are some other ways that you could use conditional statements? + + + + +```package +lab2imgs=github:kiki-lee/lab2imgs#v0.0.2 +``` ```ghost controller.A.onEvent(ControllerButtonEvent.Pressed, function () { @@ -103,7 +130,7 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () { }) let option = 0 let fortuneTellerSprite: Sprite = null -scene.setBackgroundColor(9) -fortuneTellerSprite = sprites.create(sprites.builtin.villager1WalkFront1, SpriteKind.Player) +scene.setBackgroundColor(1) +fortuneTellerSprite = sprites.create(lab2imgs.crystal_ball, SpriteKind.Player) fortuneTellerSprite.sayText("Think of a question, then press the A button.") ``` diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-1-1.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-1-1.png index da717e0c72e0de0bf91a491b39f4e3d6330f363e..60d67d6f47a2439d63cb5c5661392a366fd025cb 100644 GIT binary patch literal 2717 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 dA7bDLVu;ptn~@U|1OJ5>2d delta 892 zcmbO$I-7lhBnJ}%1H)5Kqumn~#p{`UJzX3_D(1YsYuGK5D#89CUEeX^MVgswrSO}h zPC`vLo^Z1$x~>t~-OwuUB%-?Ull78qe4f%eBDy?gnwMCb3^~}n@^sYr9=}aXFEcWK zZ~gsW-PJem?ws3Q{l9wN_qnt8b^~og1`SMWg7_co+_f&4f1ySF>QKG=e@`fOD9woB z>-4c?59ksUPd&P`U#s<}_oSnHfAVv_?&5f~ z&i>KK=@T+lUq&r|ZWA#n+`^e_cl@VC*KfSr{MT1v$L*8BF0M9V?oGQ5k24>REmEDg zRq5HX?UPKcb2Rs|V^ z9vN*|Q#aAoF2v>E@+sO|q|>@8wO$)*^G2TW?VSH8yE9pB()qiaBdj`-olYv>IFTd} z>txyNbBG-|P!Vhg{`%OuJ=yYc{T=J~?UWKszrS}zmBs02^&cm)I;wCtd5E!0)S2UF z+i-OE-@||FJ65cE_27ZR*9b8m*Ez@j)lIG9IQ{I)*^1E6zr__da`p#?*4tE0DzoWc zrsTKypZ>(2?zst+(m&u-AlzH~@ zitM#Nmu8%OTwD2aZ^w@(hc?|)a4|LWZ1jI$|@u6G=FyG7=o zIy>pg9WbOJxqp6i&$FvgFgsd}MZ4`1;y@dAt2P9!~9#i?81@Q^#)iM+>EY`@V)3 zFJE-STfqFb#KExHMzopr0KC7RjsO4v diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-1-2.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-1-2.png index 8540559cf5ff44f5d6ba9d6adbc0c1d46127e677..3ef2aa6b95c8252c1d8e42cbde7976801d712a59 100644 GIT binary patch literal 3625 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 delta 1817 zcmZvbX*e6`7RTL=?b2Ift+lcsmg=;WDq1Q^YI0q~9?Vc%5mgnt%+tV#-fveR&w6EgMQvcM@?*GIQ+ZL&A4lWGfvURBb6`zI?V|9DQV9R3%57_`p8 zDql=Z{eXPy90a9811WKJFEx_nH+)Nk52v4Lz<*{wWF!0Nf59|8(3&u~6m*-U7{?NMs&gzKt3*Q~@~6$74Yc z3JB!DkYH^sZ662C3cm{EDxw#Yb8jIY*jqoxJ0W4EP}_~G2AjF5unGuR00KRRFUnP zPn)ogyVML7zcx4U(`c{6B8z2hMh30djcd|+Eb7OuvB@Q>bzY9ILn1tJKlLxh&7|4G z%?O6=;Ao}Gqc#ka2&$Z&=4W``ze-srVf0@XC?jS=x`kaP7#r1e+WPGfBg94-6yWgu+ikt>3#`l?u4#ZoBBcO9}kI)Q}scFqpDEiV~0i zbr;DX6EZA97&@+KdtVkO6_Z*~+gzDj^r#7G+Lk;Vv$eBRmIY0h{OX7->a9nJRpQbc znU5~DPGV!0a>rIaj%_pI#lO$nE@Yr1{Is62m2It7ks^oKT@A)Io6$mlJg~vJhMn#^ zmK~iEzne}U!FO6&z~LPa)@CkX`8Nw3C<`CM#pU{y3taicCmZvthFAGD^I!6sHHCXT-a^`i7?c||9OLr z79Z~6iAz(Z>q~f_#_j&`f_BawZ1K>7sR;Z^!V7Bmf1E9I96>_w)**VsQ1&v?hu6=) zt8Y%*li9VIBbzHPDIOFp!KH-c1^f%})_GV^AP=J5~fz3%8-&SX5`}01q6DPR~ z2@nuA#}NpUR|9=XsNxRqcJ{ur7ZVi{6!cL*x^NkU>01#*Od{qJzMH(+h_cwjI}erVWLG!gWWZARPOCDu-z$`%Xm?e$WaNh_3{%5DLjj+MlF zgw704=(TC*3H7FiCzu{ao9^jz*tR}m$gU{ri<+<$`yZNGEFodW?DTL@=jWHMr`*!7 zXTf+MIiIH+5LrbBz`OMf1*|FucW)s0VVV=6soS?QDr%CV&RKyE_DzR+`pWwKIA>DZ zngmmUiqp*MAssz>wEQ_LbkrF#ZEY@dac>RXz}TVO+%g*yT$mBOlRW$8Rv|&BDqAu>>$_xrVQ<|7z8|vRrw>tUcL7?zZj}amo;39= zLIbr2n$-{If0-K`8E|LNr4|hMFDYMn`Jc08{h|*g&+I)^@8aPt+(q`Eu*OT@=llg2 C-F_SZ diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-1-3.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-1-3.png index f6edf7c68f41c9c06be647349388c9e1b5649e45..15e13399639fa9f575ce475ed6dfeacd88c3f1a5 100644 GIT binary patch literal 4882 zcmb7IXEfYFv|mJT38F-c8quSdAUe@jC)$dZuK;hp#4y?4(0F#oydKX-1Kx%bX*CIM)yOG|Z!3IG7m>g#El5&9WIdrv_| z_2cl=8`h!JA+qeWhLn8e@vd zA`&8YPj)6SP4|pcGdVlh;Cq$;eD}=%B0jLe6<+YICHw#m8ejI=a~L4et81 zec5kEreTq7uR7?&?g40R@uKBioo?911zsygMXp5xIuEguVqq%Yt8x~WVoj%<0$sv! z-`Hq$2SZyOVnN|FXV!(bu-@X9My21*p+89xy7w?Fbxx<8Kvqz18PD#RCF2ok z1y>2c z5vX`=5%;~C+A-K9Iz#0$y{ox%4rv61T?4isDz<*uF`yTWODH90T%+2f5eW5omVD2t z@jaIz1*1M9PBQhz|40l$B~7t%uSn1-`AnQ#tzoDJX3a239z%YW?2jQVlZvctm-yiV zuxc`g0`((JgZKN;qEF*8l-VC6bYDx*lfuZon7_i8ul_m!~+R%#p6o<0~RA!=c82XGtWl#c$S|Kl|w~73anCvHlHSlK`{*`D3>?Wd~ zCf~Q*QfNxNlz3ySb*}rJf1-4)5!K&n<|I6}`r?(*WD8Wb&VL(i7^^avz!i}KeweTk zP?SMotIY}TJ_m@2+@TEq^<AJ>$eK=0PF~$ZRA&vRN0ZBG^D1&zid>NHn1i~ z(H>CGSTRJ`Us+wlXTKbWRD_Z>@)B=gp9eWE*r&E&@HtZI3NKRKvLzmTNaSQ;Qmh?h<3wzh@J!^Ksnc3vsDbvge#)D>6&n;z7 z+izHDD|yWs!>wcIX#o`RPaEz5^wfQnk!e-c#Q3znmy1Z0$|Iqh8t@|dCU3-%utSeP z`EgDY(ofh}RlzSKqdZd#L>Hgl{#PlN{fVE~ZoQwS4I)4HCHvl=hIY1|0VeGth_^^# z!Da;pNRM%h$O&|hYFfvjck5G(YmF^0xK{((%Q=~iU6C=eP}w!wkk39k`g`1pk0n`G z+TC`tK1&GNUA)Sq!Rdaavq~>4Z{MBz?Wgclr8AB3PT7nUXy;SjXP=%g&A!W{uk(CY z!=sNK45nGq&oq?8ka=uMY8C_EMkC24gK)f7Ef%vu13*)zpoeF1Zd)YV5$718M5!x} z>%2v2@viG1yNVKaM?Z1gIbTxFYMgwM;K%Q{j@HkmgPWDpG-=g8<$>(3v4!&?$Ca&Nr^aFI z;Ezj+k!=(T(lOhCkqz1j3v%>c_B#{jq#*)$3^kp z(W4(XeJE$_XWBXn^|3LcTt_LYC#)(egR|!=%&|o`O|G`FShr|=33mg5J@mjMr4c=J zZ-y{vRb$^>h{qoJQs%T?+2b#llTJJ@mbVLnB~GqVOTO;+_zs5Gp6%M%yLZG`Rwb-T z4LJJFO`4yx6>*xVxNLDbU!3f`EqHgU1T6nH+X(a7CwAwy2N}@`XNcE8fiF)1ein_! zgvN;Ze6F@2?7@-Q!e7Cexf)DRW8}OXNXB0Nv*YvOsLnu4xjqjgHJ@f5sY2lXjxB8V zcwv_fmZy-gZ*q;Vh2$1>1i05#U`|gZ1J{RdqYGK$3khbrk9ol=7I0si;|mH1dcyl> zM-wp7j2@3J1_U1qtMjJSwNnb*50A!XIYapbJv)kCt;-u-XE$e-vkQAK;l<<@&je1s zo+}gfGb@sO=_w(Ww0Lg;G>UHiTfgf|q|?Fqk_x`RrAyNsBKvaq%Cd)0K4R;i4G$>O2yCUAQK?L9QD<6Ecq}2X`s(xL6N8 zOI*I*Q2CT+I?UNjo$Xi#L0Y417T=|nQ`=x4J|m<+I^E9%)F;ppBKproiec^}A>%iq zfy@1uEFPj2^J9H-x5HZ#i0s+|w1@nDR3up`LP}xMdr?oJ(vR<(AgFX+XcS3exPK+( zSplcMoGL4ERFPCn^4!}ru*dE8Hh(1}TW~&Cv=J{vXNZh;_5na6_g#~%RlCu_63?Pn zfwW#qHRPZs5p8n^+9^v*h6aJZ_;{A>JK~5VeY%&1a=mY)e<<%ht=kCr!2bTR*s~O` zV-BRfBS7`)lwX`iqx){MqN?LvVO=>mdYhaO4Fm5CscnjYD`v8;U#ad_q)7aQy6<=< z;#BXzjV4QaOWE1M(R4h_8-!Zhy!#FDC5G)?pYCaV4*-A*s$OkewSojeUrk~UOe_kqF?hZo4RXxc! zIKAcAbB~WWFpXZQn-r(jK8e}!-AfcKYHS3>?{~&p9^XgS9`ccoO3lcJS@&Z0x}3Y` zZJks?M`mHelX>~`@|XKwd*-JW0xQ%bopp5!-}`fxr3=M%%7JA{2}R@4j{(vzzW?aO>#Ud}Z@^c;Y1iE%X#x&rNc}4;(9wryPB%I`HHh zYDBzRihBRBf^fiS*aHb`#^QWoDbU-{w%nWR{Qr4=6EXH^G5kXT|A^a)Lp;J`5l9_- zvBcsPV6_N44-sQIavhQ{UCi;;u}7%a;DDG5zL84?M1-$0DEVky-K=_YMPz47EQd`^ zFD4+FCAPG-lQQ2g;675{EEW=Aa${PPta`3h%F>}y-34icB1_a_S0IUCjZs@fa?zcs ziH2KA;}piah=zOf0-zoy(h>y7^*uKmUkucZuQPSb#YQ31IxEKLt1~XVu+nxv=xW{9 z@dgOJ1AiN~t({#96q1yYqEJ`H)5#05l7S?btr6l`oL9J~lu|S=!E%H2a#7In`6q_6 zZ=9gA#C1IL$jfnId>EjjBqBa?mP8IKxF}KxEbyLiA&5j5c46`4U!bx-+sd8i)=|?k zKn$nIEx*#}x%IvYm~o%Nto$Ps)FBSP9zNtUOJYT1ip{ApyOx8m)$J!?)IiJEk$pPZ z4?xJRJDaTRI46sCmT}K|8!K4ScaKIIZL%SE=?uunXR|l`AEe|H^!zuhLf6df9C`1++J!*j zZry@}-`G|ag)-G|ZZ%U4x5{rAnj)%06)q>?_N=EFP~5_+dLKAj#~oaHqy&+liA-;G zcn5YXDxk?Z7QXYxk<&8uB3Jt?=hw^oal|}Ufi)lMRo@MMGOx)iwy-QKsZO6Bu)>GM z0Pn_mzFe}fcgQr8>-oY{tP3fb`h|vuvnC7ZbEv8F_&N@uElEm(X_y+wpi@v8`7bNe z3off^F=Dd+X7uUPky@Jml%bzZA!Nh_<)-1>mv7Ld$fGc5)f~IOqJsh0M#2BeAj;W- zYSQDDEbMLhxqH>iso%)`kFmY0k8r11BXO^tS^Lucb=LTP2iPv;#uH4^h4862s!fuV z3k$dF>f$mE9dryZ2qeqF=`Y7D+Aggc;ELA19Pjv+A4=wKMb?S+z!oS#MwGD3i0abK zzyi{hj8xvN$M1i*`76N#lAl8Y8huH#PesiIVd$s7c|j}F4{t=OM>rOW)hH)c@`G+~ zyr8Xhi5Mk8Ag>|vBp%W(EaU6C&vg&X>zl?g+2!G^@^{|eGGYCFa8|F+d2#X-#aVpguhaBIjV(tEEWv-(*+!v^zwZLhG+sn3;i=D_M)8B1OIHrh-w43c zEnG?ic#H*AmE9`sAdzUIPyALHNq#J0FAiWy?_*{&Vq=l(8c5II7{7U#rlr4vFnY;A zWLT#!jqH-c*1nhJ5wW{@rD38chRs4&-PoJo>}ig9f~2lP@amLI+U#BRx5Jte7PG@T zUoXXnp3$^y447{0rQ8_FqA}a#_c|{iTPc~oP;`1)*$BJqKcpFcC{;yLGI^94m<~}K z)}g`W^G809JI^JX%bUlxe#E+Va za@}2_PouRoUmQ<#!r28x0*T!XsM>Wsgr*1dqHYBHtfG=WuK_LpR{j0iE>nz6ZOBRj zT4ZJoFe}Z&823pj&tnxVyk3toNah77I{bR=i4Be5e<;q-DC)~fcBT;(_^eV$!IHen z(`~GL1r_;+i?a)*`*?DgSu(y?UD86++<`Gl1+w`^ju12@?<-wUK zfdZc#aN>q65?!CbCkz(`mxQ_qV z&=6W!PP&qAQ1pP&GvM={Nkb>NOr_smpWeO6HZjp^L{&?F;-#&gDWXV8Aq>64VVA>i z{rwP8X$0`SV0PnvBv}>bbqfxnKMa^VgVOw@UayS!NXHv8{HC zu8nMA5+{zC)m2rGHNCSlk=CoI%hr5xyNuLMW_^Tcd6lqZ3rhFp^_8$X%i zghLHs#dvU^+7;KQzOsH{#w1hW)l&!TaTB1-_O|B|-#9FzP883+OZ008AlGP{u>7k>yfNklf*voLa&1I;{5WgT7XsytHL0XpXBMpuC^QL41nf_gm05?RrTG45o}6l z^tYG6u9>XhVntl(?NrM*0WdN)rX)B2Bh{5wwT#EE+pJQ)nBrSu}HOrqE6XvuNPJOrgz8 zWwG8zWeV+QB#V47maO1J5Uc$aH$H?k%Sf+P*GZU+{DgH#q5hUqKcm{G{9i)Rqq}fE z<3vS_lrK6(lN2!AE>~g~r=?RWRx;V4OhNMPu$2`04pi~bk@7sR&VRoZbv>BDuDMLk zgfC38T5S-Y^`+FNH_zQIJWBab3)t-XsB;kA?V5cjZG}B-B9SP%N#}W9#jFI`r)b+; zI5kupt%yat)S^`|cqX3pr3zG!%7R_9f3=3LS%0NapLy}^2ltBZ6N|x0{fn_Hmv74a%~sr0!zE}G3wNp4-Rz5f zT&akK&F~Ei^okXH#8Bo&hzeP$2B36UgB&_i_5YRN(>GK^{e#HC3i&zl7?{haK~x4S zBIR-A32nhMMLW6mofW|>+Q!9i@hOa>C5)fDTQPKC91SuaL4RRIBXkU99as`RA|fIp zA|fIRg2VV|t@L)v!p`1Fvn{b4A9^4wxbjtjQlhI^^2zE8rYq=-;wY~ScY_#pP~^L$ z$=v7H@YPbM7zm>JU(oL~v;ufE`bquUK(=wWB1T=Yc0ariU@4WiN~J^|#68_V1L(@m z=`RjVUIWmS&VN8FkN^h9uSDG*vXi?Nu|5^6)W@np5;%eZ5JeF63MXfQ$d$mOohJb_ z?`o457spQn7y{I$p7a?OMK`%y5rvUcx0T*becmu$*+IBL)N7%Tnpfy-_W*$Y(Nm>9 zgmuw1u2;kwZ2k1^`S40otBAbBh){x9W?Wp<{PL`vCVxs@oL`>XBGJpr*);AddU*E-vh6I3p2Rr~HW3&2Oq%IPH6|q`8y^BZ)L6ln9KYB_o zN@GTqMt@vLc~T%3W-2^^s|Gh4A3}~{MXVaDU=%_NVpBRZG=3WS_wg2H68edtyr?eU z$fhzEddM9i1X1#IVprP@?HY}~$+xP8HH8suN@w)9lRNmG6|zDI6;bXB_Z_*pab>%q zP2Z}QJ-L;F+|`_>YzF!Fqr0+mzPFPjSP{tzVSk>G=}+ItjlPAMMByVgXS)ZaB8ri* z%{zqCJss_XQ{dA#?qNkFD}+BpmAWVu5xGm*dR^Rm^|~w^yS;|o`QrJ;?Eu;br&tT! z6jcy~ildOUAs4}-_nH|*H?eCbD@1kmSk*(`@hE`C)>Nh4sT@{BvO=_vfyKS%Ij)}5Ww9cX75HE*Z7@4s7K6A|o)?3z+2-l87{uCr*L48Er=4p6-uvO6>E^^6gBXtW_zYI;oGyz&ti?|sbg5;T zw{vm08Jvw|3m8O)*gRbpgIGH`JETxBh*j%JpP7CE0MioyaCvw_ZCcvjVt?;!=YMor z45CA9o-T_)tU_*#@>hPRyc4-0%WCS;(*723)KWbLF_3NBwk6~LScA>eWif~qNEQ6* zkLm2omtRgy$&1r3HV2HCA5Q?l@Ctx;7ygzPr7j9q#~>KQKs?W@yi-h^`}Jdaa7Io9 zH)i9Q$t!R2xQ(id7g7K)lHL6En}6=`bV!EvPF#u?frWp)k$fOn))1yVW$h6S^xk507*qoM6N<$g1+bqtpET3 diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-1-4.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-1-4.png index 6a9119feb073f38eafadf6d8ffafd49485bf9fc7..9332a47fe6327bd3183300a33d3573fee456fe03 100644 GIT binary patch literal 3694 zcmb7HX&}_myZ+fm7$kcMSwh(*`#u=imsEy~C1pvLvP8DQj427pno5?&z9kGI`#M?5 z6vmdZWv0*!gSz8?Kiqpi-Vf)T59c}Wd*1iF=XuUav9mGfWIxRg005^26yiW1@$~lW z1c=`IT`c)YAJ~GRH$nk`1OP5^3y6_ZM8VcvRDjb}QPyAN#_s1Y#-{Xh zUUa-@a#&ADvJ;aPaO?@V|IfuJyV+0N_$qY#U9h#)C2X+9w^6?^X;X&Onx0FF+$uMC zS%y3TJG?^ir7@|9Z6cR$Y!)4oMXTeK;AXq78xxvd>6AbkinlPgfl~L2~X7CA?X60 zv;Idy8^SqOJM0R8Zo8)%VN>@KF>9)!3;-T+2=42yZmsj@GZ;dn$W8IzCwILjTR*SW z_y2Hxyo9v(4*K`&>1MuD5ChOSPCA(`d$j%=04ki3$Pjj~FoGBi1_08E-NiG0h2`%; zQgNco>!P+GK=bd`Q@C8_-f(nX05?iZqWq4g>WUt@?F0}}+04h1+oGa%JAa=&?3Dp0 zfcJBaYbLxIyi}8;jG(WkMAvrnSRDM0mu6MxG>1lNLcoTp-RT%o*0#B1Od5agLq1_2 z00?tkd+9Wj`qCPRE6IaYrsCKzqlpXxz7$k(dqM8zgB>k^v^d}?oGe-Kgrn16cB3C` zRvte0PaqLwqnkW#yD3<}iGE^>i+Jwz`pttYmzdb1t-`LrcD|MZ?*GAC;;+2FR2P);| zB}-2BmZw^F2g3ZDioWVnTI#1D@`FN0Oja>HJgD1T0&57-4I~T_C0#jdHyM=p9BImx zN6`kE2i3zyY;|4%nW`4eKLW+>`kj7i7hx5KtQ}{5ECOK+MhSUIASH`+!L>rXS|aCG z#;;V2r^wP8XW6Wzxc-CSGAmzh?{f^PpLxprXefVH6~V*S14y2NzBhq%2k7~foHwfA z-BAzX9f z2rK(NDrqD+a`E3xTl>C0V7R~i3H3D>^tK#O8~G}EJ4Qg2W8&79d02+PHw(tU>#C>X z6Drp})(qXivcg;ONgN^JQsD9vwYd%VWjkt4_Qt{R#iJqOyo$%ctV|D76Bg!U(FM}~wW zoWwKK3nP2Yp3l>Ca(ZnzL$LBeoLrJq!p)vc^6O1fAi*SgIwGm03z?kpgh586oyeB9 zQ#zp9?kt$5a}m8l0@?TQ<#rMIZlAL^a3lrpJ)l|ffS z9z|Sp>G44FQvR;_G?ttWH&q?Pq^v#SqgvRgY#08FZ#%##;Q!5i@G7hz)U$xvMN7gJ ze`$3Phu!el+u_$&(ZyAFOhISSU~SxVw~392ezaow>aW?K>YuP5E-H3{*Bj{D?FozC zOg&x&A*NX-Cw zY1q8-Jss+b98ByJd%Cz+_x5=DfHGY)@5x3Z^rxLQy&0o_!C5zv6Ib1ve0v(CNAOl< z0KQg6hB(ZdJTj4_kiMl-hO=enoNZc*nOm?6*-NT9F4-m)!WMaAcgxF-Lqj<(OxGaJ zNwdu8<2SS@RT}e#E1^p88CF=`qnU$af6~%Bh_SS`8RXJR_Uw(SjyEdBR#W%t76Kd_ zZjZe`>Q1wFP<2{>ORVb?i?k{g zm0<50hw1w5WiF#zNd7%*Vm}_FceKoEOcWJSrhC*W=kW4!iz*V{- z)om-cqYdJTiC5Y`>lV&wqr@nOvf&zs7&}+cX3Inw9^mkHyvi@y9E&O2AiAY6nbllt zaaGi%9`>n-(d;S^T|^Uy-U--)2kK4tqUKle^HnZe)YgK$+*o^(5{_<#DQ+T5x&UcE za60^@(+^W0fFE5U!Pu!(W;~;C<^CVnG6w`l9OLjV5Y#@*9tumFofA(wBN|e4R9PP@ zbWybvSop+URU2mBJdsh__-aGxf_4-GJC|~q7xO4*RV|Elg~Tpr=Qzi*>$a7RJ;Un| z5XTT#HJ{A;PYZF=@mEsqrAJ_Ht>6tqj#ektBsi{0jC|`Ex%2pYcOsf!D2~C4Nf{mf}4C_PkS3puiT{DcRY+97W?wZxWq7Xq@cv{ z=S^|;`9F#kvu-H%FD&>7goa4@;h@llrXec=9dutlImxGtp24Tzhtd|8|S{NrdrDVGo3f@fYA z$YE(=$`Af!@$*Jjnh2khRauUwPoX}C_*%=lXUa@~@H{Mbn9pw`UDwc3M2 zU!e2CGGl1~S}ulwVn+Ld4y@PPulqpJYkJP!8}{Bg3;;gZBShn99QQqSaX(bSML<1>pLxoe0D!Q>UWxr0!YnNMjpYcTci4l5I zFn`B7;;_xZ_4%1f4ux_&@bg%c_r0kj#iGR@NX)=4Uv=`g7mA^2vU#PDI83f0A^rws z2LSwal~kq>i6hoz{&E^tcEx8z~v=mgacb zgv-GtO6$G|5X5^IIJV?WD?f;j5&9aRuU~Up`;13toe&jWl*(|P*LR?7cm$HE(7XDl zWQ^-7GydXAn%SYKV?Yc#KhCc9f7L^|eX4 zg!aUzSBML2^t_hk0FS+gEj)aGy?G<$)yZaFGvd_^YpXzAdLVbc6V+y&W!UdW0wJ5c+)v4tShgWV0_7GDpGk6!}CzI2=2{R+x*oA)p5V| zvVQ*&-0)Y*`EyhvuCPDvIgGkS_Dk-V3^#BrQs8OEumWqgA37uJaYx35{D4}HOAt!P zWIgs@{%ReGN_*Y^)K#QsAjJbWJ#mX=+TU3`a0x9Zhsd}_}E?s%@E^n2Ae8@?9<(u*3hWF@^7wI*U(?us2(A#&P@85to z;u8y(F%eXjpWhI_jd8rzU}ZFW>b`a~xmL`L8>+*aa1Ua~$HkNKKXepYE0njUFG6S| z58C@Qy#>z}6`37hPZb2)*PZWTdTFVwgg=q(US^Ed#;ZGRo1lfE-6Qg#OA}b_o)QxP zzT@x~?|3Sn;XFR8Spv6w-+;P!2RF4O^O8)y16pEuN&Zuq*b?p~RV|+9CKay7k>x@Nkl0 zNVH>d-B#`(gPdzZG3p?e)bp2)m}<4*XvV%W7kY7Bqn0s zxXRU@Sx6yFL{gy=1VQYO!e}`iQ-5rG&LjGXiAXBcudKx8R?3u0_u4ZN{j}~9pIt6l zCidEHpVF9x=qGl~qylexpaLA2d{4gkd1ws4owniomWMV=#)3QRM>^S19Zrh`7d_iTM;duZHl zV8@G_U=Xq`#wSlkt}z?fv=pQ0m;e z!$Qpd*6p>oMW36cQh#IHyDCI;0QTKCa-nZ&p%T5t=GgAjl8EB+eDez7jRUXjxNse< z?!NJ&YfjR#K3W!Ks6lL+=89M)m)%0c=Ms3Gh_Quew{NcyL+wMKX!obVyD_ z3sIPI6jE(ylwj<&=1fZk+B?c#*Yaa7zXF_Bo?D(KVoH~qrMJ!gMxjTuG_Wa2L}7AK zrmvGmC&;{n)YkPxjJ?;l&p03C_5n}3W=aj9n2ruPFF~PV`eu4+=JDZS z`Oo#Sc%fo(eJpi_O=uUj23Gp(E=}K)S_Kqh`DoKTJeYq4*(c32R`f|8%PmMVHpVQvYGsOe%D1_PDESV5$Ew5lMyaUQdfI zr?N2%$zURq3cSN0jY)LbDd5iBL8ph)&zOj$0u!+*WnHYSLbM;^32w2Nh@^toi5RnMZHhF#l&chGK!3h@^s#yMZCYeo=LsqP_C4{wDySwpzvk`-5FGso+;43Tso80KmDURmAKU z6|*9nx`&BKD)^O%l7(i!C@eJBP@kL#Bp_vxO$sx(F*DoLIVK{h;8!AwqV|iT0{K;l z+qHdX zFDgly`wK7;Nd+ci9rufJyT1SvkyKzJ`b*XR0!&0w!LOShNGRN2fQd*dFcCWT^~*lV&KB7z%?k~VZEXy>|b&g$gJ3_bG&)&Ogf7?U7Gt}%a zz`+Wsz(mZ)j8USU@?-BmgT{~rJ%5{vu}auqfai!=4Gav7^vG=uy@-j}nxx;uLrNmhX>EPIC6V zeKT+7&Ye3OuB<49hD?kM0)fzEq{UT%?;kbKr-T@>TX&8vc2`AZ(oOv?&(|(_fOOrlI`|msAg8g?dYP~zUf9y;Ga)S*m$2e zEC)S*v0ZOIn@_EJmXF4-E2rdV&>{d48t6 z*k&iRcj#e|JGJM1JL6QJ`2vPSwZ`6xroV5ouCZ9bd1pfk0`;6eqw$QM{P@pBXD+h4 zgd}ewZ8@VK%2Es5VuI%S-51n5v0mTtHv@7g)pK|vs?Z|(O}F_A4CukPNrQIpGM5(- zWPGv}=5W)c?x?79_q^Z&>TTHbby?=pnM0WmoFM5S)jL!~@%rl1gb13RUe_`w$#yqO zednheQ%cTw;-=x`5`+RW{vyo7`{zpY@fwtO@$#PZBMUr;SJ-!rcF|l#c$IS%grAa1 zB#6ke+14{u)z)kV%^W+ezAKb{*t&j?fu%ii_Q(a4gp)?Dq->me^hf1SjruQb zXV_*0GZhq=OUc4Aqs2Q+Z>B1?m+$0To5^e+JGB8blHs0rqvY0e|2#Nq)vI-ebhAgZc{epn`;vvL@MA0m|USg+%E?zWuH| zx|l`06Ty3w)FY#l{|JtX2*mRcaBlO)9_%Z(?@~pzgMQzjFSMRV{6xpnQIBZmJ$U6e zj1qQYNV1EpXGM;>qKPOt*w)c*g!}(~s}gfC7+LX~dif9Tp)*$yh?RIQ4P!mD40}Ol zO3Fw>r=%~)4INw_~OqHqd$hlIZO-86jU5SXtQG1Qr+_t!aZO}kZO?OV%4wI*>=;0f(3 z>iFyLXCO=zl1hrx+b3?HnM?$KeUuUAY&)1f*0S|Oz}J6tS6Jn)?ES=4BO|Q@Ha|7A zWt})WZGw?=6%`-NWLg2^qy*lchijT%D|`VZs-La*F!^+&D~zZ3bo@egW0)hr9mD(Y zLX*`qROJY+*?aiacy38F!wx<&Wpn&rOwOu;{l<-%0*?fhuC0Xr-A@`#eTZot=iD%B zPF+bRB~~?FT571E&?;g6!58RPzUK+g-r%trXO4k_CUB(oQ%XrDMGA-IRAF7Y%;t7v zt-hFsOEj|Hl@-q4X_rBlzY>gayMIUeuXKP%hG>JOQ2Xbti;>BDZ2xeR3jh4VR))-j zf`htKu|QD4(5PyRGlVhYj6=xhbR%$eb(O>)nv+9@{o_fi+zFyfiX-KvTBv^YOF{2Wij%OxNgH6SHIKG*Y_E( zUhzvfA=kznF^MqjU^UK<#O7{kp{3D<)BuL$?b{x zAAepGykm>4PZUiCMn-Pi@*+m{Xz$4{2v+hvOhGPDmF9A0Rz3a5Fni^(IF&Vyb zgXlEN=bz#Ldxni63{f!h3EyH|#N{8ZL}z5hs|U`r>hVcU9P;qNu+xpwVLj;dHP%79 zG`gth_-C{2A0S%G1@0ke#lgSXIBB5ZUn)Q7PCjphnSdxX#xGbM@2uUHXmQr zmfMUZwEYh#)`x5de>Of_wH(JEK|jW5>S8(7BR8!jq`9!86c;bjo-}Yc5ZEn-#V%ns zFI_jcBzml7hj-X-Y174!-lHYbb@|WE9;tt7)o0Gg%!C1<^zXgfcv3A?UTR!f{GTZd_1DVgVv_I3T%9sMm02}~Hj zidIl)^{7r_&japz`}%V*e)3O#%oZfPqx_ol5sPDG9LRcvIC8#qP2$uLV zbQ6boZ<+696MuJKYTg{MXU=1ALgd(!Z@2&LCmc(j@XKaVj>yZ%=xB6I{jv;dm z{%T*+e<}cyP$OR(?~rk`9{-W6t|Y|g7VJOzjioqLuv2AJsc%!tKO;+x08(%Ikyn4O zRI!hQf`U`ZXtz0vYD74Brm@WTR+iQ>jV6xHMhS5ZAzF9($VkUb1m9Z`;6Hk)h%{@U zIvwfGG;|-AR8YjLWhNsRZrekhTw)lM&Y`3bqFK5m1R==gu zCOzrYzcHy1)1Rw<`7emn24i6pP3#ikDTf^+|KVwX9F&~n|yVnp47 zNsY&VYh8;=mzLGQU{D!P|NYNgu?h};NkR?XG3~S&2LC!}n3&q7w}lB@39UGsqUHl> z1vEvl{O;XScB!+T_8k;#=1zN1aWBNk$|R;$ZP6~NHF2xs|Ba~Kipk6*gvq17uRt>C z@aKM_RRD8!Ze{d-MN?ET5m3f~5_?Q~OuMHM6Eg#!giYuzT@S6bY17qzwzKD)9gbeG zoI^f0f(XNc5J`6m<_2;klC=2vB}w*Y$)YUtVmAy!rcX-{v~ax5*L**RM+Hk@xAU)S zrT6alW15hU7l-_?zwS`k0)sBeUVBB<-u>kf5Zx%7)UWyVSlgGM%cbvCHE1}t*q5Pe z{EtV&8wMYrE05hjo(HK;7s;1a){VT2W0lb9WbI z^X@5ez&U)R@5H}r7kT)zDO6Zq<5yAWuJmFopR@7!=_z^R3ZI1RT25_lQM-SYF6&k< za5)mGgJSZMzO#um3NMf=KICz{;^GEL_5500IJ;uOTT&HQ%X>L2O3~$WEfq_6K!?8#+Pj}pD_FeoL&`U{M)hum)@>o z)DXgHaLsE&7+T0h zVHA$Rtk?RlIoR|5cdWBb7)}37v;HOv9c<}h-=lGvs#f-TTw~%Yo^O}VP0>AM<4c$v zQK3XaK5mN>VX*u<0mJjUJ2?KO^ysI;HDHifS$G%qSf*htE>1g`43>oV71lbdnwWDxNChis zkDUnLp}-+GYyF9DX^{nXd7U8Zh1DVdm*ayJ+0Dr-cDanyU<8VCLvL8vEQUFfP43eW zV!Su`98Y-zJ->{W&Y0iiep-D7T{Z4f*J#K7NQ!U4bYX|kiY*h{&vi6>!Q$EvJ{>hM zQZZTmHB65xuTZ$0lY%3PD6)fSg>|1WF7od~2ONtuIZC!*C&y#RtG>Ed;6u9Qw}7@y zHSwET-=%_@l6`^0`ji>U88!@Z&X3OTU7QY6^*2)W({EiJ|C$Unsvu_bsFcj8I-0_x zzovu+jPcN(5D;UB;Z^SaN5d=<4KAE2m#tYZ@yYpQ88Fg)@Qv@#YDmtXq1s~0ji|s3 z2x-*wqsV)d5;O6*D?Apt2*$d-VN`Pqf{4xy!PS3Q0+gV56_dHPS3JCsa5X8@8@*g< z&XJje1ZO-`opa}wQeyeNzjc>Xf3&sDgWq=UME7x351{Ob$XB8R2|8yN4)}LbX`90c zOv!u`es5eS@3l>bux^9&tW0P zqQ;lE$SRGA{+Eng6@xCdRU_|ziF$pDc~E_LL>!;tjGI1u0odh7Y&FVQ^L7r)-@OZj z{P}L{ihT_0Z0NS9F+p3~7T@nGMNCd;lh)e{r|WjglH%0CK0LOWUXW0WquRPJODtVKv$VRkfi*jG!q%XOK+ck|yFDIhX;A32~hX-DWGjW9W` zMt{i=BVr0mK8u{fw&!i|n~`S$r~nLc6+?2WK~PtDDW}VQDt1m25mjI52v?RnQCO@3 z7ABIvT?K+jc%)2N&dJT2!&juA>Cztq3OYmGh1Ft~yfoFnSDm^XOMwDx)&9gR(&w3U^V1Rzb%2)&uwEu!OSygZQ-egS zhEC+d!UvGw;U5edqozrr)g?nx3H+UgHVy&N$KQ9(v_MD33qoihRTy~ z0=G7n7yJXmB@~ow+r@I63P7%R&m~gbYA2ZS2{Iw5iAjbN^6gHh`;C;b7M1RNoU?ul z(N;DveoBdHtX5ku4G|~E7&t~*VLxDlghExqo$yzKb8#vk>1)Jq&b^XS7bz~ag=F_! zbA&l*l=Fke9zvPGJn}2&!0pgx_P|WN?@^g T;IW6XW&$6#E%^*G}9d9u6X`hiS; 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 delta 3703 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 VrPq0GkL&;d002ovPDHLkV1mZd4v_!= diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-6-1.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-6-1.png index ba3a1fa2701fb1ca810a43462487b5f237e228bd..342de290795d99472cbfc81dae5de0e644bb3da7 100644 GIT binary patch literal 3286 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

-zsh(Z(fpAMKu#(dx`k^Rz%VCVe9c^zcUpU zKOT8N62WTHOA{~?%7!~+WLsTOQJ}+$EGaI-j)(t22gJ;4h1CiK$azTIAl|Oxeb2bm z`_!NY|D`>}NAtJrS(F;&{$M@SZFe!c`LoxhP5qYnr7oh-%+)zYX)_-$A^I(>W~e@q zbB5A6zoe!2n3s_7{huJ=%3gI+fmU~RY4 zW|F$$IYl52t-u-K1MWDfOXvIT8lN1=Y)yWW%bd6N!q~d%$TDv%&WNQX>h}j+Gu%kx z6R>!y)2)$zYCMDQhHc3RPUPofvo82iUT~tJB*Y9Nud%mv*7X7aKvoCT@?GNS6>AM- z(gJ;?D~wHVpW+tsJ)n3|yX6co0h)67tU~1lm9uJj zQ8~u^*?oWjW9$zEo3M{j7-?;0;V8m4u$qXJUZ{Q5$1EQTeLR@da8+yhWt847HZdHv zfg;3?*=Fy$kHGaLAwpb@Smx7LHUp~8BKcZXEVP!rb&uOGOZ^~N!2f|gfgqZ!f)w4{ Ro%vA#OpVQriq0b={|9P$EkytT delta 1557 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 delta 2028 zcmV7k>w|Nkl(kV7Chp(LkBTarV} z3W^@u&BcQkq0xp&SS3ym|DD%&XEvMN?99CH>^wh2W_NZcFXr#_e$4C+Ktx1DM1MqN zA;)wB$X=s`Q?l__rVqe_*%Q(Itgh$|P1HOlB311fxe8#Ya$A3LYT-8kxkAymYx3r= z;r?_cB3Xfnm|kiK2yYY!;Ni_L0303s96)b(|M}UIzIVwkgdK`ZM6$vT(+wa4^ehw- zgh6LVE&&MUqB=-exyVE$D=-mLq<_J@xUTYQskgfyUM`kbOYlaMzJs)ng_t6~>Nz~z z2ViQU<~6cX)0=Sslvhhqd{U0pzX1T{O2}Z0_Libh<>yAqJgOIw`dP?H4CL&pZ ziI_UMLUF40JRX4MB}X3!%9CpOMs_t==xHAdF-4@F#=85jXlpe3F5g2ntqGQ3u29t9 z-adBCWCbQ-ipY84i6hslE8CfVeXkySaw-MhYEG_FMD6+Lp~`LF+uOuMBrDjGh_36J zZbFJ2A1=Wg2+D~*eJKat<$pFR7cb-iV5ahNz2?^FAxtiY*d+6X$Py%&y+WHMXx8!J zFQF3ATguiiJ=}ZovTPi?u>o(qc&=v$fPu-yaIerdR*0-ZoqzQ4Vo;=6C{nSY z?KrLde{1#i)V^5%#f`+FR8{joy4BaCws0H2QN41rmoZhh`y8xc8iYV)ZL|X zUANWI2-|U)e}#G@42Z1IsrZ7K+cN*L)A!bBu1n7J@k&qAT!`BEphgA3-OI*7HoxHdirVAuG9>4qc& z6OpVCYa%w77uQu@Ey-PIBp2mITr!&U9mF0h`wz&5e1FDtWxD!s_x-!Z+LQ#b7NW0u z9Kjku6^ zB_QSY)qf4B$&FgsrVhX{B3Z#e*PJU9r)tmR0a#vg^nsu}sg`eKSA&I~L|7Xi)W0`u z4b^U%eKcY&M5(8-?*1#<8jZfo_fSo1f+d(M6!o`L(s8oV6knLBFF|Z6%yx}0sP%1d zLR~A?LX`8u6GyI9SGF_#`d&TuarTJ5F=nd5v9XD zJb&CLb$0z=5ni>yD?wS!DbE4GfT4C$q|6s$QZNN0WqwUqOh=_=Yh=_=Yh=_z(OP|@G~nRyZQS+0J7Qa`hWVm>9!;Z6EPAycVf9*Jan-8g|X0`F7|afKLZE0KD`49n;N87$#yQUU0I~A|_%8e*S1kZGX#G zZ9kmu1;4kc6--330uwPbGCHK~;qpzpd|w~+%cDQ^hwPo3#IBjFz(m|WHAe|{$}(l) z%?FytG2(V~b#-O4yuKz(OvKhm3V!|PE!Tbd70db!d-XBm+sl8;#-n}jswbI_b#aWi z9eNc~D42*X&=;Xx9QY7v2Q)C*Ct z9P47&Ojh8mIa-p1!CWLCCL$3L5fKp)5fKp)5fKp)5fKqlqWupn8MAt8X|>D%0000< KMNUMnLSTa1#m_PT diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-6-3.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-6-3.png index 59c546d61821e96c209e4dcb56b34f249cb60d31..cfe1d5a829f8402f8609ef16013472499889ffd4 100644 GIT binary patch literal 4207 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 TEb1e_AOQ658SB()JH7Z1a|1F9 delta 2186 zcmV;52zB@GAfFMC83+OZ008AlGP{u>7k>y*NklBRQP+Mu~6*si~o{3VxM5Ly)*471Z>ud$UnR_@^ascew>jIdb zt?EyaTugw8NLFAXQUJ-qiJ22?V}Fr_w*!$2!>$D6;(`-?5H+|_1DX&_M6v=Ck(%lq ztxV0GL?hB9CKneRy(1`h*6LMt15GA+!m$u3fYj5mo`LJy9F6{vXHyMp{3X~sTG5~0 z44Y=MLO~O8X?#fC-ZDNPvS%^LD#-bRH`iviO9T3&dhDGWyCOGaHm7%`0)OD?+)1^= z$jU>{(*rRP$qLbpclTKuAKG|&o7!Bx_#Di|CXS4rQnzKHZ*jqym^tCu?cCTENklO{ z`*wx!!I6D~llKv|*33jCE2N)@>N6xKUp$#Pn)*w$>Ba6n<$F8S=JN0p09zkFGWU*b zCx25(L^P(d^<3O}`I_7~e1B&ZjsD_S+cyCioV*{Ng`$Xqm938-y%=7%Y3{vr5@~P` z?C+O4yS2B1Mzx_)f-;*^n+1TuI0tXH5JOH}lhcIsPDU%A3@WA~CL)-EF-d|*rcBR1 zl<8~9#V`N*PwuSw_KziYA?gVyy+AY~P+tf_V=`$9P!Am$J;hL@Kz{{IL`p#AqTUe< z+$Vt;g{Wtt&?nG!GTZK-ZBhqeE|Lcmk>bfHM4}6^^$WU$IwMGOG4O&eB9G`o%>RNe zDj+WLkri6)Bj$NQ7Zs2#gB90xqj#bVIF1!(U_}>V))#cK1kIA)zwvT3nTRYwdl)ar zRtqup3%Xc^7IIzJRDUf-7h)C{bg>GpWvUiAeM44=PQ?5#=pwU>gkn(=G45~H_$aby zV*I*OyrApH*-OdZZZc9;t#?f0?vM3_8~#MKXS3Y`KLh#qs&oD*79|lg<@uX6`x82j zldKAhAoh>l<^^3jXQ2p5xWFXS_m50R&koJ@k1WAhZ#xG$e}5zr7NSt)C;~6&@?asd z5CavuY4#L{zlC)iCvwTbb=|nV$yWZxW~(rN39DY^qJBY_&_^fmozQFKHyijz4N0;V zLoSuqYIX!+un?Ju9W0d?(<8PxW0$smPXFapy1?2c~Jc@HHOtU10QOpm4%S-&5%QJ)SQ*#{AN3y z?GxJVV=dZ`XWvjknVF_yDB8@(6DA^Aq0osaOeK~YB!MFsCL&paiD<^s_>dZ{16aNI9L3H> zCL&p((0}uYiM8LodwqMUtR*6+7}+$(mR75(21($|4x47O1QRi~7rXbUIdEh)4PG=% zM6v=CF$s3>Qdg8wv-)nLyQO{rPiBr9eLLh;ltN4wQ!sVi*);DMy8&QiW!=|PPR(Bh z&^uc3JQVm%rnl8E}(Q%Wxoz|*;t0Dle*9S6|YGcYl8!t*S72nC~vR_N433>g;(s@1D~Jp*XuVy#|9qc`a}2pQ3- zh3KiC1N-{{OsziyMrLaIN)CWpy(+~g<+%1Q0HC&##~Y?_Y?{dmotlV3f(-!R0=RXy z0)ODlJsc}J0Cw$l0Zh+U^`}TKl5LoXWQ9&mM9IR5nGFJ zAxb?R>lwJN&C%!&c{bIs#$STHqZR$>WPb#kX0k%3CZenhpFenWZDzYPpg*d|o-C!H zF`Lu7Qo;K5=#iC&o~Oq(_w%0s%H{I%@^U-JDKaKvYBp~!n|=!&tmFGe`q?+K(6_kY z_)oDpH+Dr5QB2RiT_JpMWZ&TAeIz>jrd%%n`{s?@ey?2q`{m2HMsCIl0@(iD@AY~;=}%B} zT~&xem7|bqL!$%(*P0U-qTV#WTiRT&|C8)E#HKkluFIx5xh_dWp>k2CubYidkls}R z-+wX!;PatX03Uwy+pAZvQaNk^F@F(L^M-?!Hgr`Y3jgI)x^%Np9RKNk@V^CX4-=8B z(5Xv&A@aN`RC5Y0GnpA0uwPFHAe9_%JM(F%a8@k#hALV zkC>4S8#a{7JijI@OvGrCf?xdlz;)lwkn7i5>3zfx7XOeN&vt#J?qoVfVs{_0ReBXt z>X?WT^oeWbv!`n(H@x%d7XPEtS(GmVQeP>>Pz=XHY$~t>6;+Gym7`vWg5?;AO*2`6 zqvrHU7W#9MLNF1Dh=_=Yh=_=Yh=_=Yh=_=Yh=_=Yh=_=Yh={WCKcO+zot6RYO8@`> M07*qoM6N<$f&^zGmH+?% diff --git a/docs/static/courses/csintro/Unit2LabThumbnail-2-6-4.png b/docs/static/courses/csintro/Unit2LabThumbnail-2-6-4.png index de1e49ec15b733778748c7aa5fe831223a41ec9c..f661fbd9c83d1d543f11b479602ae1ec8ef2e056 100644 GIT binary patch literal 4886 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 YJqh$)&S|QQz@Q6sPuozdUIQBYKe=UfB>(^b literal 3268 zcma)9X*kqv-~QV&*2XXq$qcfuSu&PMZhI8j$G%OL>?NTr83tK~kS*J7DSHTEY-6kJ zWNAW^DY9o9LeJdqalG&GJn#GE{cv5sFTW4hb)Dz$JkKlMO+IOgR zmby|wwA7t!aJ7wEnEdr^f&hR8^3S4~`10fg09b+n}p5h3WTY(;d`Ft~!EQ8B;)8tn7{4eok$7Q<6;!S7V{ZIi%C4Y^TAMLmGKw#cq=F@L>9Wx!^;|rHFe3%%)Gq1 z+>@B$nf7GNZ}MbN`C8N+kRLvq;CfX&e!Lbez{q5phWw2cCJ;1TaVp~v1aM1?{ExH| zf5l`J7ym{C1RI!=o^g~X5Xd*Z#xu62Ug^30Wv?6y?M&inf^d)phajiYG^#sTNqdUe zacV7;0rP<=Whhoy(hT2L zSfJ8a@JNSW-JPq5;`)GG`y?2 zuKJW@DJgmv$kH>EZCZHc7QKiGia%g5$!BdcPvqXuiJ7NEG^8}iS?YlG@8Um zznHWvbae7Eg7ep(l!T@T*L8XICGhg{9w;d%l!Ql*jg2i4-%X2xTn32535Wyx{1zvD zqrmm(tJX*ErC01l+k`|+>{@cFXyFSlUQpkhieBE!m*}VqiG4W*DPMuQ&twwt0^w0j=4`?bD)J898D}0-|snrZ>}~ht30KxR1y;6cXZ_A&v$Hzs|~1&uC+PB zQn}CMY||qN%@TN-Xkd8qG~Of4I^0FA#FktK?fd3C4VTpTHj?kTfYBG$5F<>_D{>l~ z`=7!3UuyV&C-2`HmQKa-GnZ;nZwhePA%WiyL?7P;3JLFq@I|n)g!wQeZRGy#>$|-q zEAkK3fTNE;9{SR0+8?dSTg+TXhCAN_O&v#4RzqSR!p~;w_w^VSGqNduy?+R6Zi^<{ z4i@*$n~_T2DEIPf3%(T*ayasS)sr9&0UE4`-=vj{ny0ZKSnpPgl=#db8|+rxZE=Lr|jq)a!NizGajLy>VRd zO`}KGKK|6Wd9>bynDY)|ei=$Gm+gEQN~-<(=+9XJF#>wa$b$NkpAlI?t`<*a%e=cFigqaM=m5qUGQW0ejnuodXkIc zu`1Gy(`alCSnMiPy6%YKJ<`+Ll&fD#u1DVJs=l}i>sEoMP$I7>ceGvcoADdjNK5BA z{N<-{pGqILW>GG`2p)bShU3}|EfIzVM%4uL?3cfNb238e6<1dz1X`$gaq)q2DR zL}S9Pz$G3*_R5Z@AwXw-Q&pL(<*yLq~{FvB8AKArvqN^ov#>whON`5C87 zI;ed|J0p~)#|mHMPB3k^I3Dh*-X2cb|LDp=I{u{$%m)4`B1;U6G&P8QhuNqU1$j&v z`QLC+FP`mnmIY_p^XqnOFF%w6hs6zOw;tT95h~YTsZ0rpaNaq#u}@)bxw2r|Fv~3n zITYE!4uA2hd7gDrj4UdrfRasS74

$$ldKvZ>ZlR3g!K6Druz+;f6V%qVcZ~Yzs zUG+idOK;TUQ@wyl+}uquj3bKXoaT5nXh=)LHN~=-tKQZBjQ=AEO&OsfU!q= z70X8bV&)d+OK|eAv~(pI7#}dS({lR@9C-zxEM@rs+aop=21-Czzf~qsxYlr!B(=hg z`1{jFaH}0vd)&%K2lW>>0{K0B@$&LfaI+}!>_?Rn5>gjfUbaXg&8$XK^w}E$P~Z`Q;Gr}zGo}xDKt($lJidr+$w293-AH68>3`0 zO=Pd7n<8(LZppIsX2uK0mVuFiEj}LNMxc$9y!yKcSC{C^P%x*}WIMin!}_*{y1KVU z=s0W>5=N7`CA=b3;nO{*I&?T+IYr~?N#r4ZfT2 zaS1ouSNyQqBYF+NiT$~!YBAggnVFQ(s0I$!BHm>Vreyt(X5lN`<3c^Z%-_z+qW-d@vc#6F734g3Y{2GchV?j*|r7E5UR<2FuX~Sy6Avtm1qdSe!uWe&`EJPFyZGs2@_LmKoEj}M z)bc4)0>}qS2m}-CCKiLigwz3mVsoQdqgrbrQm{yVN>5lN`ago#zsY|g(?*L)_%AMa zR16RI%Q6vFk!x_1$*NS^N@#Pjq@=XCr1Z`|-jDgDTkWEcW$xy8EvGem|F%>}_@A&n z7AAm8QYKW${VE(LURklnCg^~Fbbq~&$e@RyI