- ベストアンサー
シェルスクリプトbashについての質問
- シェルスクリプトbashについての質問です
- シェルスクリプトbashに関するクイズプログラムの要件について教えてください
- 要件として、クイズプログラムのトップ画面での選択肢やクイズの開始方法、問題の表示方法などがあります
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
# 必要なくなった質問は閉じたほうが良いです。 ちょっと見づらいソースでですが、最低限の機能は実装してみました。 ファイル ploblem は問題・解答が交互に、1行ずつになってるものを 想定しています。誤答をどう記述するか質問になかったので、適当に 正答から、生成するようにしました。誤答を作るには創造力が必要なので、 ご自分で直す場合は generate_miss(), right, 配列miss を手直しすれば良いでしょう。補足でコメントしてくれても良いです。 トップ画面のクイズ正解率というのは、ちょっと意味がわからなかったので 実装していません。 ソース冒頭にある3つの大文字グローバル変数は、それぞれ、 PROBLEMS_PATH: 問題ファイルへのパス ALL: 出題する問題数 THRESHOLD: 間違えたら終了になる不正解の数 problem: 問題1 kotae1kotae1 問題2 kotae2 問題3 answer3 問題4 mondaino_kotae4 問題5 tabun_seikai5 問題6 korega_kaitou6 問題7 koreshikanai7 問題8 atteruhazu8 問題9 saigo_no_mondai9 quize.bash: #!/bin/bash -ex typeset -g PROBLEMS_PATH='./problems' ALL=5 THRESHOLD=3 typeset -ag problems answers miss usage(){ echo 'this is a game. choose 1, 2 or 3...'; } puts_selection(){ typeset -a a=($@);for((i=0;i<${#a[@]};i++));do echo "$((i+1)). ${a[i]}";done; } puts_head(){ echo -n '---- '; } puts_rate(){ typeset -i pass=$1 give=$2;if [[ $give -eq 0 ]];then rate=0 else rate=$((100*pass/give));fi;puts_head echo "rate ${rate}% / pass ${pass} / give ${give}"; } puts_number(){ puts_head;echo "problem $1"; } puts_newline(){ echo ''; } puts_result(){ puts_newline;echo $@; } puts_missed(){ puts_result 'miss...'; } puts_passed(){ puts_result 'win!!!'; } puts_prompt(){ echo -n $@ '';} hit_any_key(){ puts_newline;echo 'hit any key';read -n1; } clear_screen(){ tput clear; } accept(){ while true;do read -n1;case ${REPLY} in($1)return 0;;(*)return 1;; esac;done; } read_problem(){ typeset -a line=($(cat ${PROBLEMS_PATH})) typeset -a choice=($(shuf -i 0-$((${#line[@]}/2-1))|head -n ${ALL})) i=0;for j in ${choice[@]};do problems[i]=${line[((j*2))]} answers[((i++))]=${line[((j*2+1))]};done; } generate_miss(){ typeset -a c=($(echo $1|sed 's/\(.\)/\1 /g')) if [[ ${#c[@]} -ge 9 ]];then max=9;else max=${#c[@]};fi;miss=('dummy') for((i=1;i<max;i++));do miss[i]=$(shuf -e ${c[@]}|tr -d "\n");done typeset -i right=$((RANDOM*(max-1)/32767));miss[0]=${miss[((right))]} miss[right]=$1;return $((++right)); } study(){ read_problem;for((pass=0,give=0;give<ALL;give++));do clear_screen puts_rate ${pass} ${give};puts_number $((give+1));echo ${problems[give]} generate_miss ${answers[give]};right=$?;puts_selection ${miss[@]} puts_prompt 'choice?';if accept ${right};then puts_passed;hit_any_key ((pass++));elif [[ $((give-pass+1)) -ge ${THRESHOLD} ]];then puts_missed return 1;else puts_missed;hit_any_key;fi;done;puts_rate ${pass} ${give} return 0; } title(){ clear_screen;puts_selection 'start' 'about' 'exit' puts_prompt 'number?';while true;do read -n1;case ${REPLY} in(1)if study; then puts_result 'YOU WIN';exit 0;else puts_result 'GAME OVER';exit 1;fi;; (2)clear_screen;usage;hit_any_key;title;;(3)puts_result 'BYE BYE';exit 0;; (*)title;;esac;done; } title