Выбрать главу

guessed: e, steps from gallows: 6, word so far: −e-e-

Guess a letter: i

* Great! The letter "i" appears in the word!

guessed: ei, steps from gallows: 6, word so far: −e-e-i-

Guess a letter: o

* Great! The letter "o" appears in the word!

guessed: eio, steps from gallows: 6, word so far: −e-e-io-

Guess a letter: u

* Great! The letter "u" appears in the word!

guessed: eiou, steps from gallows: 6, word so far: −e-e-iou-

Guess a letter: m

* Nope, "m" does not appear in the word.

guessed: eioum, steps from gallows: 5, word so far: −e-e-iou-

Guess a letter: n

* Great! The letter "n" appears in the word!

guessed: eioumn, steps from gallows: 5, word so far: −en-en-iou-

Guess a letter: r

* Nope, "r" does not appear in the word.

guessed: eioumnr, steps from gallows: 4, word so far: −en-en-iou-

Guess a letter: s

* Great! The letter "s" appears in the word!

guessed: eioumnrs, steps from gallows: 4, word so far: sen-en-ious-

Guess a letter: t

* Great! The letter "t" appears in the word!

guessed: eioumnrst, steps from gallows: 4, word so far: sententious-

Guess a letter: l

* Great! The letter "l" appears in the word!

guessed: eioumnrstl, steps from gallows: 4, word so far: sententiousl-

Guess a letter: y

** You’ve been pardoned!! Well done! The word was "sententiously".

*** New Game! ***

steps from gallows: 6, word so far: —-

Guess a letter: quit

Усовершенствование сценария

В сценарии командной оболочки трудно реализовать вывод графического изображения человечка на виселице, поэтому мы использовали альтернативу: подсчет «шагов до эшафота». Однако вы настроены серьезно, попробуйте использовать серии предопределенных фрагментов текстовой псевдографики, по одному для каждого шага, и выводить их по мере игры. Или поищите какую-нибудь другую метафору, не связанную с насилием!

Обратите внимание, что одно и то же слово может быть выбрано несколько раз в одном сеансе игры, хотя со списком по умолчанию, насчитывающим 2882 варианта, это маловероятно. Однако если вы все же беспокоитесь, можно добавить переменную для хранения всех использованных слов и при выборе нового сверяться с ней.

Наконец, попробуйте сортировать угаданные буквы в переменной guessed в алфавитном порядке. Это можно сделать несколькими способами, но мы советуем попробовать связку sed|sort.

№ 85. Угадай столицу

Теперь, когда у нас есть инструмент выбора случайной строки из файла, перед нами открываются широкие перспективы в создании самых разных игр-викторин. Мы поместили в список столицы всех 50 штатов США, доступный для загрузки по адресу: http://www.nostarch.com/wcss2/. Сохраните файл state.capitals.txt в своем каталоге /usr/lib/games. Сценарий в листинге 12.5 выбирает случайную строку из файла, выводит название штата и предлагает пользователю ввести название его столицы.

Код

Листинг 12.5. Сценарий states? реализующий игру «Угадай столицу»

#!/bin/bash

# states — игра "Угадай столицу". Требует наличия файла со списком

#·· штатов и их столиц state.capitals.txt.

db="/usr/lib/games/state.capitals.txt" # Формат: Штат[табуляция]Город.

if [! -r "$db"]; then

··echo "$0: Can't open $db for reading." >&2

··echo "(get state.capitals.txt" >&2

··echo "save the file as $db and you're ready to play!)" >&2

··exit 1

fi

guesses=0; correct=0; total=0

while ["$guess"!= "quit"]; do

··thiskey="$(randomquote $db)"

··# $thiskey — выбранная строка. Теперь нужно извлечь название штата

··#·· и города, и затем создать версию названия города со всеми буквами

··#·· в нижнем регистре для сопоставления.

··state="$(echo $thiskey | cut −d\ −f1 | sed 's/-/ /g')"

··city="$(echo $thiskey | cut −d\ −f2 | sed 's/-/ /g')"

··match="$(echo $city | tr '[: upper: ]' '[: lower: ]')"

··guess="??"; total=$(($total + 1));

··echo ""

··echo "What city is the capital of $state?"

··# Главный цикл, где все и происходит. Сценарий выполняет его, пока

··#·· город не будет правильно угадан, или пока пользователь не введет

··#·· "next", чтобы пропустить штат, или "quit", чтобы завершить игру.

··while ["$guess"!= "$match" −a "$guess"!= "next" −a "$guess"!= "quit"]

··do

····/bin/echo −n "Answer: "

····read guess

····if ["$guess" = "$match" −o "$guess" = "$city"]; then

······echo ""

······echo "*** Absolutely correct! Well done! ***"

······correct=$(($correct + 1))

······guess=$match

····elif ["$guess" = "next" −o "$guess" = "quit"]; then

······echo ""

······echo "$city is the capital of $state." # Вы ДОЛЖНЫ это знать:)