hedyorg / hedy

Hedy is a gradual programming language to teach children programming. Gradual languages use different language levels, where each level adds new concepts and syntactic complexity. At the end of the Hedy level sequence, kids master a subset of syntactically valid Python.
https://www.hedy.org
European Union Public License 1.2
1.3k stars 285 forks source link

šŸ“œ Simon Says adventure #5266

Open MarleenGilsing opened 6 months ago

MarleenGilsing commented 6 months ago

It would be cool if we could make a Simon Says adventure. I think it should be do-able, but I'm not sure how to program this code yet.I've asked ChatGPT to help me with a python code for a textual simon says game. It came up with this:

import random
import time

# Colors for Simon Says game
COLORS = ['red', 'blue', 'green', 'yellow']

def generate_sequence(length):
    """Generate a random sequence of colors."""
    return [random.choice(COLORS) for _ in range(length)]

def display_sequence(sequence):
    """Display the sequence of colors to the player."""
    for color in sequence:
        print(color)
        time.sleep(1)  # Pause for 1 second between each color

def get_player_sequence(length):
    """Get the player's input sequence."""
    print("Repeat the sequence:")
    player_sequence = []
    for _ in range(length):
        color = input().lower()
        while color not in COLORS:
            print("Invalid color. Please choose from: red, blue, green, yellow")
            color = input().lower()
        player_sequence.append(color)
    return player_sequence

def compare_sequences(seq1, seq2):
    """Compare two sequences to check if they are the same."""
    return seq1 == seq2

def simon_says_game():
    """Main function to run the Simon Says game."""
    print("Welcome to Simon Says!")
    level = 1
    while True:
        print(f"Level {level}")
        simon_sequence = generate_sequence(level)
        display_sequence(simon_sequence)
        player_sequence = get_player_sequence(level)

        if compare_sequences(simon_sequence, player_sequence):
            print("Correct! Moving on to the next level.")
            level += 1
        else:
            print("Incorrect! Game Over.")
            break

# Run the Simon Says game
simon_says_game()

Anybody here that could make this Hedy-proof (for a higher level, like 17)? Or is it just too complicated?

If you like the challenge: I have the same request for hangman ;)

AnneliesVlaar commented 6 months ago

I made Hangman for level 18.

def galg(stap):
    if stap == 1:
        color white
        forward -100
        turn 90
        forward -50

        color black
        forward 100
        forward -50
        color black

    if stap == 2:
        turn -90
        forward 200

    if stap == 3:
        turn 90
        forward 50

    if stap == 4:
        turn 90
        forward 20

    if stap == 5:
        turn -90
        color white
        forward -15

        color black
        forward 30

        turn 120
        forward 30
        turn 120
        forward 30
        forward -30
        turn -150

        forward 15

    if stap == 6:
        turn 120
        forward 30
        forward -30
        turn 60

    if stap == 7:
        turn 60
        forward 30
        forward -30
        turn 120

    if stap == 8:
        forward 60

    if stap == 9:
        turn 30
        forward 60
        forward -60
        turn -30

    if stap == 10:
        turn -30
        forward 60
        turn -60

galg_stukjes = 10
aantal_letters = int(input("Uit hoeveel letters bestaat het woord?"))
max_aantal_beurten = galg_stukjes + aantal_letters

woord = []
raad = []
for i in range(1, aantal_letters):
    letter = input("wat is letter ", i, "?")
    add letter to woord
    add '_' to raad

aantal_fouten = 0
print("Het woord bestaat uit ", aantal_letters, " letters ")
print(raad)
for i in range(1, max_aantal_beurten):
    if aantal_fouten < galg_stukjes:
        letter = input("Welke letter denk je dat er in zit?")
        if letter in woord:
            for i in range(1, aantal_letters):
                if woord[i] == letter:
                    raad[i] = letter
            print("Heel goed! ", raad)
            if raad == woord:
                print("Hoera! Je hebt het woord geraden!")
                aantal_fouten = galg_stukjes + 1
        else:
            print("Helaas, ", letter, " is niet goed.")
            aantal_fouten = aantal_fouten + 1
            galg(aantal_fouten)
            sleep 1
            if aantal_fouten == galg_stukjes:
                print("Helaas je hebt verloren")
                print("Het woord was ", woord)

