118 lines
2.8 KiB
PowerShell
118 lines
2.8 KiB
PowerShell
Write-Host "Enter the board width (default 20):"
|
|
$widthInput = Read-Host
|
|
if ([string]::IsNullOrWhiteSpace($widthInput)) {
|
|
$Width = 20
|
|
}
|
|
else {
|
|
$Width = [int]$widthInput
|
|
}
|
|
|
|
Write-Host "Enter the board height (default 10):"
|
|
$heightInput = Read-Host
|
|
if ([string]::IsNullOrWhiteSpace($heightInput)) {
|
|
$Height = 10
|
|
}
|
|
else {
|
|
$Height = [int]$heightInput
|
|
}
|
|
Write-Host "Enter the number of steps (default 50):"
|
|
$stepsInput = Read-Host
|
|
if ([string]::IsNullOrWhiteSpace($stepsInput)) {
|
|
$Steps = 50
|
|
}
|
|
else {
|
|
$Steps = [int]$stepsInput
|
|
}
|
|
$board = @()
|
|
for ($r = 0; $r -lt $Height; $r++) {
|
|
$row = @()
|
|
for ($c = 0; $c -lt $Width; $c++) {
|
|
$randVal = Get-Random -Minimum 0.0 -Maximum 1.0
|
|
if ($randVal -lt 0.2) {
|
|
$row += $true
|
|
}
|
|
else {
|
|
$row += $false
|
|
}
|
|
}
|
|
$board += , $row
|
|
}
|
|
function Draw-Board {
|
|
param([object[]]$board)
|
|
Clear-Host
|
|
for ($r = 0; $r -lt $board.Count; $r++) {
|
|
$rowStr = ""
|
|
for ($c = 0; $c -lt $board[$r].Count; $c++) {
|
|
if ($board[$r][$c]) {
|
|
$rowStr += "#"
|
|
}
|
|
else {
|
|
$rowStr += "."
|
|
}
|
|
}
|
|
Write-Host $rowStr
|
|
}
|
|
}
|
|
function Get-NeighborCount {
|
|
param(
|
|
[object[]]$board,
|
|
[int]$r,
|
|
[int]$c
|
|
)
|
|
$height = $board.Count
|
|
$width = $board[0].Count
|
|
$count = 0
|
|
for ($dr = -1; $dr -le 1; $dr++) {
|
|
for ($dc = -1; $dc -le 1; $dc++) {
|
|
if ($dr -eq 0 -and $dc -eq 0) {
|
|
continue
|
|
}
|
|
$nr = $r + $dr
|
|
$nc = $c + $dc
|
|
if ($nr -ge 0 -and $nr -lt $height -and
|
|
$nc -ge 0 -and $nc -lt $width) {
|
|
if ($board[$nr][$nc]) {
|
|
$count++
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $count
|
|
}
|
|
function Next-Board {
|
|
param([object[]]$board)
|
|
$height = $board.Count
|
|
$width = $board[0].Count
|
|
$newBoard = @()
|
|
for ($r = 0; $r -lt $height; $r++) {
|
|
$newRow = @()
|
|
for ($c = 0; $c -lt $width; $c++) {
|
|
$alive = $board[$r][$c]
|
|
$neighbors = Get-NeighborCount -board $board -r $r -c $c
|
|
if ($alive) {
|
|
if ($neighbors -lt 2 -or $neighbors -gt 3) {
|
|
$newRow += $false
|
|
}
|
|
else {
|
|
$newRow += $true
|
|
}
|
|
}
|
|
else {
|
|
if ($neighbors -eq 3) {
|
|
$newRow += $true
|
|
}
|
|
else {
|
|
$newRow += $false
|
|
}
|
|
}
|
|
}
|
|
$newBoard += , $newRow
|
|
}
|
|
return $newBoard
|
|
}
|
|
for ($i = 1; $i -le $Steps; $i++) {
|
|
Draw-Board -board $board
|
|
$board = Next-Board -board $board
|
|
Start-Sleep -Milliseconds 200
|
|
}
|