diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99ed0d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +notes.txt diff --git a/hangman/alphabet.sh b/hangman/alphabet.sh index 90bd612..13c02f6 100644 --- a/hangman/alphabet.sh +++ b/hangman/alphabet.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash alphabet_block() { - local ok_name=$1 bad_name=$2 - local -n ok_arr=$ok_name bad_arr=$bad_name + local -n ok_arr=$1 bad_arr=$2 + local l i=0 for l in {a..z}; do if [[ " ${ok_arr[*]} " == *" $l "* ]]; then diff --git a/hangman/display.sh b/hangman/display.sh index ceb87c3..bbbffef 100644 --- a/hangman/display.sh +++ b/hangman/display.sh @@ -1,65 +1,67 @@ #!/usr/bin/env -mask="" - display_game_frame() { - - echo $* - - local _wrong=$1 _secret=$2 ok_name=$3 bad_name=$4 + local -n ok_name=$1 + local -n bad_name=$2 + local -n _wrong=$3 + local -n _secret=$4 clear case $_wrong in - 0) gallows ;; 1) wrong1 ;; 2) wrong2 ;; - 3) wrong3 ;; 4) wrong4 ;; 5) wrong5 ;; + 0) gallows ;; + 1) wrong1 ;; + 2) wrong2 ;; + 3) wrong3 ;; + 4) wrong4 ;; + 5) wrong5 ;; 6) wrong6 echo "Du bist verhangen - das Wort war: $_secret" - exit + return 1 ;; esac echo - mask=$(mask_word $_secret) + mask=$(mask_word) echo "Wort: $mask" echo - endings_order $_wrong $_secret - #} + alphabet_block ok_name bad_name + + cleaned="${mask// /}" + if [[ $_secret == $cleaned ]]; then + endings_order $_wrong $mask + return 1 + fi - alphabet_block $ok_name $bad_name echo + return 0 } endings_order() { - - _wrong=$1 _secret=$2 - - # [[ "$mask" != *"_"* ]] && { - case $_wrong in - 0) mistakes0 ;; - 1) mistakes1 ;; - 2) mistakes2 ;; - 3) mistakes3 ;; - 4) mistakes4 ;; - 5) mistakes5 ;; - *) - # mistakes6 - echo "Du hast gewonnen!" - ;; - - esac - - if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - echo "$output" - fi - - return - - # - # } + local wrong=$1 + local mask=$2 + + [[ "$mask" != *"_"* ]] && { + case $_wrong in + 0) mistakes0 ;; + 1) mistakes1 ;; + 2) mistakes2 ;; + 3) mistakes3 ;; + 4) mistakes4 ;; + 5) mistakes5 ;; + *) + mistakes6 + echo "Du hast gewonnen!" + ;; + esac + + if [[ "${BASH_SOURCE[0]}" == $0 ]]; then + echo $output + fi + } } display_startup() { @@ -71,5 +73,3 @@ display_startup() { echo sleep 3.3 } - -#display_game_frame 12 99 diff --git a/hangman/main.sh b/hangman/main.sh index 12d5fb1..3d87f74 100644 --- a/hangman/main.sh +++ b/hangman/main.sh @@ -1,58 +1,24 @@ #!/usr/bin/env bash set -uo pipefail -bad_guess=() -ok_guess=() - -mistake_countin() { - - local ltr=$1 - local secret=$2 - declare -n ok_ref=$3 - declare -n bad_ref=$4 - declare -n wrong_ref=$5 - - all="${ok_ref[*]} ${bad_ref[*]}" - if [[ " $all " == *" $ltr "* ]]; then - if [[ "${BASH_SOURCE[0]}" == $0 ]]; then - echo "schon geraten" - fi - return 0 - fi - - if [[ "$secret" == *"$ltr"* ]]; then - ok_ref+=("$ltr") - else - - bad_ref+=("$ltr") - ((wrong_ref++)) - fi - -} - initialising() { - dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - source "$dir/drawings.sh" - source "$dir/wordlist.sh" - source "$dir/alphabet.sh" - source "$dir/display.sh" - source "$dir/endings.sh" - - secret="$(choose_word)" - secret=${secret//$'\r'/} + if [[ "${BASH_SOURCE[0]}" != $0 ]]; then + return + fi - # local -n ok_ref=$1 - #local -n bad_ref=$2 + local -n wrong=$1 + local -n ok_word=$2 + local -n bad_word=$3 + local -n _secret=$4 - wrongstate=0 - - display_startup "$secret" + display_startup "$_secret" while :; do - display_game_frame "$wrongstate" "$secret" ok_ref bad_ref + if ! display_game_frame guessed_ok guessed_bad wrongstate secret; then + break + fi - # Eingabe while true; do read -rp "Rate einen Buchstaben (a-z): " -n1 ltr || { echo @@ -65,23 +31,54 @@ initialising() { } ltr=${ltr,,} - break - done + process_guess guessed_ok guessed_bad "$ltr" wrongstate + break + done + done +} - mistake_countin "$ltr" "$secret" ok_ref bad_ref wrongstate +process_guess() { + local -n ok_guess=$1 + local -n bad_guess=$2 + local ltr=$3 + local -n wrong_count=$4 - done + [[ " ${ok_guess[*]} ${bad_guess[*]} " == *" $ltr "* ]] && { + user_error="schon geraten" + if [[ "${BASH_SOURCE[0]}" == $0 ]]; then + echo "$user_error" + fi + return + } + if [[ "$secret" == *"$ltr"* ]]; then + ok_guess+=("$ltr") + else + bad_guess+=("$ltr") + ((wrong_count++)) + fi } main() { + dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + source "$dir/drawings.sh" + source "$dir/wordlist.sh" + source "$dir/alphabet.sh" + source "$dir/display.sh" + source "$dir/endings.sh" + + secret="$(choose_word)" + secret=${secret//$'\r'/} + + guessed_ok=() + guessed_bad=() + wrongstate=0 - ref_ok=() - ref_bad=() - initialising ref_ok ref_bad - mistake_countin $ltr $secret ref_ok ref_bad wrongstate + initialising wrongstate guessed_ok guessed_bad secret } -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then main +else + exit fi diff --git a/hangman/tests/test b/hangman/tests/test new file mode 100644 index 0000000..e69de29 diff --git a/hangman/tests/test_block_multiple_letters.sh b/hangman/tests/test_block_multiple_letters.sh new file mode 100644 index 0000000..88c2c28 --- /dev/null +++ b/hangman/tests/test_block_multiple_letters.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -ueo pipefail + +source ../main.sh + +ok_test=() +bad_test=(a) +ltr="a" +wrong_value=0 + + +process_guess ok_test bad_test $ltr wrong_value + +if ! [[ ${#ok_test[@]} == 0 && ${#bad_test[@]} == 1 ]]; then # testing if the array if the arrays +# are not manipulated. +exit 1 + +fi + + +# testing if there is the correct user_error in case of trying a letter again. + + + +[[ $user_error == "schon geraten" ]] || exit 1 # more safety + + + + diff --git a/hangman/tests/test_endings_order.sh b/hangman/tests/test_endings_order.sh index 2c41d43..78223b1 100644 --- a/hangman/tests/test_endings_order.sh +++ b/hangman/tests/test_endings_order.sh @@ -15,21 +15,15 @@ test_endings_order() { _wrong=3 _secret="affe" - ## test1 : 3 mistakes - + ## test1: 3 mistakes endings_order $_wrong $_secret - - [[ $output == "Geschafft, aber mit vielen Fehlern. Übung macht den Meister." ]] + [[ $output == "Geschafft, aber mit vielen Fehlern. Übung macht den Meister." ]] || echo failed ## test2: 0 mistakes - _wrong=0 _secret="affe" - endings_order $_wrong $_secret - - [[ $output == "Perfekt! 👍 Du hast das Wort ohne Fehler erraten." ]] - + [[ $output == "Perfekt! 👍 Du hast das Wort ohne Fehler erraten." ]] || echo failed } test_endings_order diff --git a/hangman/tests/test_mistake_counter.currently_disabled b/hangman/tests/test_mistake_counter.currently_disabled new file mode 100644 index 0000000..69da16e --- /dev/null +++ b/hangman/tests/test_mistake_counter.currently_disabled @@ -0,0 +1,43 @@ +#!/bin/bash + +set -ueo pipefail + +source "$(dirname "$0")/../main.sh" + +test_mistake_countin() { + + local guessed_ok=() + local guessed_bad=() + local wrongstate=0 + ltr=a + local secret="Apfelsaft" + + # test 1 + + mistake_treatement guessed_ok guessed_bad $ltr wrongstate + + + echo $wrongstate + + [[ $wrongstate == 0 ]] + + # test 2 + + set +e + + mistake_treatement guessed_ok guessed_bad "x" wrongstate + + + [[ $wrongstate == 1 ]] && echo succes|| exit 1 + + + mistake_treatement guessed_ok guessed_bad "x" wrongstate + + [[ $wrongstate == 1 ]] && echo succes || exit 1 #should remaim the same because x was already guessed. + + + + +} + +test_mistake_countin diff --git a/hangman/tests/test_mistake_counter.sh b/hangman/tests/test_mistake_counter.sh index 969fa33..4a6c65e 100644 --- a/hangman/tests/test_mistake_counter.sh +++ b/hangman/tests/test_mistake_counter.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -uoe pipefail +set -ueo pipefail source "$(dirname "$0")/../main.sh" @@ -9,27 +9,21 @@ test_mistake_countin() { local guessed_ok=() local guessed_bad=() local wrongstate=0 + ltr=a local secret="Apfelsaft" # test 1 - - mistake_countin "a" "$secret" guessed_ok guessed_bad wrongstate - + process_guess guessed_ok guessed_bad $ltr wrongstate [[ $wrongstate == 0 ]] # test 2 - set +e - mistake_countin "x" "$secret" ok_guess bad_guess wrongstate - #echo $wrongstate - + process_guess guessed_ok guessed_bad "x" wrongstate [[ $wrongstate == 1 ]] || exit 1 - mistake_countin "x" "$secret" ok_guess bad_guess wrongstate - - [[ $wrongstate == 1 ]] || exit 1 #should remaim the same because x was already guessed. - + process_guess guessed_ok guessed_bad "x" wrongstate + [[ $wrongstate == 1 ]] || exit 1 # should remain the same because x was already guessed. } test_mistake_countin diff --git a/hangman/tests/test_user_input.sh.disabled b/hangman/tests/test_user_input.sh.disabled index 47acbec..3896563 100644 --- a/hangman/tests/test_user_input.sh.disabled +++ b/hangman/tests/test_user_input.sh.disabled @@ -1,56 +1,25 @@ -#! /bin/bash - -set -euo pipefail +#!/bin/bash +set -euo pipefail source "$(dirname "$0")/../main.sh" -process_guess - - - - - secret="Hund" -ltr="u" - - +ltr="u" -#guessed_ok=() -##guessed_bad=() - - -#echo $secret -#echo $ltr - - - - -echo ${#guessed_ok[@]} -echo ${guessed_bad[@]} +guessed_ok=() +guessed_bad=() +wrongstate=0 +process_guess guessed_ok guessed_bad "$ltr" wrongstate +echo "Länge guessed_ok: ${#guessed_ok[@]}" +echo "guessed_bad: ${guessed_bad[*]}" for i in "${!guessed_ok[@]}"; do printf "[%s] => '%s'\n" "$i" "${guessed_ok[$i]}" done - - if [[ "$secret" == *"$ltr"* ]]; then - -[[ " ${guessed_ok[*]} " == *" $ltr"* ]] #checking, if the letter gets to the array the letter is in the secret and if its the first guess. - - - - + [[ " ${guessed_ok[*]} " == *" $ltr"* ]] && echo "Buchstabe korrekt eingetragen." fi - - - - - - - - - diff --git a/struktogramm/file.json b/struktogramm/entwurf/file.json similarity index 100% rename from struktogramm/file.json rename to struktogramm/entwurf/file.json diff --git a/struktogramm/file.png b/struktogramm/entwurf/file.png similarity index 100% rename from struktogramm/file.png rename to struktogramm/entwurf/file.png diff --git a/struktogramm/struktogramm.json b/struktogramm/struktogramm.json new file mode 100644 index 0000000..f947daa --- /dev/null +++ b/struktogramm/struktogramm.json @@ -0,0 +1,176 @@ +{ + "id": "root", + "type": "InsertNode", + "followElement": { + "id": "main", + "type": "FunctionNode", + "text": "main", + "parameters": [], + "followElement": { + "id": "initvars", + "type": "TaskNode", + "text": "ref_ok = []\nref_bad = []", + "followElement": { + "id": "call_init", + "type": "TaskNode", + "text": "initialising(ref_ok, ref_bad)", + "followElement": { + "id": "endmain", + "type": "TaskNode", + "text": "Ende", + "followElement": null + } + } + }, + "child": { + "id": "initialising_func", + "type": "InsertNode", + "followElement": { + "id": "initialising", + "type": "FunctionNode", + "text": "initialising", + "parameters": ["ok_ref", "bad_ref"], + "followElement": null, + "child": { + "id": "loadfiles", + "type": "TaskNode", + "text": "Dateien laden (drawings.sh, wordlist.sh, ...)", + "followElement": { + "id": "secretword", + "type": "TaskNode", + "text": "secret = choose_word()", + "followElement": { + "id": "wrongstate", + "type": "TaskNode", + "text": "wrongstate = 0", + "followElement": { + "id": "displaystartup", + "type": "TaskNode", + "text": "display_startup(secret)", + "followElement": { + "id": "whilegame", + "type": "HeadLoopNode", + "text": "while true (Spiel läuft)", + "followElement": null, + "child": { + "id": "gameframe", + "type": "TaskNode", + "text": "display_game_frame(wrongstate, secret, ok_ref, bad_ref)", + "followElement": { + "id": "eingabe", + "type": "InputNode", + "text": "Rate einen Buchstaben (a-z):", + "followElement": { + "id": "checkletter", + "type": "TaskNode", + "text": "mistake_countin(ltr, secret, ok_ref, bad_ref, wrongstate)", + "followElement": { + "id": "endloop", + "type": "TaskNode", + "text": "Prüfe Spielende (optional)", + "followElement": null + } + } + } + } + } + } + } + } + } + } + }, + "child": { + "id": "mistakecountin_func", + "type": "InsertNode", + "followElement": { + "id": "mistake_countin", + "type": "FunctionNode", + "text": "mistake_countin", + "parameters": ["ltr", "secret", "ok_ref", "bad_ref", "wrongstate"], + "followElement": null, + "child": { + "id": "wasgeraten", + "type": "BranchNode", + "text": "Wurde Buchstabe schon geraten?", + "followElement": null, + "trueChild": { + "id": "schongeraten", + "type": "OutputNode", + "text": "schon geraten", + "followElement": null + }, + "falseChild": { + "id": "imbuch", + "type": "BranchNode", + "text": "Buchstabe im secret?", + "followElement": null, + "trueChild": { + "id": "okref", + "type": "TaskNode", + "text": "ok_ref += Buchstabe", + "followElement": null + }, + "falseChild": { + "id": "badref", + "type": "TaskNode", + "text": "bad_ref += Buchstabe; wrongstate++", + "followElement": null + } + } + } + }, + "child": { + "id": "display_func", + "type": "InsertNode", + "followElement": { + "id": "display_game_frame", + "type": "FunctionNode", + "text": "display_game_frame", + "parameters": ["wrongstate", "secret", "ok_ref", "bad_ref"], + "followElement": null, + "child": { + "id": "anzeigestand", + "type": "TaskNode", + "text": "Gib aktuellen Stand und Fehlerbild aus", + "followElement": null + } + }, + "child": { + "id": "display_startup_func", + "type": "InsertNode", + "followElement": { + "id": "display_startup", + "type": "FunctionNode", + "text": "display_startup", + "parameters": ["secret"], + "followElement": null, + "child": { + "id": "showstart", + "type": "TaskNode", + "text": "Starte Darstellung", + "followElement": null + } + }, + "child": { + "id": "choose_word_func", + "type": "InsertNode", + "followElement": { + "id": "choose_word", + "type": "FunctionNode", + "text": "choose_word", + "parameters": [], + "followElement": null, + "child": { + "id": "wählewort", + "type": "TaskNode", + "text": "Wählt ein zufälliges Wort aus wordlist", + "followElement": null + } + } + } + } + } + } + } +}