Игра "Угадай число" версия 0.1

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Игра "Угадай число" версия 0.1

Сообщение ZEN » 21 ноя 2012, 12:12

Как-то было дело в образовательных целях написать простой скрипт игру. Кому интересно, предлагаю переписать/улучшить/оптимизировать скрипт с добавлением новых плюшек :)

Код: Выделить всё

#!/bin/bash
# Максимальное число 
MAX_NUMBER=3
# Генерируем случайное число
RND=$(($RANDOM%$MAX_NUMBER)) 

# Вступление
echo "Хочешь выиграть авторучку?"
echo "тогда угадай, какое я задумал число от 0 до $MAX_NUMBER :)"

# Читаем символы вводимые пользователем
# и записываем в переменную INPUT
read -p"> " INPUT

# Проверяем не угадал ли игрок
if [[ $RND = $INPUT ]]
then # Если угадал
    echo "Поздравляю! Ты угадал с 1 попытки"
    echo "Определенно рекорд! Хочешь еще сыграть?"
    exit 0; # И выходим из программы
else # Если нет, даем шанс
    echo "Неугадал, подумай хорошо над ответом :)"
fi

# Читаем символы вводимые пользователем
# и записываем в переменную INPUT
read -p"> " INPUT

# Проверяем не угадал ли игрок
if [[ $RND = $INPUT ]]
then # Если угадал
    echo "Поздравляю! Ты угадал с 2 попыток"
    echo "Ты можешь лучше, сыграем еще раз?"
    exit 0; # И выходим из программы
else # Если нет, даем шанс
    echo "Неудача... Попробуй снова"
fi 

# Читаем символы вводимые пользователем
# и записываем в переменную INPUT
read -p"> " INPUT

# Проверяем не угадал ли игрок
if [[ $RND = $INPUT ]]
then # Если угадал
    echo "Поздравляю! Ты угадал с 3 попыток"
    echo "Молодец, но я больше не подсказываю :-P"
else # Если нет, предлагаем начать с самого начала
    echo "Ты проиграл"
    echo "Может сыграем еще раз?"
    exit 1 # И выходим из программы
fi 

exit 0 # И выходим из программы  
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
lumberjack
Модератор
Сообщения: 1010
Зарегистрирован: 30 сен 2012, 04:04
Темы: 152
Откуда: Сургут
Статус: Не в сети

Re: Игра "Угадай число" версия 0.1

Сообщение lumberjack » 21 ноя 2012, 15:28

Код: Выделить всё

COUNT=1                                                                 #переменная количества попыток
random=$(($RANDOM%3))                                                   #переменная "загаданного числа"
 
echo "введи число от 0 до 3"                                            #вывод текста о необходимости ввода числа

while                                                                   #начать цикл, и пока
read A                                                                  #введенное число
[ $COUNT -lt 3 ]                                                        #меньше 3
        do                                                              #выполнять
        if [ $A -eq $random ]                                           #если введенное число эквивалентно рандомному числу
                then                                                    #тогда
                        echo "ты выиграл! с $COUNT попытки"             #выводимый текст количества попыток
                        echo "введенное число совпадает с рандомным"    #выводимый текст
                        exit 1;                                         #если не угадал, продолжить цикл while сначала
                else                                                    #если введенное число отлично от рандомного,
                        let COUNT=$COUNT+1                              #увеличение значения переменной COUNT на 1
                        echo "попробуй еще раз"                         #вывод текста
                        echo "попытка $COUNT"                           #вывод номера попытки
        fi                                                              #закончить подцикл if
done                                                                    #завершить цикл while

echo "ты проиграл! было задумано число $random"                         #выводимый текст с задуманным числом

exit 0;                                                                 #завершить скрипт и выйти 

Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Re: Игра "Угадай число" версия 0.1

Сообщение ZEN » 22 ноя 2012, 13:41

Вот мой второй вариант игры

Теперь можно:
  1. В переменной MAX_NUMBER указывать максимальное число
  2. В переменной TRY_COUNT указывать кол-во попыток
  3. Если число большое или маленькое, скрипт об этом рапортует
  4. Предлагает сыграть еще раз не завершая работу скрипта

Код: Выделить всё

#!/bin/bash

