1 (17.06.2017 08:01:18 отредактировано Moritto)

Недавно научился писать на bash и у меня получилась игра.
Версия 1.0.
В будущем будет разработан исскуственный интелоект чтоб было сложно играть, а пока вот так.

+ открыть спойлер
#!/bin/bash

#Игра крестики нолики 1.0

for ((i=1;i<10;i++)); do #назначаем значения полей
pole[ # форум не пускает это i]="-"
done

print_pole() #печать поля
{
echo -e "\
${pole[1]} | ${pole[2]} | ${pole[3]}\n\
${pole[4]} | ${pole[5]} | ${pole[6]}\n\
${pole[7]} | ${pole[8]} | ${pole[9]}"
}

echo -n "За кого будете играть? (x, o): "
read GAMER
while [ "$GAMER" != "x" ] && [ "$GAMER" != "o" ]\
 && [ "$GAMER" != "х" ] && [ "$GAMER" != "о" ]; do #учитываются и русские буквы
echo "Неверный ввод!"
echo -n "За кого будете играть? (x, o): "
read GAMER
done

if [ "$GAMER" = "х" ] #переводим русские символы в английские для переменной GAMER
then GAMER=x
elif [ "$GAMER" = "о" ]
then GAMER=o
fi

if [ "$GAMER" = "x" ] #даём врагу крестик или нолик
then ENEMY=o
elif [ "$GAMER" = "o" ]
then ENEMY=x
fi

clear
print_pole

check() #проверка выигрыша
{
if [ "${pole[1]}" = "x" ] && [ "${pole[2]}" = "x" ] && [ "${pole[3]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[4]}" = "x" ] && [ "${pole[5]}" = "x" ] && [ "${pole[6]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[7]}" = "x" ] && [ "${pole[8]}" = "x" ] && [ "${pole[9]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[1]}" = "x" ] && [ "${pole[4]}" = "x" ] && [ "${pole[7]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[2]}" = "x" ] && [ "${pole[5]}" = "x" ] && [ "${pole[8]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[3]}" = "x" ] && [ "${pole[6]}" = "x" ] && [ "${pole[9]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[1]}" = "x" ] && [ "${pole[5]}" = "x" ] && [ "${pole[9]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[3]}" = "x" ] && [ "${pole[5]}" = "x" ] && [ "${pole[7]}" = "x" ]
then
if [ "$GAMER" = "x" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[1]}" = "o" ] && [ "${pole[2]}" = "o" ] && [ "${pole[3]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[4]}" = "o" ] && [ "${pole[5]}" = "o" ] && [ "${pole[6]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[7]}" = "o" ] && [ "${pole[8]}" = "o" ] && [ "${pole[9]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[1]}" = "o" ] && [ "${pole[4]}" = "o" ] && [ "${pole[7]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[2]}" = "o" ] && [ "${pole[5]}" = "o" ] && [ "${pole[8]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[3]}" = "o" ] && [ "${pole[6]}" = "o" ] && [ "${pole[9]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[1]}" = "o" ] && [ "${pole[5]}" = "o" ] && [ "${pole[9]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
if [ "${pole[3]}" = "o" ] && [ "${pole[5]}" = "o" ] && [ "${pole[7]}" = "o" ]
then
if [ "$GAMER" = "o" ]
then echo "Вы выиграли!"
else echo "Вы проиграли."
fi
exit 0
fi
}

verify() #проверка на заполненность всех ячеек
{
if [ "${pole[1]}" != "-" ] && [ "${pole[2]}" != "-" ] && [ "${pole[3]}" != "-" ]\
&& [ "${pole[4]}" != "-" ] && [ "${pole[5]}" != "-" ] && [ "${pole[6]}" != "-" ]\
&& [ "${pole[7]}" != "-" ] && [ "${pole[8]}" != "-" ] && [ "${pole[9]}" != "-" ]
then
echo "Ничья."
exit 0
fi
}

enemy_step() #шаг соперника
{
while true; do
rnd=$RANDOM #берём рандомное число
let rnd=rnd%=10 #отбираем от 0 до 9
if [ "$rnd" -eq 0 ]
then rnd=1
fi
if [ "${pole[$rnd]}" = "x" ] || [ "${pole[$rnd]}" = "o" ]
then
continue
else
pole[rnd]=$ENEMY
break
fi
done
}

while true; do
echo -n "Ваш ход (1-9): "
read STEP
if [ "${pole[$STEP]}" = "-" ] #проверка на пустую клетку
then
pole[$STEP]=$GAMER
clear
print_pole
check
verify
enemy_step
clear
print_pole
check
clear
print_pole
verify
else
echo "Здесь уже есть х/о!"
fi
done

2

Moritto, вообще-то всё что под спойлером на форуме принято писать в теге "code" (исправь сам)

Изучайте нюансы и мелочи - порой в них заключена вся суть проблемы!
Mageia 5.1х86_64 KDE; Mageia 6х86_64 Xfce [ highlight=#000][ console=inline] [ b][ color=#4f4]текст[ /color][ /b] [ /console][ /highlight]

3

algri14 пишет:

Moritto, вообще-то всё что под спойлером на форуме принято писать в теге "code" (исправь сам)

Так я при создании темы так и сделал.

4 (17.06.2017 08:03:23 отредактировано Moritto)

Обновление игры 1.1

+ открыть спойлер
#!/bin/bash

# Игра крестики нолики 1.1
# Автор: Moritto

declare -i X #переменные для результатов
declare -i O
declare -i N

if [ ! -f "$HOME/.tic-tac-toe" ]; then
 echo -e "0\n0\n0" > $HOME/.tic-tac-toe
fi

X=$(cat $HOME/.tic-tac-toe | head -1)
O=$(cat $HOME/.tic-tac-toe | head -2 | tail -1)
N=$(cat $HOME/.tic-tac-toe | head -3 | tail -1)

null()
{
for ((m=1;m<=9;m++)); do
pole[m]= -"
done
}
null

print_pole() #печать поля
{
echo -e "\
${pole[1]} | ${pole[2]} | ${pole[3]}\n\
${pole[4]} | ${pole[5]} | ${pole[6]}\n\
${pole[7]} | ${pole[8]} | ${pole[9]}"
}


enemy_step() #шаг соперника
{
while true; do
rnd=$RANDOM #берём рандомное число
let rnd=rnd%=10 #отбираем от 0 до 9
if [ "$rnd" -eq 0 ]
then rnd=1
fi
if [ "${pole[$rnd]}" = "x" ] || [ "${pole[$rnd]}" = "o" ]
then
continue
else
pole[rnd]=$ENEMY
break
fi
done
}


check() #проверка выигрыша
{
Win=0
Lose=0

for i in "1 2 3" "4 5 6" "7 8 9" "1 4 7" " 2 5 8" "3 6 9" "1 5 9" "3 5 7"; do #алгоритм заменяющий кучу строк
  p1=$(echo $i | awk '{ print $1 }')
  p2=$(echo $i | awk '{ print $2 }')
  p3=$(echo $i | awk '{ print $3 }')
  if [ "${pole[$p1]}" = "x" ] && [ "${pole[$p2]}" = "x" ] && [ "${pole[$p3]}" = "x" ]; then
    if [ "$GAMER" = "x" ]
     then Win=1; ((X++))
     else Lose=1; ((O++))
    fi
  fi
  if [ "${pole[$p1]}" = "o" ] && [ "${pole[$p2]}" = "o" ] && [ "${pole[$p3]}" = "o" ]; then
    if [ "$GAMER" = "o" ]
      then Win=1; ((O++))
      else Lose=1; ((X++))
    fi
  fi
done

if [ "$Win" -eq 1 ]; then
echo "Вы выиграли!"
end
elif [ "$Lose" -eq 1 ]; then
echo "Вы проиграли"
end
fi

if [ "${pole[1]}" != "-" ] && [ "${pole[2]}" != "-" ] && [ "${pole[3]}" != "-" ]\
&& [ "${pole[4]}" != "-" ] && [ "${pole[5]}" != "-" ] && [ "${pole[6]}" != "-" ]\
&& [ "${pole[7]}" != "-" ] && [ "${pole[8]}" != "-" ] && [ "${pole[9]}" != "-" ]
then
echo "Ничья."
((N++))
end
fi

}

game()
{
while true; do
echo -n "Ваш ход (1-9): "
read STEP
if [ "${pole[$STEP]}" = "-" ] #проверка на пустую клетку
then
pole[$STEP]=$GAMER
clear
print_pole
check
enemy_step
clear
print_pole
check
clear
print_pole
else
echo "Здесь уже есть х/о!"
fi
done
}

starts() # старт игры
{
echo -n "За кого будете играть? (x, o): "
read GAMER
while [ "$GAMER" != "x" ] && [ "$GAMER" != "o" ]\
 && [ "$GAMER" != "х" ] && [ "$GAMER" != "о" ]; do #учитываются и русские буквы
echo "Неверный ввод!"
echo -n "За кого будете играть? (x, o): "
read GAMER
done

if [ "$GAMER" = "х" ] #переводим русские символы в английские для переменной GAMER
then GAMER=x
elif [ "$GAMER" = "о" ]
then GAMER=o
fi

if [ "$GAMER" = "x" ] #даём врагу крестик или нолик
then ENEMY=o
elif [ "$GAMER" = "o" ]
then ENEMY=x
fi

clear
print_pole
game

}

results() #табло результатов
{
clear
X=$(cat $HOME/.tic-tac-toe | head -1)
O=$(cat $HOME/.tic-tac-toe | head -2 | tail -1)
N=$(cat $HOME/.tic-tac-toe | head -3 | tail -1)
echo -e "\
..........................\n\
| Выигрышей крестиком: $X |\n\
| Выигрышей ноликом:   $O |\n\
| Ничьи:               $N |\n\
''''''''''''''''""""'''''''''' "

select i in "Очистить" "В меню"; do
if [ "$i" = "Очистить" ]; then
echo -e "0\n0\n0" > $HOME/.tic-tac-toe
results
break
elif [ "$i" = "В меню" ]; then
menu
break
fi
done
}

menu() #менюшка при старте
{
  clear
  PS3="Выберите пункт: "
  select i in "Новая игра" "Результаты" "Выход"
  do
    if [ "$i" = "Новая игра" ]; then
      starts
      break
    elif [ "$i" = "Результаты" ]; then
      results
      break
    elif [ "$i" = "Выход" ]; then
      clear
      exit 0
    fi
  done
}

end() #меню конца игры
{
null
save
select i in "Ещё раз" "В меню"; do
if [ "$i" = "Ещё раз" ]; then
clear
starts
break
elif [ "$i" = "В меню" ]; then
menu
break
fi
done
}

save() #сохранение результатов
{
echo -e "$X\n$O\n$N" > $HOME/.tic-tac-toe
}

menu

Теперь гораздо лучше.

5

Moritto пишет:

Так я при создании темы так и сделал.

Moritto, у тебя сделано в теге  <console>, а по неписанному правилу на форуме, скрипты и пр. принято вставлять в тег <code>

Изучайте нюансы и мелочи - порой в них заключена вся суть проблемы!
Mageia 5.1х86_64 KDE; Mageia 6х86_64 Xfce [ highlight=#000][ console=inline] [ b][ color=#4f4]текст[ /color][ /b] [ /console][ /highlight]