From efa45533760c4fd640ad0f6b4f4492eae345a343 Mon Sep 17 00:00:00 2001 From: Galen Nickel Date: Mon, 1 Apr 2019 13:23:24 -0700 Subject: [PATCH] Adapt the TEALS 'Best Friends' game (#1948) * Adapt the TEALS 'Best Friends' game * animate friend expressions * free hand packet box * missing paren in examples * better avatar message * use just on sim block --- docs/projects/SUMMARY.md | 1 + docs/projects/best-friends.md | 179 +++++++++++++++++++++++ docs/projects/radio-games.md | 5 + docs/static/mb/projects/best-friends.png | Bin 0 -> 19927 bytes 4 files changed, 185 insertions(+) create mode 100644 docs/projects/best-friends.md create mode 100644 docs/static/mb/projects/best-friends.png diff --git a/docs/projects/SUMMARY.md b/docs/projects/SUMMARY.md index eaace7b4..0c75006a 100644 --- a/docs/projects/SUMMARY.md +++ b/docs/projects/SUMMARY.md @@ -27,6 +27,7 @@ * [Rock Paper Scissors Teams](/projects/rps-teams) * [Micro:Coin](/projects/micro-coin) * [Infection](/projects/infection) + * [Best Friends](/projects/best-friends) * [Fashion](/projects/fashion) * [Duct Tape Wallet](/projects/wallet) * [Watch](/projects/watch) diff --git a/docs/projects/best-friends.md b/docs/projects/best-friends.md new file mode 100644 index 00000000..94b2c1f6 --- /dev/null +++ b/docs/projects/best-friends.md @@ -0,0 +1,179 @@ +# Best Friends + +## @description A game to find your "best friend" among the other players. + +## ~ avatar + +You have a friend out there. Send out messages to find your best friend! + +## ~ + +![Sending your friend message](/static/mb/projects/best-friends.png) + +You’ve lost the ability to speak. Oh no! However, even in silence you can make new friends. A new discovery has been made, radio transmission. Eureka! Now you must find the other person in your group who you are friends with by sending and receiving messages. + +## Playing the game + +You play "Best Friends" with lots of people like in a class full of students or as a party game. The number of players is even so that everyone will eventually find their own best friend. When using radio with the @boardname@, you transmit and receive with a _group_ number. This is like a channel number. Each pair of best friends will have their own group number. + +### Assign group numbers + +Make small pieces of paper to write group numbers on for every player. Write down the same group number, starting with `1`, on two pieces of paper. Now, write the next group number `2` on two more pieces. Continue to write the next group numbers on pairs of paper until they all have numbers on them. Put all the pieces into a box, bag, bucket, or other container and have each player pull out a number. Players will code their game using their own group number. + +### Finding your friend + +Your radio group number is what will help you find your new friend. They will have the same number as you. Also, by setting your radio transmit power to `1`, the distance your message is sent is about one foot, so make sure you are close to whoever is trying to receive your message. + +When you press **A**, the program sends a number `1` and when you press **B**, it sends a `2`. You must also be able to receive messages from your friend by following these display clues: + +* At the beginning, show a half heart. +* When receiving a `1` number, show a Smiley Face (friends). +* When receiving a `2` number, show a Heart (best friends). + +```sim +let toggleIcon = false +basic.forever(function () { + basic.showLeds(` + . # . . . + # # # . . + # # # . . + . # # . . + . . # . . + `) + basic.pause(1000) + if (toggleIcon) { + basic.showIcon(IconNames.Heart) + } else { + basic.showIcon(IconNames.Happy) + } + toggleIcon = !(toggleIcon) + basic.pause(500) +}) +``` + +## Code the game + +### Set group and power + +Get the ``||radio:radio set transmit power||`` block from ``||radio:Radio||`` and put it into the ``||basic:on start||``. Set the power level to `1`. Pull out the ``||radio:radio set group||`` and put it right after ``||radio:radio set transmit power||``. Change the group number to be the one that was assigned to you. + +```blocks +radio.setTransmitPower(1) +radio.setGroup(212) +``` + +### Initial expression + +At first you haven't found your friend yet. So, you need an initial expression that shows this. Make this expression be a half heart. Drag out a ``||basic:show leds||`` block from ``||basic:Basic||`` and put it in the ``||basic:on start||`` block too. Draw a half heart in the LEDs. + +```blocks +radio.setTransmitPower(1) +radio.setGroup(212) +basic.showLeds(` + . # . . . + # # # . . + # # # . . + . # # . . + . . # . . + `) +``` + +### Be friendly + +When you come close to another player, you can decide to be friendly. If you want to just be friends, you try and send them a `1`. Get an ``||input:on button A pressed||`` from ``||input:Input||``. Go over to ``||radio:Radio||`` again and get a ``||radio:radio send number||``. Place it inside the ``||input:on button A pressed||``. Make the number you send be a `1`. + +```blocks +input.onButtonPressed(Button.A, function () { + radio.sendNumber(1) +}) +``` + +If you think you want to be best friends with a player you're close to, you try to send them the number `2`. Copy the ``||input:on button A pressed||`` block you already have in your workspace (right click on it and choose **Duplicate**). In the new block, change the button from **A** to **B**. Set the number you send to be `2` in the ``||radio:radio send number||``. + +```blocks +input.onButtonPressed(Button.B, function () { + radio.sendNumber(2) +}) +``` + +### Are we friends? + +If someone near you is your friend, you'll receive either the number `1` or `2` on the radio group assigned to you. Use the ``||radio:radio on received receivedNumber||`` block to get a friend message from another player. Go find it in ``||radio:Radio||`` and put it in the Workspace. + +```blocks +radio.onReceivedNumber(function (receivedNumber) { +}) +``` + +When you receive a message on your group, you need to check for the number in the message that says the other player is a friend or a best friend. From ``||logic:Logic||`` get an ``||logic:if then else||`` block an put inside the receive block. Go back to ``||logic:Logic||`` and get the ``||logic:0 = 0||`` condition. Place that after the ``||logic:if||`` on the ``||logic:if then else||``. + +```blocks +radio.onReceivedNumber(function (receivedNumber) { + if (0 == 0) { + } else { + + } +}) +``` + +Go to ``||variables:Variables||`` and get the ``||variables:receivedNumber||`` variable and put it in first slot of the ``||logic:0 = 0||``. Change the `0` in the second slot to `1`. + + +```blocks +radio.onReceivedNumber(function (receivedNumber) { + if (receivedNumber == 1) { + + } else { + + } +}) +``` + +Click the **(+)** at the bottom of the ``||logic:else||`` to open up another condition. Copy the ``||logic:receivedNumber = 1||`` and place the new block into the condition of the ``||logic:else if||``. Change the number in that block from `1` to `2`. + +```blocks +radio.onReceivedNumber(function (receivedNumber) { + if (receivedNumber == 1) { + + } else if (receivedNumber == 2) { + + } else { + + } +}) +``` + +Inside the ``||logic:if then||`` section, put in a ``||basic:show icon||`` from ``||basic:Basic||``. Set the icon to the ``Smiley Face`` to mean that you're friends. Either copy that block or get another ``||basic:show icon||`` and put it into the ``||logic:else if||`` section. Change the icon for that one to be a ``Heart`` meaning you're best friends. + +```blocks +radio.onReceivedNumber(function (receivedNumber) { + if (receivedNumber == 1) { + basic.showIcon(IconNames.Happy) + } else if (receivedNumber == 2) { + basic.showIcon(IconNames.Heart) + } else { + + } +}) +``` + +You don't need the final ``||logic:else||`` section so click the **(-)** at the side of the last ``||logic:else||`` to hide it. + +```blocks + +radio.onReceivedNumber(function (receivedNumber) { + if (receivedNumber == 1) { + basic.showIcon(IconNames.Happy) + } else if (receivedNumber == 2) { + basic.showIcon(IconNames.Heart) + } +}) +``` + +### We're friends! + +Your game is ready! Now go find your friend. Do you want to be a friend or best friends? + +```package +radio +``` \ No newline at end of file diff --git a/docs/projects/radio-games.md b/docs/projects/radio-games.md index 02567ffd..2e310534 100644 --- a/docs/projects/radio-games.md +++ b/docs/projects/radio-games.md @@ -58,5 +58,10 @@ Here are some cool projects that you can build with your @boardname@! "url": "/projects/infection", "description": "An epidemic has broken out, see who will survive.", "imageUrl": "/static/mb/projects/infection.png" +}, { + "name": "Best Friends", + "url": "/projects/best-friends", + "description": "Your best friend is out there, play this game and go find them.", + "imageUrl": "/static/mb/projects/best-friends.png" }] ``` diff --git a/docs/static/mb/projects/best-friends.png b/docs/static/mb/projects/best-friends.png new file mode 100644 index 0000000000000000000000000000000000000000..d37d4ed1418e051bc5a7728b78484baef6aa36d1 GIT binary patch literal 19927 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 eAVrE4O8q}nYDON$4!