# Karel the LED ## ~avatar avatar Help Karel make LED art! ## ~ **Karel the LED** can't turn right, but he can make some great LED art! ![](/static/mb/projects/karel/hi.png "Hi") The goal of this activity is to download the JavaScript code given below onto a board, then USE the program to introduce new students to the @boardname@. Students will not do the coding this time. They will be users to get familiar with the board. ## How to play * ``A button`` **Turn Left** Does not draw anything just changes the direction Karel (the flashing led) is facing * ``B button`` **Move Forward** Moves Karel forward one step and leaves the LED on behind him * ``shake`` **Jump** Moves Karel forward one step without leaving the LED on behind him * ``A+B button`` **Hide Karel** Shows or hides Karel (the flashing LED), to be used once your artwork is complete * ``Reset button`` **Clear the board and restart** Restart the program and clear the board Note, that there is no way to erase, other than restarting. ## ~ See if you can make each pattern below using A, B, and shake. Once you have completed a challenge press A and B at the same time to hide Karel. For patterns that you design decide which LEDs you want to turn on and then make that design with Karel. ## Spiral ![](/static/mb/projects/karel/spiral.png "Spiral") ## Right turn ![](/static/mb/projects/karel/right-turn.png "Right turn") ## Eyes ![](/static/mb/projects/karel/eyes.png "Eyes") ## Smile ![](/static/mb/projects/karel/smile.png "Smile") ## Check ![](/static/mb/projects/karel/check.png "Check") ## First letter of your name Figure out how to make the first letter of your name with the LEDs. ![](/static/mb/projects/karel/blank.png "Blank") ## Your design! Make something fun! ![](/static/mb/projects/karel/blank.png "Blank") Thanks for playing with Karel the LED! ## ~ ```typescript /** * Karel the LED * * Copy this code into the JavaScript editor and program the board. * Use the instructions above to complete the challenges. */ basic.forever(() => { if (board.isKarelActive) { led.toggle(board.karelX, board.karelY) basic.pause(500) } }) input.onButtonPressed(Button.A, () => { board.pressedA(); updateLeds(); }) input.onButtonPressed(Button.B, () => { board.pressedB(); updateLeds(); }) input.onGesture(Gesture.Shake, () => { board.shake(); updateLeds(); }) input.onButtonPressed(Button.AB, () => { board.pressedAB(); updateLeds(); }) function updateLeds() { for (let j = 0; j < 5; j++) { for (let k = 0; k < 5; k++) { if (board.ledState[j][k]) { led.plot(k, j); } else { led.unplot(k, j); } } } } const board = new Board(); enum Direction { UP = 0, LEFT, DOWN, RIGHT } class Board { public isKarelActive: boolean; public karelX: number; public karelY: number; public ledState: Array < Array < boolean >>; private karelDirection: Direction; constructor() { this.isKarelActive = true; this.karelX = 2; this.karelY = 2; this.karelDirection = Direction.UP; this.ledState =[]; for (let i = 0; i < 5; i++) { this.ledState.push([false, false, false, false, false]); } } pressedA() { if (!this.isKarelActive) { return; } this.karelDirection = (this.karelDirection + 1) % 4; } pressedB() { if (!this.isKarelActive) { return; } this.ledState[this.karelY][this.karelX] = true; this.moveKarel() } shake() { if (!this.isKarelActive) { return; } this.moveKarel() } private moveKarel() { if (!this.isKarelActive) { return; } switch (this.karelDirection) { case Direction.UP: if (this.karelY > 0) { this.karelY -= 1; } break; case Direction.LEFT: if (this.karelX > 0) { this.karelX -= 1; } break; case Direction.DOWN: if (this.karelY < 4) { this.karelY += 1; } break; case Direction.RIGHT: if (this.karelX < 4) { this.karelX += 1; } break; } } pressedAB() { this.isKarelActive = !this.isKarelActive; } } ``` ## about the authors This project was contributed by Dr. David Fisher a professor at [Rose-Hulman Institute of Technology](http://www.rose-hulman.edu/). Dr. Fisher loves educational robotics and runs various outreach programming activities, including a summar camp, called [Connecting with Code](https://connectingwithcode.org), which gives a @boardname@ to each participant.