#!/bin/bash
# 20110731 new with RandOperator and calculated average note
export OPERATION="$1"
export MIN_LIMIT="$2"
export MAX_LIMIT="$3"
if [ ! $XTERM_VERSION ]; then
# für Sonstige
xterm -bg skyblue2 -fg white -fn -*-*-*-r-*-*-24-*-*-*-m-*-iso8859-* -sl 1000 -e "$0 $OPERATION $MIN_LIMIT $MAX_LIMIT"
else
# für xterm
Help () {
# todo: als man-page schreiben
clear
echo -e " \033[1mNOM\033[0m
`basename $0` :
Apprendre ¿ calculer. Un jeu interactif.
\033[1mUTILISATION\033[0m
`basename $0` avec une seule option pour le type d'op¿ration
et deux arguments en chiffre r¿el pour les valeurs minimales
et maximals des chiffres ¿ calculer (default: -10 et 10).
Une fois dans le jeu, on peut afficher le resultat en appuyant
la touche \"m\" (montrer). Pour quitter, appuyer \"q\" ou \"Ctrl-C\".
\033[1mOPTIONS\033[0m
-a addition
-s substration
-m multiplication
-d division
-h aide
\033[1mEXEMPLE\033[0m
\"`basename $0` -a -12 15\" peut donner des calculations entre
minimal -12 + -12 et maximal 15 + 15 et tous qui est entre les deux."
sleep 15
exit
}
Option=$1
Min=${2:--10}
Max=${3:-10}
[[ Min -gt Max ]] && x=$Min Min=$Max Max=$x
RandOperator () {
Operators=("+" "-" "*" "/")
printf -v Rand %.0f $(date "+%N")
export Operator="${Operators[$(($Rand%${#Operators[@]}))]}"
}
# take options
case $Option in
-a ) Operator=+ ;; # for additions
-s ) Operator=- ;; # for substractions
-m ) Operator=* ;; # for multiplications
-d ) Operator=/ ;; # for divisions
-x ) Operator="RandOperator" ;; # for random operator
-h ) Help ;; # for help
* ) Help ;; # for help
esac
Calc () {
# set two random-numbers:
Number_1=$(( RANDOM % ( Max - Min + 1 ) + Min ))
Number_2=$(( RANDOM % ( Max - Min + 1 ) + Min ))
[ $Option == "-x" ] && RandOperator
# special cases - division:
if [ "$Operator" = "/" ]; then
# don't accept zero as divisor ($Number_2):
[ $Number_2 -eq 0 ] && Calc
# only outputs integers as results:
Number_1=$(( $Number_1 * $Number_2 ))
fi
# calculate
Result=$(( $Number_1 $Operator $Number_2 )) 2>/dev/null
}
questions=1
points=0
errors=0
Check () {
printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s = "\
"" "$Number_1" "$Operator" "" "$Number_2"
read Answer
# quit:
case ${Answer:-e} in
q ) echo -e "\033[0m" && exit
;;
# show result:
m ) printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s = %s\n\n"\
"" "$Number_1" "$Operator" "" "$Number_2" "$Result"
Calc # new
Check
;;
# answer correct:
$Result ) points=$(( points + 1 ))
note="$(awk -v POINTS=$points -v QUESTIONS=$questions 'BEGIN { OFMT="%.2f"; print 6/QUESTIONS*POINTS; exit}')"
#note=$(( 6000 / questions * points ))
printf "\033[32mbravo !\033[0m %s %s %s %s\n\n"\
"$questions questions," "$points points," "$errors fautes," "note: $note"
questions=$(( questions + 1 ))
Calc # new
Check
;;
# answer not correct:
* ) errors=$(( errors + 1 ))
note="$(awk -v POINTS=$points -v QUESTIONS=$questions 'BEGIN { OFMT="%.2f"; print 6/QUESTIONS*POINTS; exit}')"
#note=$(( 6000 / questions * points ))
printf "\033[31maiioh !\033[0m %s %s %s %s\n\n"\
"$questions questions," "$points points," "$errors fautes," "note: $note"
questions=$(( questions + 1 ))
# again:
Check
;;
esac
}
Calc
Check
fi