Friday Fun - คว้าโอกาสกับ PowerShell
ขั้นแรกให้พลิกเหรียญ
การพลิกเหรียญถือเป็นเกมจริง/เท็จ หรือวิธีดูอีกอย่างคือ คู่/คี่ วิธีที่ฉันชอบคือใช้ตัวดำเนินการแบบโมดูโล
PS C:\> 5%2
1
PS C:\> 6%2
0
ค่าเหล่านั้นสามารถแสดงเป็นบูลีนได้
PS C:\> 5%2 -as [boolean]
True
PS C:\> 6%2 -as [boolean]
False
สิ่งที่ฉันต้องการก็แค่ตัวเลขสุ่มและดำเนินการแบบโมดูโล นี่คือฟังก์ชันที่ฉันสร้างขึ้น
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
ฉันใช้คำกริยาที่ถูกต้อง แต่จะกำหนดนามแฝงที่เป็นมิตรต่อผู้ใช้มากขึ้นด้วย
Set-Alias -Name Flip-Coin -Value Invoke-CoinToss
เนื่องจากคุณอาจต้องการเอาต์พุตหลายประเภท ไม่จำเป็นต้องเป็นแนวคิดที่ดีที่สุดสำหรับฟังก์ชัน แต่นี่อาจเป็นข้อยกเว้น และจำไว้ว่านี่ควรจะเป็นการศึกษา ไม่จำเป็นต้องนำไปปฏิบัติจริง ฟังก์ชันของฉันใช้ชุดพารามิเตอร์ และขึ้นอยู่กับชุดนั้น ตัดสินใจว่าจะเขียนผลลัพธ์ประเภทใดลงในไปป์ไลน์
และดูเหมือนว่าจะทำงานได้ดีทีเดียว
ต่อไปเรามาทอยลูกเต๋ากันดีกว่า ฉันจะใช้ Get-Random อีกครั้ง การทอยลูกเต๋าครั้งเดียวนั้นง่ายดายดังนี้:
get-random -Minimum 1 -Maximum 7
หากต้องการทอยลูกเต๋าหลายลูก คุณสามารถทำได้ดังนี้:
$Dice = 4
1..$Dice | foreach {
Get-Random -Minimum 1 -Maximum 7
}
โดยปกติแล้วฉันเขียนฟังก์ชันที่มีกระดิ่งและนกหวีดเพิ่มอีกเล็กน้อยเพราะฉันชอบของเล่นที่แวววาว
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
ฟังก์ชั่นนี้ให้คุณเลือกจำนวนลูกเต๋าที่จะทอย โปรดสังเกตว่าฉันใช้คุณลักษณะ ValidateRange เพื่อจำกัดจำนวนลูกเต๋า และในกรณีที่คุณกำลังเล่นเกม Dungeons and Dragons ซึ่งมีลูกเต๋าด้านพิเศษ ฉันก็ให้ตัวเลือกนั้นแก่คุณเช่นกัน
ในบางเกม คุณต้องมียอดรวม ดังนั้นฉันจึงเพิ่มเข้าไปด้วย สิ่งหนึ่งที่ฉันเปลี่ยนคือเทคนิคการกลิ้งของฉัน ในเวอร์ชันนี้ ฉันกำลังสร้างอาร์เรย์ของค่าที่เป็นไปได้ทั้งหมดไว้ล่วงหน้า จากนั้นจึงรับค่าสุ่มตามจำนวนที่ระบุ
$result = (1..$Sides)*$Dice | Get-Random -Count $Dice
ไม่ใช่ว่ามันสำคัญอย่างยิ่ง แต่เทคนิคนี้เร็วกว่า
$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
}
นี่คือผลลัพธ์
หากคุณกำลังถกเถียงกันระหว่างเทคนิคต่างๆ ในสคริปต์หรือฟังก์ชัน ให้ใช้ Measure-Command เพื่อดูว่าเทคนิคเหล่านั้นทำงานอย่างไร
ตอนนี้คุณมีเครื่องมือสำหรับสร้างเกม PowerShell ของคุณเองและอาจเรียนรู้สิ่งใหม่ในกระบวนการนี้ หากคุณทำเช่นนั้นฉันหวังว่าคุณจะแบ่งปัน สนุก!