There is a problem with this hangman code

AnneliesVlaar commented 6 months ago

Here is hangman code that will work in level 17

define galg with stap :
    if stap == 1:
        color white
        forward -100
        turn 90
        forward -50

        color black
        forward 100
        forward -50
        color black

    if stap == 2:
        turn -90
        forward 200

    if stap == 3:
        turn 90
        forward 50

    if stap == 4:
        turn 90
        forward 20

    if stap == 5:
        turn -90
        color white
        forward -15

        color black
        forward 30

        turn 120
        forward 30
        turn 120
        forward 30
        forward -30
        turn -150

        forward 15

    if stap == 6:
        turn 120
        forward 30
        forward -30
        turn 60

    if stap == 7:
        turn 60
        forward 30
        forward -30
        turn 120

    if stap == 8:
        forward 60

    if stap == 9:
        turn 30
        forward 60
        forward -60
        turn -30

    if stap == 10:
        turn -30
        forward 60
        turn -60

galg_stukjes = 10
aantal_letters = ask "Uit hoeveel letters bestaat het woord?"
max_aantal_beurten = galg_stukjes + aantal_letters

woord = []
raad = []
for i in range 1 to aantal_letters:
    letter = ask "wat is letter " i "?"
    add letter to woord
    add '_' to raad

aantal_fouten = 0
print "Het woord bestaat uit " aantal_letters " letters "
print raad
for i in range 1 to max_aantal_beurten:
    if aantal_fouten < galg_stukjes:
        letter = ask "Welke letter denk je dat er in zit?"
        if letter in woord:
            for i in range 1 to aantal_letters:
                if woord[i] == letter:
                    raad[i] = letter
            print "Heel goed! " raad
            if raad == woord:
                print "Hoera! Je hebt het woord geraden!"
                aantal_fouten = galg_stukjes + 1
        else:
            print "Helaas, " letter " is niet goed."
            aantal_fouten = aantal_fouten + 1
            call galg with aantal_fouten
            sleep 1
            if aantal_fouten == galg_stukjes:
                print "Helaas je hebt verloren"
                print "Het woord was " woord

And in level 16:

define galg with stap
    if stap == 1
        color white
        forward -100
        turn 90
        forward -50

        color black
        forward 100
        forward -50
        color black

    if stap == 2
        turn -90
        forward 200

    if stap == 3
        turn 90
        forward 50

    if stap == 4
        turn 90
        forward 20

    if stap == 5
        turn -90
        color white
        forward -15

        color black
        forward 30

        turn 120
        forward 30
        turn 120
        forward 30
        forward -30
        turn -150

        forward 15

    if stap == 6
        turn 120
        forward 30
        forward -30
        turn 60

    if stap == 7
        turn 60
        forward 30
        forward -30
        turn 120

    if stap == 8
        forward 60

    if stap == 9
        turn 30
        forward 60
        forward -60
        turn -30

    if stap == 10
        turn -30
        forward 60
        turn -60

galg_stukjes = 10
aantal_letters = ask "Uit hoeveel letters bestaat het woord?"
max_aantal_beurten = galg_stukjes + aantal_letters

woord = []
raad = []
for i in range 1 to aantal_letters
    letter = ask "wat is letter " i "?"
    add letter to woord
    add '_' to raad

aantal_fouten = 0
print "Het woord bestaat uit " aantal_letters " letters "
print raad
for i in range 1 to max_aantal_beurten
    if aantal_fouten < galg_stukjes
        letter = ask "Welke letter denk je dat er in zit?"
        if letter in woord
            for i in range 1 to aantal_letters
                if woord[i] == letter
                    raad[i] = letter
            print "Heel goed! " raad
            if raad == woord
                print "Hoera! Je hebt het woord geraden!"
                aantal_fouten = galg_stukjes + 1
        else
            print "Helaas, " letter " is niet goed."
            aantal_fouten = aantal_fouten + 1
            call galg with aantal_fouten
            sleep 1
            if aantal_fouten == galg_stukjes
                print "Helaas je hebt verloren"
                print "Het woord was " woord
