Advertisement
lewapkon

Untitled

Jun 5th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.99 KB | None | 0 0
  1. #!/bin/bash -x
  2.  
  3. # bash game.sh [-n n] [-k k] [-s s] [-p1 x1,y1] [-p2 x2,y2] [-ai1 ai1] [-ai2 ai2]
  4. #n – wielkość planszy (domyślnie 10);
  5. #k – maksymalna liczba tur na gracza (domyślnie 100);
  6. #s – czas w sekundach, przez który skrypt ma poczekać pomiędzy wiadomością END_TURN, a rozpoczęciem tury kolejnego gracza, aby interfejs graficzny nadążył z wyświetlaniem animacji (domyślnie 1);
  7. #x1,y1 – początkowa pozycja króla pierwszego gracza (jeśli nie zostanie podana, to będzie wybrana losowo);
  8. #x2,y2 – początkowa pozycja króla drugiego gracza (jeśli nie zostanie podana, to będzie wybrana losowo);
  9. #ai1 – ścieżka do programu AI pierwszego gracza (jeśli nie zostanie podana, to przyjmuje się, że będzie nim człowiek);
  10. #ai2 – ścieżka do programu AI drugiego gracza (jeśli nie zostanie podana, to przyjmuje się, że będzie nim człowiek).
  11.  
  12. # Initialize our own variables:
  13. board_size=10
  14. turns=100
  15. wait_time=1
  16. hum1=false
  17. hum2=false
  18. gui=./sredniowiecze_gui_with_libs.sh
  19. #gui=../check_middle2/tests2/sredniowiecze_gui_with_libs.sh
  20.  
  21. function is_num () {
  22.     if [[ $1 =~ ^-?[0-9]+$ ]]; then
  23.         return 0
  24.     else
  25.         return 1
  26.     fi
  27. }
  28.  
  29. while [[ $# > 1 ]]
  30. do
  31. key="$1"
  32.  
  33. case ${key} in
  34.     -n)
  35.         if ! is_num $2; then
  36.             exit 1
  37.         fi
  38.         board_size=$2
  39.         shift
  40.     ;;
  41.     -k)
  42.         if ! is_num $2; then
  43.             exit 1
  44.         fi
  45.         turns=$2
  46.         shift
  47.     ;;
  48.     -s)
  49.         if ! is_num $2; then
  50.             exit 1
  51.         fi
  52.         wait_time=$2
  53.         shift
  54.     ;;
  55.     -p1)
  56.         pos1="$2"
  57.         shift
  58.     ;;
  59.     -p2)
  60.         pos2="$2"
  61.         shift
  62.     ;;
  63.     -ai1)
  64.         ai1="$2"
  65.         shift
  66.     ;;
  67.     -ai2)
  68.         ai2="$2"
  69.         shift
  70.     ;;
  71.     *)
  72.         exit 1
  73.     ;;
  74. esac
  75. shift
  76. done
  77.  
  78. #echo board_size = "${board_size}"
  79. #echo turns = "${turns}"
  80. #echo wait_time = "${wait_time}"
  81. #echo pos1 = "${pos1}"
  82. #echo pos2 = "${pos2}"
  83. #echo ai1 = "${ai1}"
  84. #echo ai2 = "${ai2}"
  85.  
  86. function abs () {
  87.     echo ${1#-}
  88. }
  89.  
  90. function max () {
  91.     echo $(( $1 > $2 ? $1 : $2 ))
  92. }
  93.  
  94. function distance () {
  95.     local x=$(abs $(( p1x - p2x )))
  96.     local y=$(abs $(( p1y - p2y )))
  97.     echo $(max x y)
  98. }
  99.  
  100. function random () {
  101.     echo $(shuf -i 1-$1 -n 1)
  102. }
  103.  
  104. function can_place () {
  105.     local x=$1
  106.     local y=$2
  107.     if [[ ($(( x - 8 )) -ge 1 || $(( x + 11 )) -le ${board_size}) && ($(( y - 8 )) -ge 1 || $(( y + 8 )) -le ${board_size}) ]]; then
  108.         return 0
  109.     else
  110.         return 1
  111.     fi
  112. }
  113.  
  114. function out_board () {
  115.     if [[ $1 -lt 1 || $1 -gt $((board_size - 3)) || $2 -lt 1 || $2 -gt ${board_size} ]]; then
  116.         return 0
  117.     else
  118.         return 1
  119.     fi
  120. }
  121.  
  122. if [[ ${board_size} -le 8 ]]; then
  123.     exit 1
  124. fi
  125.  
  126. if [[ -z ${pos1+x} ]]; then
  127.     if [[ -z ${pos2+x} ]]; then
  128. #        echo "both unset"
  129.         p1x=$(random $((board_size - 3)))
  130.         p1y=1
  131.         p2x=$(random $((board_size - 3)))
  132.         p2y=${board_size}
  133.     else
  134. #        echo "first unset"
  135.         IFS=\, read -a fields <<<"$pos2"
  136.         p2x=${fields[0]}
  137.         p2y=${fields[1]}
  138.         if can_place ${p2x} ${p2y}; then
  139.             while : ; do
  140.                 p1x=$(random $((board_size - 3)))
  141.                 p1y=$(random ${board_size})
  142.                 [[ $(distance) -lt 8 ]] || break
  143.             done
  144.         else
  145.             exit 1
  146.         fi
  147.     fi
  148. else
  149.     if [[ -z ${pos2+x} ]]; then
  150. #        echo "second unset"
  151.         IFS=\, read -a fields <<<"$pos1"
  152.         p1x=${fields[0]}
  153.         p1y=${fields[1]}
  154.         if can_place ${p1x} ${p1y}; then
  155.             while : ; do
  156.                 p2x=$(random $((board_size - 3)))
  157.                 p2y=$(random ${board_size})
  158.                 [[ $(distance) -lt 8 ]] || break
  159.             done
  160.         else
  161.             exit 1
  162.         fi
  163.     else
  164. #        echo "both set"
  165.         IFS=\, read -a fields <<<"$pos1"
  166.         p1x=${fields[0]}
  167.         p1y=${fields[1]}
  168.         IFS=\, read -a fields <<<"$pos2"
  169.         p2x=${fields[0]}
  170.         p2y=${fields[1]}
  171.         if [[ $(distance) -lt 8 ]]; then
  172.             exit 1
  173.         fi
  174.     fi
  175. fi
  176.  
  177. if [[ -z ${p1x} || -z ${p1y} || -z ${p2x} || -z ${p2y} ]]; then
  178.     exit 1
  179. fi
  180.  
  181. if out_board ${p1x} ${p1y} || out_board ${p2x} ${p2y}; then
  182.     exit 1
  183. fi
  184.  
  185. #echo p1 = "${p1x}, ${p1y}"
  186. #echo p2 = "${p2x}, ${p2y}"
  187.  
  188. if [[ -z ${ai1+x} ]]; then
  189.     hum1=true
  190. else
  191.     if [[ ! -x ${ai1} ]]; then
  192.         exit 1
  193.     fi
  194. fi
  195.  
  196. if [[ -z ${ai2+x} ]]; then
  197.     hum2=true
  198. else
  199.     if [[ ! -x ${ai2} ]]; then
  200.         exit 1
  201.     fi
  202. fi
  203.  
  204.  
  205. player1=true
  206.  
  207. if ${hum1} && ${hum2}; then
  208.     PIPE=$(mktemp -u)
  209.     mkfifo ${PIPE}
  210.     exec 3<>${PIPE}
  211.     rm ${PIPE}
  212.  
  213.     ${gui} -human1 -human2 <&3 >/dev/null & # >&4
  214.     gui_pid=$!
  215.     echo "INIT ${board_size} ${turns} 1 ${p1x} ${p1y} ${p2x} ${p2y}" >&3
  216.     echo "INIT ${board_size} ${turns} 2 ${p1x} ${p1y} ${p2x} ${p2y}" >&3
  217.  
  218.     wait ${gui_pid}
  219. elif ${hum1}; then
  220.     PIPE=$(mktemp -u)
  221.     mkfifo ${PIPE}
  222.     exec 3<>${PIPE}
  223.     rm ${PIPE}
  224.     PIPE=$(mktemp -u)
  225.     mkfifo ${PIPE}
  226.     exec 4<>${PIPE}
  227.     rm ${PIPE}
  228.     PIPE=$(mktemp -u)
  229.     mkfifo ${PIPE}
  230.     exec 5<>${PIPE}
  231.     rm ${PIPE}
  232.     PIPE=$(mktemp -u)
  233.     mkfifo ${PIPE}
  234.     exec 6<>${PIPE}
  235.     rm ${PIPE}
  236.  
  237.     ${gui} -human1 <&3 >&5 &
  238.     gui_pid=$!
  239.     ${ai2} <&4 >&6 &
  240.     ai_pid=$!
  241.  
  242.     echo "INIT ${board_size} ${turns} 1 ${p1x} ${p1y} ${p2x} ${p2y}" >&3
  243.     echo "INIT ${board_size} ${turns} 2 ${p1x} ${p1y} ${p2x} ${p2y}" >&4
  244.  
  245.     {
  246.         while : ; do
  247.             if ${player1}; then
  248.                 read msg <&5
  249.                 if [[ "$msg" == "END_TURN" ]]; then
  250.                     player1=false
  251.                 fi
  252.                 echo "$msg" >&4
  253.             else
  254.                 read msg <&6
  255.                 if [[ "$msg" == "END_TURN" ]]; then
  256.                     player1=true
  257.                 fi
  258.                 echo "$msg" >&3
  259.             fi
  260.         done
  261.     } &
  262.     loop_pid=$!
  263.  
  264.     wait ${ai_pid}
  265.     return_code=$?
  266.     kill -KILL ${loop_pid}
  267.     if [[ ${return_code} -ne 0 && ${return_code} -ne 1 && ${return_code} -ne 2 ]]; then
  268.         exit 1
  269.     fi
  270. #    wait ${gui_pid}
  271. #    if [[ $? -ne 0 ]]; then
  272. #        exit 1
  273. #    fi
  274. elif ${hum2}; then
  275.     exit 1
  276. else
  277.     PIPE=$(mktemp -u)
  278.     mkfifo ${PIPE}
  279.     exec 3<>${PIPE}
  280.     rm ${PIPE}
  281.     PIPE=$(mktemp -u)
  282.     mkfifo ${PIPE}
  283.     exec 4<>${PIPE}
  284.     rm ${PIPE}
  285.     PIPE=$(mktemp -u)
  286.     mkfifo ${PIPE}
  287.     exec 5<>${PIPE}
  288.     rm ${PIPE}
  289.     PIPE=$(mktemp -u)
  290.     mkfifo ${PIPE}
  291.     exec 6<>${PIPE}
  292.     rm ${PIPE}
  293.     PIPE=$(mktemp -u)
  294.     mkfifo ${PIPE}
  295.     exec 7<>${PIPE}
  296.     rm ${PIPE}
  297.     PIPE=$(mktemp -u)
  298.     mkfifo ${PIPE}
  299.     exec 8<>${PIPE}
  300.     rm ${PIPE}
  301.  
  302.     ${ai1} <&3 >&6 &
  303.     ai1_pid=$!
  304.     ${ai2} <&4 >&7 &
  305.     ai2_pid=$!
  306.     ${gui} <&5 >&8 &
  307.     gui_pid=$!
  308.  
  309.     echo "INIT ${board_size} ${turns} 1 ${p1x} ${p1y} ${p2x} ${p2y}" >&3 >&4 >&5
  310.     echo "INIT ${board_size} ${turns} 2 ${p1x} ${p1y} ${p2x} ${p2y}" >&3 >&4 >&5
  311.  
  312.     while : ; do
  313.         if ${player1}; then
  314.             if kill -0 ${ai1_pid}; then
  315.                 read msg <&7
  316.                 if [[ "$msg" == "END_TURN" ]]; then
  317.                     player1=false
  318.                 fi
  319.                 echo "$msg" >&4
  320.                 echo "$msg" >&5
  321.             else
  322. #                pkill -TERM -P ${ai_pid}
  323.                 break
  324.             fi
  325.         else
  326.             if kill -0 ${ai2_pid}; then
  327.                 read msg <&5
  328.                 if [[ "$msg" == "END_TURN" ]]; then
  329.                     player1=true
  330.                 fi
  331.                 echo "$msg" >&3
  332.                 echo "$msg" >&5
  333.             else
  334.                 break
  335.             fi
  336.         fi
  337.     done
  338.  
  339.     wait ${ai1_pid}
  340.     return_code=$?
  341.     if [[ ${return_code} -ne 0 && ${return_code} -ne 1 && ${return_code} -ne 2 ]]; then
  342.         exit 1
  343.     fi
  344.     wait ${ai2_pid}
  345.     return_code=$?
  346.     if [[ ${return_code} -ne 0 && ${return_code} -ne 1 && ${return_code} -ne 2 ]]; then
  347.         exit 1
  348.     fi
  349. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement