Чтение онлайн

на главную - закладки

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

then

if [ -e "$1" ] # Проверка наличия файла.

then

startfile="$1"

fi

fi

ALIVE1=.

DEAD1=_

# Представление "живых" особей и пустых ячеек в файле с "поколением 0".

# Этот сценарий работает с игровым полем 10 x 10 grid (может быть увеличено,

#+ но большое игровое поле будет обрабатываться очень медленно).

ROWS=10

COLS=10

GENERATIONS=10 # Максимальное

число поколений.

NONE_ALIVE=80 # Код завершения на случай,

#+ если не осталось ни одной "живой" особи.

TRUE=0

FALSE=1

ALIVE=0

DEAD=1

avar= # Текущее поколение.

generation=0 # Инициализация счетчика поколений.

# =================================================================

let "cells = $ROWS * $COLS"

# Количество ячеек на игровом поле.

declare -a initial # Массивы ячеек.

declare -a current

display

{

alive=0 # Количество "живых" особей.

# Изначально -- ноль.

declare -a arr

arr=( `echo "$1"` ) # Преобразовать аргумент в массив.

element_count=${#arr[*]}

local i

local rowcheck

for ((i=0; i<$element_count; i++))

do

# Символ перевода строки -- в конец каждой строки.

let "rowcheck = $i % ROWS"

if [ "$rowcheck" -eq 0 ]

then

echo # Перевод строки.

echo -n " " # Выравнивание.

fi

cell=${arr[i]}

if [ "$cell" = . ]

then

let "alive += 1"

fi

echo -n "$cell" | sed -e 's/_/ /g'

# Вывести массив, по пути заменяя символы подчеркивания на пробелы.

done

return

}

IsValid # Проверка корректности координат ячейки.

{

if [ -z "$1" -o -z "$2" ] # Проверка наличия входных аргументов.

then

return $FALSE

fi

local row

local lower_limit=0 # Запрет на отрицательные координаты.

local upper_limit

local left

local right

let "upper_limit = $ROWS * $COLS - 1" # Номер последней ячейки на игровом поле.

if [ "$1" -lt "$lower_limit" -o "$1" -gt "$upper_limit" ]

then

return $FALSE # Выход за границы массива.

fi

row=$2

let "left = $row * $ROWS" #

Левая граница.

let "right = $left + $COLS - 1" # Правая граница.

if [ "$1" -lt "$left" -o "$1" -gt "$right" ]

then

return $FALSE # Выхол за нижнюю строку.

fi

return $TRUE # Координаты корректны.

}

IsAlive # Проверка наличия "живой" особи в ячейке.

# Принимает массив и номер ячейки в качестве входных аргументов.

{

GetCount "$1" $2 # Подсчитать кол-во "живых" соседей.

local nhbd=$?

if [ "$nhbd" -eq "$BIRTH" ] # "Живая".

then

return $ALIVE

fi

if [ "$3" = "." -a "$nhbd" -eq "$SURVIVE" ]

then # "Живая" если перед этим была "живая".

return $ALIVE

fi

return $DEAD # По-умолчанию.

}

GetCount # Подсчет "живых" соседей.

# Необходимо 2 аргумента:

# $1) переменная-массив

# $2) cell номер ячейки

{

local cell_number=$2

local array

local top

local center

local bottom

local r

local row

local i

local t_top

local t_cen

local t_bot

local count=0

local ROW_NHBD=3

array=( `echo "$1"` )

let "top = $cell_number - $COLS - 1" # Номера соседних ячеек.

let "center = $cell_number - 1"

let "bottom = $cell_number + $COLS - 1"

let "r = $cell_number / $ROWS"

for ((i=0; i<$ROW_NHBD; i++)) # Просмотр слева-направо.

do

let "t_top = $top + $i"

let "t_cen = $center + $i"

let "t_bot = $bottom + $i"

let "row = $r" # Пройти по соседям в средней строке.

IsValid $t_cen $row # Координаты корректны?

if [ $?
– eq "$TRUE" ]

then

if [ ${array[$t_cen]} = "$ALIVE1" ] # "Живая"?

then # Да!

let "count += 1" # Нарастить счетчик.

fi

fi

let "row = $r - 1" # По верхней строке.

IsValid $t_top $row

if [ $?
– eq "$TRUE" ]

then

if [ ${array[$t_top]} = "$ALIVE1" ]

then

let "count += 1"

fi

fi

let "row = $r + 1" # По нижней строке.

IsValid $t_bot $row

if [ $?
– eq "$TRUE" ]

then

if [ ${array[$t_bot]} = "$ALIVE1" ]

Поделиться:
Популярные книги

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Царь Федор. Трилогия

Злотников Роман Валерьевич
Царь Федор
Фантастика:
альтернативная история
8.68
рейтинг книги
Царь Федор. Трилогия

Идеальный мир для Лекаря 5

Сапфир Олег
5. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 5

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

В теле пацана 6

Павлов Игорь Васильевич
6. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 6

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Ты предал нашу семью

Рей Полина
2. Предатели
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты предал нашу семью

Огненный князь 6

Машуков Тимур
6. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 6

Маверик

Астахов Евгений Евгеньевич
4. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Маверик

Рядовой. Назад в СССР. Книга 1

Гаусс Максим
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

В ожидании осени 1977

Арх Максим
2. Регрессор в СССР
Фантастика:
альтернативная история
7.00
рейтинг книги
В ожидании осени 1977