### Блок функций 
# Создаем функцию, в которой весь ход игры
game () 
{
    # Счетчик, считаем кол-во шагов
    COUNT=0
    # До тех пор, пока он меньше либо равен кол-ву попыток
    while [[ $COUNT -le $TRY_COUNT ]]
    do
    # Увеличиваем счетчик на +1
    let COUNT+=1
    # Просим ввести число
        read -p"> " INPUT
        # Проверяем не угадал ли игрок
        if [[ $INPUT = $RND ]]
        then # Если угадал
        echo "Поздравляю! Ты угадал с $COUNT-й попытки"
        # Прерываем цикл
        break;
    elif [[ $INPUT -lt $RND ]] # Если число меньше задуманного
    then
        echo "Слишком маленькое число, нужно больше!"
    elif [[ $INPUT -gt $RND ]] # Если число больше задуманного
    then
        echo "Число слишком большое!"
    fi
    done

    # По завершению работы функции возвращаемся в точку вызова
}
###

### Блок переменных
# Максимально задуманное число
MAX_NUMBER=100
# Количество попыток
TRY_COUNT=8
# Случайное задуманное число
RND=$(($RANDOM%$MAX_NUMBER)) 
### 


### Основной цикл программы
# Стартовое приглашение
echo "Хочешь выиграть авторучку?"
echo "Тогда угадай, какое я задумал число от 0 до $MAX_NUMBER"
echo "У тебя $TRY_COUNT попыток :)"
# Запускаем цикл
while [ true ]
do
    # Точка вызова функции game
    game
    # После завершения игры спрашиваем сыграем ли еще
    read -p "Хочешь сыграть еще? (Yes/No) " QUERY
    # Проверяем что ввел пользователь
    case $QUERY in
    # Если согласен, то генерируем новое число и цикл while повторяется
    [Yy][Ee][Ss] | [Yy]) echo "Отлично! Я как раз задумал новое число!"
        RND=$(($RANDOM%$MAX_NUMBER)) ;;
    # Если не согласен - прерываем цикл while
    [Nn][Oo] | [Nn]) echo "Очень жаль! Мне будет скучно :(" 
        break ;;
    # Если ввел бред, тоже прерываем цикл
    *) echo "Ты невменяем! Я с такими не играю!"
        break ;;
    esac
done
###

# Выход из программы
exit 0
Как выглядит играПоказать
zen@debian:~$ ./script.sh
Хочешь выиграть авторучку?
Тогда угадай, какое я задумал число от 0 до 100
У тебя 8 попыток :)
> 50
Поздравляю! Ты угадал с 1-й попытки
Хочешь сыграть еще? (Yes/No) yes
Отлично! Я как раз задумал новое число!
> 50
Число слишком большое!
> 25
Слишком маленькое число, нужно больше!
> 35
Слишком маленькое число, нужно больше!
> 40
Поздравляю! Ты угадал с 4-й попытки
Хочешь сыграть еще? (Yes/No) N
Очень жаль! Мне будет скучно :(
На данный момент нет проверки ввел пользователь число или буквы. в будущем допишу в виде функции
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Re: Игра "Угадай число" версия 0.1

Сообщение ZEN » 24 дек 2013, 19:41

Добавил обещанную функцию для проверки на целое число :)

Код: Выделить всё

#!/bin/bash

### Блок функций
# Создаем функцию для проверки числа больше нуля
is_number () {
	# Возвращаем количество символов или ноль, если это не число
    echo $(expr match "$1" "^[0-9]*$");
}

# Создаем функцию, в которой весь ход игры
game () {
    # Счетчик, считаем кол-во шагов
    COUNT=0;
    
    # До тех пор, пока он меньше либо равен кол-ву попыток
    while [[ $COUNT -le $TRY_COUNT ]]
    do
        # Просим ввести число
        read -p"> " INPUT;
        
        # Проверяем что пользователь действительно ввёл число
        if [[ $(is_number $INPUT) == 0 ]]
        then
            echo "Я загадал число, а не слово";
            continue;
        fi
        
        # Увеличиваем счетчик на +1
        let COUNT+=1;
        
        # Проверяем не угадал ли игрок
        if [[ $INPUT = $RND ]]
        then # Если угадал
            echo "Поздравляю! Ты угадал с $COUNT-й попытки";
            # Прерываем цикл
            break;
        elif [[ $INPUT -lt $RND ]] # Если число меньше задуманного
        then
            echo "Слишком маленькое число, нужно больше!";
        elif [[ $INPUT -gt $RND ]] # Если число больше задуманного
        then
            echo "Число слишком большое!";
        fi
    done

    # По завершению работы функции возвращаемся в точку вызова
}
###

