Scripting Games: Advanced PowerShell — Event 10

cards

В последней задачке подразделения Advanced мы писали симулятор игры Black Jack, или по-русски «Очко»🙂 Честно говоря когда я читал задание первый раз, после того как легко расщелкал все предыдущие, я подумал — «вот и засада с пушным зверьком…»😉 Но всё оказалось куда проще чем казалось в начале🙂

SG10-BlackJack.ps1
# Создаем массив карт. [collections.arraylist]$Cards=@() # Масти. $Suits = "Spades","Hearts","Diamonds","Clubs" # Хэш-таблица значений. $Values = @{ "Ace" = 11 "King" = 10 "Queen" = 10 "Jack" = 10 "Two" = 2 "Three" = 3 "Four" = 4 "Five" = 5 "Six" = 6 "Seven" = 7 "Eight" = 8 "Nine" = 9 "Ten" = 10 } # Создаем карты и помещаем их в массив. Каждая карта - объект со свойствами # Name (например "Ace of Spades", Value (например 11) и Position (где в текущий # момент находится карта, изначально у всех Deck (колода)). foreach ($key in $Values.keys) { foreach ($Suit in $Suits) { # Создаем объект. $Card = New-Object "PSObject" # Добавляем свойства. $Card | Add-Member "NoteProperty" -Name "Name" -Value "$key of $Suit" $Card | Add-Member "NoteProperty" -Name "Value" -Value $Values[$key] $Card | Add-Member "NoteProperty" -Name "Position" -Value "Deck" # Добавляем объект к массиву. $Cards += $Card } } # Тасуем колоду. $r = New-Object random $Cards = ($Cards.count)..1|%{$r.next(0,$Cards.count)} | %{$Cards[$_]; $Cards.removeat($_)} # Раздаем первые 2 карты игроку, одну раздающему не показывая (DealerHidden) и # одну раздающему которую открываем (Dealer). $Cards[0].Position = "Player" $Cards[1].Position = "Player" $Cards[2].Position = "DealerHidden" $Cards[3].Position = "Dealer" # $n - обозначает верхнюю текущую карту в колоде. $n = 4 # Начинаем игру. while (1) { # Очищаем экран и выводим на экран карты игрока. cls Write-Host "Your cards:" $Cards | where {$_.Position -eq "Player"} | foreach {$_.name} # Считаем текущую сумму очков у игрока и показываем её. $PlayerScore = ($Cards | Where {$_.Position -eq "Player"} | Measure-Object value -Sum).sum Write-Host "Total: $PlayerScore" # Если сумма очков больше 21 то игрок проиграл, ... if ($playerScore -gt 21) { Write-Host "Over 21. Sorry, you lose." exit } # если равна 21, то выиграл,... elseif ($playerScore -eq 21) { Write-Host "21. You win!" exit } # ... а если меньше 21, то выводим карты раздающего (ту которая скрыта, не # показываем, лишь упоминаем о её наличии. Write-Host "`nDealer's cards:`n[hidden]" $Cards | where {$_.Position -eq "Dealer"} | foreach {$_.name} # Запрашиваем действие игрока. $Ans = (Read-Host "Stay (s) or hit (h) ?") if($Ans -eq "h") { # Тащим еще одну карту игроку $Cards[$n].Position = "Player" $n++ } elseif($Ans -eq "s") { # Игрок закончил, выводим его карты последний раз. cls Write-Host "Your cards:" $Cards | where {$_.Position -eq "Player"} | foreach {$_.name} # Считаем очки игрока. $PlayerScore = ($Cards|where{$_.Position -eq "Player"}| Measure-Object value -Sum).sum Write-Host "Total: $PlayerScore`n`nDealer cards:" # Выводим карты раздающего (в том числе и скрытую). $Cards|where{$_.Position -match "Dealer"}|foreach{$_.name} # Теперь раздающий тянет карты. while(1) { # Считаем очки раздающего $DealerScore = ($Cards|where{$_.Position -match "Dealer"}| Measure-Object value -Sum).sum if ($DealerScore -gt 21) { # Если больше 21 - игрок победил. Write-Host "The dealer has $DealerScore. You win!." exit } elseif ($DealerScore -ge $PlayerScore) { # Если очков столько же сколько у игрока, то искусственный разум # победил. Write-Host "The dealer has $DealerScore. Sorry, you lose." exit } # Раздающий тащит следующую карту. $Cards[$n].Position = "Dealer" # Сразу выводим её на экран. Write-Host ($Cards[$n].name) $n++ } } }

Ну и обязательно посмотрите решения Per Østergaard, и конечно MoW🙂

Это последнее задание в категории Advanced PowerShell, но еще было 10 не менее интересных задачек в Sudden Death Challenge. И их я тоже обязательно опубликую😉

Опубликовано в Learn, PowerShell, Scripting, Scripting Games. Комментарии к записи Scripting Games: Advanced PowerShell — Event 10 отключены
%d такие блоггеры, как: