Написать игру крестики-нолики 3x3 на bash

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Написать игру крестики-нолики 3x3 на bash

Сообщение olecya »

Сегодня обнаружила На соседнем форуме, нерадивый студент выложил толи приказ по общежитию, толи свое задание под одноименным заголовком:
Компьютер и игрок по очереди выбирают поля на доске 3х3, где компьютер случайным образом ставит крестики, игрок выбирает поле для нолика. Игра завершается, когда компьютер или игрок выстраивают ряд из 3 крестиков или ноликов подряд или все поля оказываются занятыми.
Я бы добавила от себя: "Игра также заканчивается с ничейным результатом если все ходы использованы."
Мне показалось задача интересной, но поощрять готовым решением не хочется в теме ТС. В последнее время крайне мало пользуюсь компьютером и решила отвлечься от мирского и поделится здесь. Возможно кто-то заинтересуется. Я уже начала писать программу. Решила не перегружать под использование мышкой, а разметить матрицу как морской бой a1-c3 используя ассоциативный массив. Тем самым ставить нолик по координатам. Выложу как допишу, присоединяйтесь со своими вариантами ну или просто комментариями по теме.
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение algri14 »

яндекс-игры — игра крестики нолики онлайн , это тому студенту передайте :D
там же и морской бой есть

зы: в морской бой довольно интересно
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение olecya »

Нашла в руководстве пример использования инструмента play из пакета sox:

Код: Выделить всё

play -n synth -j 3 sin %3 sin %-2 sin %-5 sin %-9 \
                   sin %-14 sin %-21 fade h .01 2 1.5 delay \
                   1.3 1 .76 .54 .27 remix - fade h 0 2.7 2.5 norm -1
Симпатично звучит в качестве заставки.
Добавлено (19:45):

Код: Выделить всё

#!/bin/bash
declare -A deck loose

read loose[{a..c}{1..3}] < <(echo {a..c}{1..3})

deck[_0]=' '
deck[_1]='\e[33m1\e[0m'
deck[_2]='\e[33m2\e[0m'
deck[_3]='\e[33m3\e[0m'
deck[a0]='\e[33ma\e[0m'
deck[a1]=' '
deck[a2]=' '
deck[a3]=' '
deck[b0]='\e[33mb\e[0m'
deck[b1]=' '
deck[b2]=' '
deck[b3]=' '
deck[c0]='\e[33mc\e[0m'
deck[c1]=' '
deck[c2]=' '
deck[c3]=' '

run() {
	clear
	for y in  _ {a..c}; do
		for x in {0..3}; do
			echo -en "${deck[$y$x]} "
		done
		echo
	done
}

user() {
	if [ "${deck[a1]}${deck[a2]}${deck[a3]}" = OOO ]; then
		deck[a1]='\e[1;32mO\e[0m'; deck[a2]='\e[1;32mO\e[0m'; deck[a3]='\e[1;32mO\e[0m'
	elif [ "${deck[b1]}${deck[b2]}${deck[b3]}" = OOO ]; then
		deck[b1]='\e[1;32mO\e[0m'; deck[b2]='\e[1;32mO\e[0m'; deck[b3]='\e[1;32mO\e[0m'
	elif [ "${deck[c1]}${deck[c2]}${deck[c3]}" = OOO ]; then
		deck[c1]='\e[1;32mO\e[0m'; deck[c2]='\e[1;32mO\e[0m'; deck[c3]='\e[1;32mO\e[0m'
	elif [ "${deck[a1]}${deck[b1]}${deck[c1]}" = OOO ]; then
		deck[a1]='\e[1;32mO\e[0m'; deck[b1]='\e[1;32mO\e[0m'; deck[c1]='\e[1;32mO\e[0m'
	elif [ "${deck[a2]}${deck[b2]}${deck[c2]}" = OOO ]; then
		deck[a2]='\e[1;32mO\e[0m'; deck[b2]='\e[1;32mO\e[0m'; deck[c2]='\e[1;32mO\e[0m'
	elif [ "${deck[a3]}${deck[b3]}${deck[c3]}" = OOO ]; then
		deck[a3]='\e[1;32mO\e[0m'; deck[b3]='\e[1;32mO\e[0m'; deck[c3]='\e[1;32mO\e[0m'
	elif [ "${deck[a1]}${deck[b2]}${deck[c3]}" = OOO ]; then
		deck[a1]='\e[1;32mO\e[0m'; deck[b2]='\e[1;32mO\e[0m'; deck[c3]='\e[1;32mO\e[0m'
	elif [ "${deck[c1]}${deck[b2]}${deck[a3]}" = OOO ]; then
		deck[c1]='\e[1;32mO\e[0m'; deck[b2]='\e[1;32mO\e[0m'; deck[a3]='\e[1;32mO\e[0m'
	else
		run
		return
	fi
	run
	echo 'You won!'
	play --no-show -n synth -j 3 sin %3 sin %-2 sin %-5 sin %-9 \
                   sin %-14 sin %-21 fade h .01 2 1.5 delay \
                   1.3 1 .76 .54 .27 remix - fade h 0 2.7 2.5 norm -1
	exit
}