### Блок переменных
# Максимально задуманное число
MAX_NUMBER=100;
# Количество попыток
TRY_COUNT=8;
# Случайное задуманное число
RND=$(($RANDOM%$MAX_NUMBER));
###

### Основной цикл программы
# Стартовое приглашение
echo "Хочешь выиграть авторучку?";
echo "Тогда угадай, какое я задумал число от 0 до $MAX_NUMBER";
echo "У тебя $TRY_COUNT попыток :)";
# Запускаем цикл
while [ true ]
do
    # Точка вызова функции game
    game;
    
    # После завершения игры спрашиваем сыграем ли еще
    read -p "Хочешь сыграть еще? (Yes/No) " QUERY;
    
    # Проверяем что ввел пользователь
    case $QUERY in
        # Если согласен, то генерируем новое число и цикл while повторяется
        [Yy][Ee][Ss] | [Yy])
            echo "Отлично! Я как раз задумал новое число!";
            RND=$(($RANDOM%$MAX_NUMBER));
        ;;
        # Если не согласен - прерываем цикл while
        [Nn][Oo] | [Nn])
            echo "Очень жаль! Мне будет скучно :(";
            break;
        ;;
        # Если ввел бред, тоже прерываем цикл
        *)
            echo "Ты невменяем! Я с такими не играю!";
            break;
        ;;
    esac
done
###

# Выход из программы
exit 0;
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
cadash
Сообщения: 292
Зарегистрирован: 27 авг 2013, 12:06
Темы: 59
Статус: Не в сети

Re: Игра "Угадай число" версия 0.1

Сообщение cadash » 24 дек 2013, 21:39

А там выиграть вообще возможно?
Давайте привяжем некоторые постоянные цифры которые что-то значат.
Чтобы повысить вероятность выигрыша.
Например цифры 1, 7, 6, 13, 15, 21, 30, 31.
Так же нужно рассчитать положение пальцев относительно клавиш.
Например комбинации 1*, 2*, 3*.
Если система в массиве данных на данный момент выбрала 1*, то если пользователь введёт 12 или 17 то он должен выиграть. То есть в выигрыше 1 десяток и любые единицы.

Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Re: Игра "Угадай число" версия 0.1

Сообщение ZEN » 24 дек 2013, 22:31

cadash писал(а):А там выйграть вообще возможно?
Можно :) Постом ранее процесс игры запечатлен под спойлером, вот он же еще раз:
zen@debian:~$ ./script.sh
Хочешь выиграть авторучку?
Тогда угадай, какое я задумал число от 0 до 100
У тебя 8 попыток :)
> 50
Поздравляю! Ты угадал с 1-й попытки
Хочешь сыграть еще? (Yes/No) yes
Отлично! Я как раз задумал новое число!
> 50
Число слишком большое!
> 25
Слишком маленькое число, нужно больше!
> 35
Слишком маленькое число, нужно больше!
> 40
Поздравляю! Ты угадал с 4-й попытки
Хочешь сыграть еще? (Yes/No) N
Очень жаль! Мне будет скучно :(
Как видишь угадал оба раза и один из них даже с первой попытки )
cadash писал(а):Давайте привяжем некоторые постоянные цифры которые что-то значат.
Чтобы повысить вероятность выигрыша.
Например цифры 1, 7, 6, 13, 15, 21, 30, 31.
Так же нужно рассчитать положение пальцев относительно клавиш.
Например комбинации 1*, 2*, 3*.
Если система в массиве данных на данный момент выбрала 1*, то если пользователь введёт 12 или 17 то он должен выиграть. То есть в выигрыше 1 десяток и любые единицы.
Скрипты выше создавались в обучающих целях, хотя оригинал игры я впервые реализовывал лет 17-18 назад на Sinclair Basic... В общем, каким бы ни был алгоритм и правила игры - любой код приветствуется) Выше уже есть вариант решения от lumberjack :)
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей