シェルスクリプトでヌメロン(HitAndBlow)の巻

スポンサーリンク

Bashシェルスクリプトを使ってヌメロン(Numer0n)を作ロン♪ということで作ってみました。

事前にコンピュータが定める4桁の数字をあてに行くゲームです。
Wikipedia:ヌメロンのルールはWikipediaをご参照ください。

今回作成したものは、一回ごとに継続して挑戦するかを確認する仕様となっています。
もしy/nでの回答を行わずに継続して実行したい場合は「-y」オプションをつけてください。

実行例:

# ./numeron.sh
---------------------------------------
Please choose 4 numbers from 0 to 9 and type in as 4 digit number [eg.1234]: 1234
---------------------------------------
0 eat 1 bite
continue?[y/n]: y
---------------------------------------
Please choose 4 numbers from 0 to 9 and type in as 4 digit number [eg.1234]: 1238
---------------------------------------
0 eat 2 bite
continue?[y/n]: y

「-y」オプションを利用した場合

# ./numeron.sh -y
---------------------------------------
Please choose 4 numbers from 0 to 9 and type in as 4 digit number [eg.1234]: 1234
---------------------------------------
0 eat 3 bite
 ----> try again
---------------------------------------
Please choose 4 numbers from 0 to 9 and type in as 4 digit number [eg.1234]: 5234
---------------------------------------
0 eat 2 bite
 ----> try again

シェルスクリプトの記述は以下のとおり

#!/bin/bash

arr=({0..9})
declare -a kotae
for i in `shuf --input-range=0-$(( ${#arr[*]} - 1 )) | head -4`
do
    kotae=("${kotae[@]}" "${arr[$i]}")
done
ks=`echo ${kotae[@]} | sed -e 's/ //g'`

# cheat
#echo $ks

a="y"
while [ $a == "y" ]; do
    userInput=''
    while [ -z ${userInput} ] ; do
        echo "---------------------------------------"
        echo -n "Please choose 4 numbers from 0 to 9 and type in as 4 digit number [eg.1234]: "
        read userInput
        echo "---------------------------------------"
        dup=`echo $userInput | grep -o . | sort | uniq -c | grep -v "1 [0-9]" | wc -l`
        if ! [[ $userInput =~ ^[0-9]{4}$ ]] || ! [ $dup -eq 0 ] ; then
            echo "not good input... try agin!"
            userInput=''
        fi
    done
    u=(`echo $userInput | grep -o .`)
    if [ $userInput = ${ks} ]; then
        echo " 4 eat!! GREAT!!! "
        exit
    else
        E=0
        B=0
        for n in {0..3}; do
            if [ ${u[$n]} = ${kotae[$n]} ]; then
                E=$((E+1))
            elif [ `echo ${ks} | grep ${u[$n]}` ]; then
                B=$((B+1))
            fi
        done
        echo "$E eat $B bite"
    fi
    if [ "$1" = "-y" ]; then
        echo " ----> try again"
    else
        echo -n "continue?[y/n]: "
        read a
    fi
done

スクリプトのダウンロードはこちらからどぞ

numeron.sh

コメント

タイトルとURLをコピーしました