LinuxForum.Fans
Тема

Крестики нолики на bash

Автор: Moritto 5 сообщений 1551 просмотров
04.06.2017 22:19 · отредактировано #423469

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

Показать
text

#!/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

05.06.2017 21:58 #423482

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

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

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

14.06.2017 02:28 · отредактировано #423605

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

Показать
text

#!/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

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

14.06.2017 16:17 #423621
"Moritto" написал:
Так я при создании темы так и сделал.

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

Войдите или зарегистрируйтесь, чтобы ответить.