#!/bin/zsh tput civis stty -echo size_x=30 size_y=20 tps=6 paddle=2 spt=$((1000000000 / $tps)) last_tick=0 left_score=0 right_score=0 scramble_speed () { ball_rx=$((0.66 + $RANDOM % 6 / 6.0)) ball_ry=$((0.66 + $RANDOM % 6 / 6.0)) } reset_game () { clear ball_x=$(($size_x / 2)) ball_y=$(($size_y / 2)) ball_vx=$(($RANDOM % 2 * 2 - 1)) ball_vy=$(($RANDOM % 2 * 2 - 1)) scramble_speed left_y=$(($size_y / 2)) left_vy=0 right_y=$(($size_y / 2)) right_vy=0 } render_game () { #clear [ -z $ball_fy ] || tput cup $(($ball_fy / 2)) $ball_fx printf " " y=$((($left_y - $paddle) / 2 - 1)) [ $y -ge 0 ] && tput cup $y 0 printf " " tput cup $((($left_y + $paddle) / 2 + 1)) 0 printf " " y=$((($right_y - $paddle) / 2 - 1)) [ $y -ge 0 ] && tput cup $y $(($size_x - 1)) printf " " tput cup $((($right_y + $paddle) / 2 + 1)) $(($size_x - 1)) printf " " tput cup $(($size_y / 2)) $(($size_x / 2 - 3)) printf $left_score tput cup $(($size_y / 2)) $(($size_x / 2 + 2)) printf $right_score ball_fx=$(printf $ball_x | sed -E 's/\..*//') ball_fy=$(printf $ball_y | sed -E 's/\..*//') tput cup $(($ball_fy / 2)) $ball_fx if [[ $(($ball_y % 2)) -le 0.6 ]]; then #char="º" char="▀" #printf "º" elif [[ $(($ball_y % 1)) -le 1.3 ]]; then #char="∘" char="▪" #printf "∘" else #char="ₒ" char="▄" #printf "ₒ" fi printf $char #tput cup $size_y 0 #printf $char #tput cup 0 0 #printf " $ball_y $ball_x " for y in {-$paddle..$paddle}; do tput cup $((($left_y - $y) / 2)) 0 printf "▌" tput cup $((($right_y - $y) / 2)) $(($size_x - 1)) printf "▐" done } reset_game render_game while true; do key="" read -t 0.1 -k 1 key if [ "$key" != "" ]; then if [ "$key" = "w" ]; then; left_vy=-2 elif [ "$key" = "s" ]; then; left_vy=2 elif [ "$key" = "k" ]; then; right_vy=-2 elif [ "$key" = "j" ]; then; right_vy=2 fi fi tick=$(($(date +%N) / $spt)) if [ $tick != $last_tick ]; then last_tick=$tick ball_x=$(($ball_x + $ball_vx * $ball_rx)) ball_y=$(($ball_y + $ball_vy * $ball_ry)) left_y=$(($left_y + $left_vy)) right_y=$(($right_y + $right_vy)) left_vy=0 right_vy=0 if [[ $ball_y -lt 0 ]]; then; ball_vy=1; ball_y=0; fi if [[ $ball_y -gt $(($size_y - 1)) ]]; then; ball_vy=-1; ball_y=$(($size_y - 1)); fi if [[ $left_y -lt $paddle ]]; then; left_y=$paddle; fi if [[ $left_y -ge $(($size_y - $paddle - 1)) ]]; then; left_y=$(($size_y - $paddle - 1)); fi if [[ $right_y -lt $paddle ]]; then; right_y=$paddle; fi if [[ $right_y -ge $(($size_y - $paddle - 1)) ]]; then; right_y=$(($size_y - $paddle - 1)); fi if [[ $ball_x -le 2 ]] then if [[ $ball_y -ge $(($left_y - $paddle - 1)) ]] && [[ $ball_y -le $(($left_y + $paddle + 1)) ]]; then ball_vx=1 scramble_speed else right_score=$(($right_score + 1)) reset_game fi fi if [[ $ball_x -ge $(($size_x - 2)) ]]; then if [[ $ball_y -ge $(($right_y - $paddle - 1)) ]] && [[ $ball_y -le $(($right_y + $paddle + 1)) ]]; then ball_vx=-1 scramble_speed else left_score=$(($right_score + 1)) reset_game fi fi render_game fi done