[Bash] Hangman script

Pagina: 1
Acties:

  • cherwin
  • Registratie: Maart 2006
  • Niet online
Ik heb een hangman spel gemaakt, geïmplementeerd in Bash. Natuurlijk denk je, "wat moet ik hier nu mee". Nou ik zou graag commentaar c.q. ideeën van jullie willen hebben hoe ik dit nu zou kunnen verbeteren, of gewoon wat jij anders zou doen.

De reden dat ik dit script heb gemaakt bestaat deels uit verveling en om te kijken hoe ik me schaar tussen de andere Bash fanatiekelingen :)

Het hoeft natuurlijk niet alleen over deze script te gaan, er is ook plaats om te discusiëren over shell scripten en het ontwikkelen ervan.

Hier nog een aantal url's waar ik het meest van heb geleerd:

http://tldp.org/LDP/abs/html/
http://wooledge.org:8000/BashPitfalls
http://www.oreilly.com/catalog/bash3/

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/bash
#
# Author: Cherwin Nooitmeer <cherwin@gmail.com>
#

read -p "Please enter a word to begin playing: " secret
secret=$(echo $secret | tr [:upper:] [:lower:])
clear

for ((i=0; i<${#secret}; i++))
do
    # consult bash Parameter Expansion for more information
    word[$i]=${secret:${i}:1}
done

index=0 # index to index characters array
characters=( 0 )
print_underscores() {
    # just print the underscores if there were no parameters
    if [ -z $1 ]; then
        for i in ${word[@]}
        do
            echo -n "_ "
        done
        return
    fi

    dupe=0
    # check to see if there aren't any duplicate guesses
    for char in ${characters[@]}
    do
        if [ $char = $1 ]; then
            dupe=1 ; break
        fi
    done

    # add guess to array if there aren't any duplicate guesses
    if [ $dupe -ne 1 ]; then
        characters[$index]=$1
        ((index++))
    fi

    # check guesses against secret word
    found=0
    for letter in ${word[@]}
    do
        for char in ${characters[@]}
        do
            if [ $char = $letter ]; then
                echo -n "$char "
                found=1 # found character in secret
                continue
            fi
        done
        # didn't find character in secret
        if [ $found -eq 0 ]; then
            echo -n "_ "
        fi
        found=0
    done
}

read() {
    builtin read -p "Guess a letter: " guess
    # sanitize input, only alpha characters are allowed
    case "$guess" in
        [abcdefghijklmnopqrstuvwxyz]) : ;;
        [ABCDEFGHIJKLMNOPQRSTUVWXYZ]) 
            guess=$(echo $guess | tr [:upper:] [:lower:]) ;;
    *) 
            echo error
            read ;;
    esac
}


clear
print_underscores
echo

counter=0
while true
do
    read
    print_underscores $guess
    echo
    # exit loop after 10 tries
    if [ $counter -eq 10 ]; then
        echo "GAME OVER"
        exit
    fi
    ((counter++))
done

[ Voor 11% gewijzigd door cherwin op 16-05-2008 18:38 ]

Tell me your problem, not the solution you think I should build for you.


  • krietjur
  • Registratie: Februari 2001
  • Nu online

krietjur

Where am I?

Grappig gedaan. Wat ik nog "mis"
- Aantal resterende pogingen
- Zodra je het woord geraden hebt, blijft hij toch nog vragen om imput van een letter

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 15:52

Gonadan

Admin Beeld & Geluid, Harde Waren
En ik mis het ASCII-galgje, in plaats van het aantal pogingen wil ik wel een mannetje zien natuurlijk.
Even clear tussendoor en gaan. :D

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • cherwin
  • Registratie: Maart 2006
  • Niet online
krietjur schreef op donderdag 08 mei 2008 @ 10:20:
Grappig gedaan. Wat ik nog "mis"
- Aantal resterende pogingen
[..]
code:
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
counter=0
end=10
while true
do
    read
    ((counter++))
    clear
    print_underscores $guess
    echo -e "\t\t$((end - counter)) tries left"
    echo
    # exit loop after $end tries
    if [ $counter -eq $end ]; then
        echo "GAME OVER"
        exit
    fi
done


Nu is dat probleem verholpen, heeft iemand nog ideeën voor het ASCII-galgje?

En ja ik zie het, wanneer het woord is geraden, blijft de script om input vragen. Ik zat zelf te denken aan een functie die controleert of alle karakters in het array $characters[@] ook voorkomt in het array $word[@], zo ja dan kan het spelletje stoppen met de output "VICTORY" of iets dergelijks.

Tell me your problem, not the solution you think I should build for you.


  • cherwin
  • Registratie: Maart 2006
  • Niet online
Niemand die hier nog iets nuttigs aan kan toevoegen?

[ Voor 28% gewijzigd door cherwin op 21-07-2008 06:07 ]

Tell me your problem, not the solution you think I should build for you.


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 15:52

Gonadan

Admin Beeld & Geluid, Harde Waren
code:
1
2
3
4
5
6
7
  _______
 |/      |
 |      (_)
 |      \|/
 |       |
 |      / \
_|___

Verder kan je inderdaad nog zorgen dat het script zelf weet wanneer je gewonnen of verloren hebt.
En dan bijvoorbeeld vragen of je nog een keer wilt spelen.

Wat je ook nog kunt doen is moeilijkheidsgraden maken. Bijvoorbeeld door het aantal letters van de woorden die hij kan gebruiken op te geven.

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1