ค้นหาเว็บไซต์

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 ของคุณเองและอาจเรียนรู้สิ่งใหม่ในกระบวนการนี้ หากคุณทำเช่นนั้นฉันหวังว่าคุณจะแบ่งปัน สนุก!

บทความที่เกี่ยวข้อง