AnneliesVlaar commented 6 months ago

This hangman code cannot be translated to level 15 because:

Both problems can be solved with some for-loops, but the code is already 100 lines long. I think it is not good for readability to remove more empty lines (there are 16 empty lines in the code).

It is easier when the word consists of a fixed number of characters. This is example code works in level 12 and is hangman without drawing

levens = 10
aantal_letters = 6
max_aantal_beurten = levens + aantal_letters
woord = 'leeg', 'leeg', 'leeg', 'leeg', 'leeg', 'leeg'
raad = '.', '.', '.', '.', '.', '.'

for i in range 1 to aantal_letters
    letter =ask 'wat is letter ' i '?'
    add letter to woord
    remove leeg from woord

for i in range 1 to max_aantal_beurten
    if levens is 0
        print 'Helaas! Je hebt verloren.'
    else
        print raad at 1 raad at 2 raad at 3 raad at 4 raad at 5 raad at 6
        letter =ask 'Welke letter denk jij dat er in het woord zit?'
        if letter in woord
            print 'Hoera ' letter ' zit er in'
            teller = 1
            for l in woord
                if l = letter
                    raad at teller = letter
                teller = teller + 1
        else
            print 'Helaas ' letter ' zit er niet in'
            levens = levens - 1
AnneliesVlaar commented 6 months ago

@MarleenGilsing Simon says texual is like 'ik ga op reis en neem mee'? Then we can also play it with multiple players instead of against the computer. I think the main functionality that is needed is checking the sequences (the lists) against each other. So I think this game is possible to create from level 14 because there you can use == to compare lists.

AnneliesVlaar commented 6 months ago

To use the while loop I had to move to level 15. Also in this code it is difficult to make it work since you cannot create a empty list. Here I create two lists with two items 'test' such that when you compare the lists they are the same (but it is not beautiful). But here is a Simon Says code for level 15

colors = 'red', 'blue', 'green', 'yellow'
simon_sequence = 'test', 'test'

define add_random_color
    random_color is colors at random
    add random_color to simon_sequence

define display_sequence with length
    last_index = 2 + length
    for place in range 3 to last_index
        print simon_sequence at place
        sleep 1
        clear

define get_player_sequence with length
    for i in range 1 to length
        color = ask 'what is color number ' i '?'
        add color to player_sequence

level = 1
correct = 'True'
print 'Welcome to Simon Says!'
sleep 1
clear
while correct == 'True'
    print 'Level ' level
    sleep 1
    clear
    player_sequence = 'test', 'test'
    call add_random_color
    call display_sequence with level
    call get_player_sequence with level
    if player_sequence == simon_sequence
        print "Correct! Moving on to the next level."
        sleep 1
        level = level + 1
    else
        print 'Incorrect! Game Over.'
        correct = 'False'
AnneliesVlaar commented 6 months ago

Because Simon says looks like 'ik ga op reis en neem mee' here is level 15 'ik ga op reis en neem mee' with two players.

old_sequence = 'test', 'test'
new_sequence = 'test', 'test'

define add_item with number
    item = ask 'What is item number ' number '?'
    add item to new_sequence
    print item

define show_correct_answer
    print 'The correct items are:'
    for item in old_sequence
        if item != 'test'
            print item

define get_player_sequence with length
    i = 1
    while i < length
        call add_item with i
        i = i + 1
    if new_sequence == old_sequence
        call add_item with i
        print "Correct! Moving on to the next level."
        correct = 'True'
    else
        print 'Incorrect! Game Over.'
        call show_correct_answer
        correct = 'False'
    return correct

correct = 'True'
level = 1
player = 1
while correct == 'True'
    sleep 1
    clear
    print 'Player ' player
    print 'Ik ga op reis en neem mee'
    correct = call get_player_sequence with level
    level = level + 1
    old_sequence = new_sequence
    new_sequence = 'test', 'test'
    if player == 1
        player = 2
    else
        player = 1
MarleenGilsing commented 6 months ago

Superleuk @AnneliesVlaar! Ik ga ermee aan de slag!

MarleenGilsing commented 6 months ago

@AnneliesVlaar Your hangman game is almost ready in PR #5333 :)