Cuma Eğlencesi - PowerShell ile Şansınızı Deneyin


İlk önce paraları çeviriyoruz.

Yazı tura atmak aslında bir Doğru/Yanlış oyunudur. Veya bakmanın başka bir yolu da Çift/Tek'tir. En sevdiğim yol modulo operatörünü kullanmaktır.

PS C:\> 5%2
1
PS C:\> 6%2
0

Bu değerler Boolean olarak temsil edilebilir.

PS C:\> 5%2 -as [boolean]
True
PS C:\> 6%2 -as [boolean]
False

Yani tek ihtiyacım olan rastgele bir sayı ve bir modülo işlemi gerçekleştirmek. İşte oluşturduğum fonksiyon.

Function Invoke-CoinToss {

[cmdletbinding(DefaultParameterSetName="_AllParameterSets")]
Param(
[Parameter(ParameterSetName="Boolean")]
[switch]$AsBoolean,
[Parameter(ParameterSetName="EvenOdd")]
[switch]$EvenOdd
)

Write-Verbose "Using parameter set $($PSCmdlet.ParameterSetName)"

#get a random number between 1 and 100 to test
$i = Get-Random -Minimum 1 -Maximum 100
Write-Verbose "Random result = $i"

#use the modulo operator
if ($i%2) {
    Write-Verbose "Odd/Heads/True"
    Switch ($PSCmdlet.ParameterSetName) {
     "Boolean" { $True}
     "EvenOdd" {"Odd" }
     Default {"Heads"}
    } #switch
} #if
else {
    Write-Verbose "Even/Tails/False"
    Switch ($PSCmdlet.ParameterSetName) {
     "Boolean" { $False}
     "EvenOdd" {"Even" }
     Default {"Tails"}
    } #switch
} #else

} #end Invoke-CoinToss

Geçerli bir fiil kullandım ama aynı zamanda daha kullanıcı dostu bir takma ad da tanımlayacağım.

Set-Alias -Name Flip-Coin -Value Invoke-CoinToss

Çünkü birkaç farklı türde çıktı isteyebilirsiniz, bu bir işlev için en iyi fikir olmayabilir ancak bu bir istisna olabilir. Ve bunun mutlaka pratik değil eğitici olması gerektiğini unutmayın. Fonksiyonum parametre kümelerini kullanıyor ve kümeye bağlı olarak ardışık düzene ne tür bir sonuç yazılacağına karar veriyor.

Ve oldukça iyi çalışıyor gibi görünüyor.

Sonra biraz zar atalım. Yine Get-Random kullanacağım. Tek bir zar atmak bu kadar basittir:

get-random -Minimum 1 -Maximum 7

Birden fazla zar atmak için şunu yapabilirsiniz:

$Dice = 4
1..$Dice | foreach {
 Get-Random -Minimum 1 -Maximum 7
 }

Doğal olarak birkaç ekstra özellik içeren bir fonksiyon yazdım çünkü parlak oyuncakları severim.

Function Invoke-Dice {

[cmdletbinding()]
Param(
[ValidateRange(1,10)]
[int]$Dice = 2,
[ValidateRange(6,12)]
[int]$Sides = 6,
[Alias("Total")]
[switch]$Sum
)

Write-Verbose "Rolling $dice $sides-sided dice"

#generate a list of all possible numbers then select all random numbers at once
$result = (1..$Sides)*$Dice | Get-Random -Count $Dice

if ($sum) {
    write-Verbose "Totaling the result"
    Write-Verbose $($result -join ",")
    ($result | Measure-Object -sum).Sum
}
else {
    $result
}

} #end roll-dice

Set-Alias -name Roll-Dice -value Invoke-Dice

Bu fonksiyon atılacak zar sayısını seçmenizi sağlar. Zar sayısını sınırlamak için ValidateRange özelliğini kullandığıma dikkat edin. Ekstra kenarlı zarların olduğu bir Zindanlar ve Ejderhalar oyunu oynuyorsanız, size bu seçeneği de verdim.

Bazı oyunlarda toplama ihtiyacınız var o yüzden onu da ekledim. Değiştirdiğim şeylerden biri yuvarlanma tekniğimdi. Bu versiyonda tüm olası değerlerin bir dizisini önceden oluşturuyorum ve ardından belirtilen sayıda rastgele değer elde ediyorum.

$result = (1..$Sides)*$Dice | Get-Random -Count $Dice

Çok kritik olduğundan değil ama bu teknik daha hızlıdır.

$dice = 8
$sides = 7
 Measure-Command {
  1..$Dice | foreach {
  Get-Random -Minimum 1 -Maximum ($sides+1)
  }
 }

 Measure-Command {
  (1..$Sides)*$Dice | Get-Random -Count $Dice
 }

İşte sonuç

Bir komut dosyasındaki veya işlevdeki farklı teknikler arasında tartışıyorsanız, bunların nasıl performans gösterdiğini görmek için Measure-Command'ı kullanın.

Artık kendi PowerShell oyunlarınızı oluşturmak ve bu süreçte yeni bir şeyler öğrenmek için bazı araçlarınız var. Eğer yaparsanız umarım paylaşırsınız. Eğlence!

İlgili makaleler