comp() {
	if [ "${deck[a1]}${deck[a2]}${deck[a3]}" = XXX ]; then
		deck[a1]='\e[1;31mX\e[0m'; deck[a2]='\e[1;31mX\e[0m'; deck[a3]='\e[1;31mX\e[0m'
	elif [ "${deck[b1]}${deck[b2]}${deck[b3]}" = XXX ]; then
		deck[b1]='\e[1;31mX\e[0m'; deck[b2]='\e[1;31mX\e[0m'; deck[b3]='\e[1;31mX\e[0m'
	elif [ "${deck[c1]}${deck[c2]}${deck[c3]}" = XXX ]; then
		deck[c1]='\e[1;31mX\e[0m'; deck[c2]='\e[1;31mX\e[0m'; deck[c3]='\e[1;31mX\e[0m'
	elif [ "${deck[a1]}${deck[b1]}${deck[c1]}" = XXX ]; then
		deck[a1]='\e[1;31mX\e[0m'; deck[b1]='\e[1;31mX\e[0m'; deck[c1]='\e[1;31mX\e[0m'
	elif [ "${deck[a2]}${deck[b2]}${deck[c2]}" = XXX ]; then
		deck[a2]='\e[1;31mX\e[0m'; deck[b2]='\e[1;31mX\e[0m'; deck[c2]='\e[1;31mX\e[0m'
	elif [ "${deck[a3]}${deck[b3]}${deck[c3]}" = XXX ]; then
		deck[a3]='\e[1;31mX\e[0m'; deck[b3]='\e[1;31mX\e[0m'; deck[c3]='\e[1;31mX\e[0m'
	elif [ "${deck[a1]}${deck[b2]}${deck[c3]}" = XXX ]; then
		deck[a1]='\e[1;31mX\e[0m'; deck[b2]='\e[1;31mX\e[0m'; deck[c3]='\e[1;31mX\e[0m'
	elif [ "${deck[c1]}${deck[b2]}${deck[a3]}" = XXX ]; then
		deck[c1]='\e[1;31mX\e[0m'; deck[b2]='\e[1;31mX\e[0m'; deck[a3]='\e[1;31mX\e[0m'
	else
		run
		return
	fi
	run
	echo You are loser
	play --no-show -n synth 2 pluck B0
	exit
}

while :; do
	d=$(shuf -e ${loose[@]} -n1)
	deck[$d]=X
	unset loose[$d]
	comp
	echo Comp move: $d
	(( ${#loose[@]} )) || break
	while read -p 'Your turn: ' d; do
		if [[ "$d" != [a-c][1-3] ]]; then
			echo not correct
			continue
		fi
		if [[ ${deck[$d]} == [XO] ]]; then
			echo occupied
			continue
		fi
		deck[$d]=O
		unset loose[$d]
		user
		break
	done
done
echo It\'s draw
play --no-show -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \
	delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1
P.S. Добавила опцию --no-show к синтезатору play
P.P.S Убрала утилиту tput
Последний раз редактировалось olecya 31.12.2023 20:11, всего редактировалось 2 раза.
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1380
ОС: Slackware

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение UnixNoob »

olecya,
Offtopic
Вы ресурсы по типу codewars или leetcode не пробовали, для задачек?
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение igor@igor »

Что-то, мисс olecya, в игре азарта никакого нет, к сожалению.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение olecya »

igor@igor писал:
11.10.2023 22:04
в игре азарта никакого нет, к сожалению.
Мотивация была в ее написании. Поэтому она не в разделе "Игры"
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение igor@igor »

olecya писала:
11.10.2023 22:11
Мотивация была в ее написании. Поэтому она не в разделе "Игры"
Только ради "прокачки" знаний в коде?
Даже, если бы и была в разделе игры, то никакого интереса к ней...
Как "Лото" ...
...
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение olecya »

algri14 писал:
11.10.2023 18:59
в морской бой довольно интересно
Это мысль! Надо поставить в напоминалки на праздники. Может быть интересной реализация случайной расстановки кораблей, с этого кстати уже можно начинать. Два вложенных алгоритма. Один - случайные формы многопалубных кораблей и второй расстановка на поле.
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Написать игру крестики-нолики 3x3 на bash

Сообщение igor@igor »

olecya писала:
12.10.2023 09:31
Это мысль! Надо поставить в напоминалки на праздники. Может быть интересной реализация случайной расстановки кораблей, с этого кстати уже можно начинать. Два вложенных алгоритма. Один - случайные формы многопалубных кораблей и второй расстановка на поле.
Точно! Морской бой круче!
Там не как в картах азарт!
!НО..!
...
Спасибо сказали:
Ответить