经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
PowerShell开发游戏 · 打蜜蜂 - SHARP-EYE
来源:cnblogs  作者:SHARP-EYE  时间:2025/3/7 9:14:18  对本文有异议

 

    


可以看到,虽然非常抽象简单,但是基础游戏框架已经搭建,游戏机制完善,就缺美工了,哈哈~~~~

 

【首先】

Powershell不是用来开发游戏的,但是没人规定不能开发。因为它可以调取windows下的程序集,比如 .net framework。因此我们可以猜想,只要能开启一个实时刷新的窗口,就可以在窗口内绘制图形和文字。至于实时刷新的窗口如何实现,则需要调取程序集,如下:

  1. Add-Type -AssemblyName System.Drawing
  2. Add-Type -AssemblyName System.Windows.Forms

Drawing 负责绘制任务

WindowsForm负责管理窗口

然后关键的操作是,设计一个定时器,让其不断地触发,不断地让其绘制新的图形。

  1. # 定时器用于控制游戏更新,每秒触发 60 次(约 16.67 毫秒)
  2. $timer = New-Object System.Windows.Forms.Timer
  3. $timer.Interval = 16.67

 然后设计定时器触发事件

  1. $timer.Add_Tick({
  2. // ...
  3. })

在定时器触发事件中写上这句:

  1. $form.Invalidate()

即让每次触发时,让窗体重新paint一次,因此,需要定义窗体的 Paint 事件处理程序

  1. $form.Add_Paint({
  2. // ...
  3. })

剩下的就是交互动画设计基础了,三部曲 【初始化 - 更新 - 绘画】

 

【程序】

  1. # 加载必要的程序集
  2. Add-Type -AssemblyName System.Drawing
  3. Add-Type -AssemblyName System.Windows.Forms
  4. # 创建窗体
  5. $form = New-Object System.Windows.Forms.Form
  6. $form.Text = "打蜜蜂小游戏"
  7. $form.Size = New-Object System.Drawing.Size(800, 600)
  8. $form.BackColor = [System.Drawing.Color]::Black
  9. $form.StartPosition = "CenterScreen"
  10. $form.KeyPreview = $true
  11. # 启用双缓冲以减少闪烁
  12. $doubleBufferProperty = $form.GetType().GetProperty("DoubleBuffered", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
  13. $doubleBufferProperty.SetValue($form, $true, $null)
  14. # 定义飞机
  15. $planeWidth = 50
  16. $planeHeight = 30
  17. $planeX = ($form.ClientSize.Width - $planeWidth) / 2
  18. $planeY = $form.ClientSize.Height - $planeHeight - 10
  19. # 定义蜜蜂
  20. $beeSize = 40
  21. $bees = New-Object System.Collections.Generic.List[object]
  22. $beeFallSpeed = 0.5
  23. # 定义子弹
  24. $bulletSize = 5
  25. $bullets = New-Object System.Collections.Generic.List[object]
  26. $bulletSpeed = 10
  27. # 定义计分板,初始分数设为 100
  28. $score = 100
  29. $font = New-Object System.Drawing.Font("Arial", 20)
  30. $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White)
  31. # 定时器用于控制游戏更新,每秒触发 60 次(约 16.67 毫秒,设为 17 毫秒)
  32. $timer = New-Object System.Windows.Forms.Timer
  33. $timer.Interval = 17
  34. $beeSpawnCounter = 0
  35. # 重置游戏的函数
  36. function ResetGame {
  37. $script:planeX = ($form.ClientSize.Width - $planeWidth) / 2
  38. $script:bees.Clear()
  39. $script:bullets.Clear()
  40. $script:score = 100
  41. $script:beeSpawnCounter = 0
  42. }
  43. # 定时器的 Tick 事件处理程序
  44. $timer.Add_Tick({
  45. param($sender, $e)
  46. try {
  47. $script:beeSpawnCounter++
  48. Write-Host "定时器触发,当前计数: $beeSpawnCounter" # 调试信息,显示定时器触发及计数情况
  49. # 控制蜜蜂每秒生成 1 只
  50. if ($beeSpawnCounter % 60 -eq 0) { # 每秒触发 60 次,每 60 次生成 1 只蜜蜂
  51. $beeX = Get-Random -Minimum 0 -Maximum ($form.ClientSize.Width - $beeSize)
  52. $bees.Add(@{
  53. X = $beeX
  54. Y = 0
  55. })
  56. Write-Host "生成蜜蜂,X: $beeX, Y: 0" # 调试信息,显示蜜蜂生成信息
  57. }
  58. # 更新蜜蜂位置
  59. for ($i = $bees.Count - 1; $i -ge 0; $i--) {
  60. $bee = $bees[$i]
  61. $bee.Y += $beeFallSpeed
  62. if ($bee.Y -ge $form.ClientSize.Height) {
  63. $bees.RemoveAt($i)
  64. # 蜜蜂到达画面底部,扣 10 分
  65. $script:score = [Math]::Max(0, $score - 10)
  66. }
  67. }
  68. # 更新子弹位置
  69. for ($i = $bullets.Count - 1; $i -ge 0; $i--) {
  70. $bullet = $bullets[$i]
  71. $bullet.Y -= $bulletSpeed
  72. if ($bullet.Y -lt 0) {
  73. $bullets.RemoveAt($i)
  74. }
  75. }
  76. # 检查子弹是否击中蜜蜂
  77. for ($i = $bullets.Count - 1; $i -ge 0; $i--) {
  78. $bullet = $bullets[$i]
  79. for ($j = $bees.Count - 1; $j -ge 0; $j--) {
  80. $bee = $bees[$j]
  81. if ($bullet.X -lt $bee.X + $beeSize -and $bullet.X + $bulletSize -gt $bee.X -and
  82. $bullet.Y -lt $bee.Y + $beeSize -and $bullet.Y + $bulletSize -gt $bee.Y) {
  83. $bees.RemoveAt($j)
  84. $bullets.RemoveAt($i)
  85. break
  86. }
  87. }
  88. }
  89. # 检查蜜蜂是否碰撞到飞机(不做得分和消失处理)
  90. foreach ($bee in $bees) {
  91. if ($bee.Y + $beeSize -ge $planeY -and $bee.X + $beeSize -ge $planeX -and $bee.X -le $planeX + $planeWidth) {
  92. # 不做任何处理,蜜蜂继续下落
  93. }
  94. }
  95. # 检查分数是否为 0,为 0 则重置游戏
  96. if ($score -eq 0) {
  97. ResetGame
  98. }
  99. $form.Invalidate()
  100. }
  101. catch {
  102. Write-Host "定时器 Tick 事件处理出错: $_"
  103. Write-Host $_.ScriptStackTrace
  104. }
  105. })
  106. # 窗体的 MouseMove 事件处理程序,用于通过鼠标控制飞机位置
  107. $form.Add_MouseMove({
  108. param($sender, $e)
  109. $newX = $e.X - $planeWidth / 2
  110. if ($newX -ge 0 -and $newX + $planeWidth -le $form.ClientSize.Width) {
  111. $script:planeX = $newX
  112. }
  113. })
  114. # 窗体的 MouseClick 事件处理程序,用于通过鼠标点击发射子弹
  115. $form.Add_MouseClick({
  116. param($sender, $e)
  117. $bullets.Add(@{
  118. X = $planeX + $planeWidth / 2 - $bulletSize / 2
  119. Y = $planeY
  120. })
  121. })
  122. # 窗体的 Paint 事件处理程序,用于绘制游戏元素
  123. $form.Add_Paint({
  124. param($sender, $e)
  125. $graphics = $e.Graphics
  126. # 绘制飞机
  127. $graphics.FillRectangle([System.Drawing.Brushes]::Blue, $planeX, $planeY, $planeWidth, $planeHeight)
  128. # 绘制蜜蜂
  129. foreach ($bee in $bees) {
  130. $graphics.FillEllipse([System.Drawing.Brushes]::Yellow, $bee.X, $bee.Y, $beeSize, $beeSize)
  131. }
  132. # 绘制子弹
  133. foreach ($bullet in $bullets) {
  134. $graphics.FillRectangle([System.Drawing.Brushes]::Red, $bullet.X, $bullet.Y, $bulletSize, $bulletSize)
  135. }
  136. # 绘制计分板
  137. $graphics.DrawString("Score: $score", $font, $brush, 10, 10)
  138. })
  139. # 窗体关闭事件处理程序,用于清空数据缓存
  140. $form.Add_FormClosing({
  141. param($sender, $e)
  142. ResetGame
  143. Write-Host "数据缓存已清空"
  144. })
  145. # 启动定时器
  146. $timer.Start()
  147. # 显示窗体
  148. $form.ShowDialog()

PS:

注意程序健壮性,添加异常捕获,注意数据的冗余,即时清空消除。

 

【最后】

可以看到,Powershell可以开发游戏,这只是象征性尝试,我们还是关注它擅长的领域。不过,这次尝试让笔者很开心,因为即使不借助任何软件或程序开发框架也能开发应用,想想就很酷 ??!~!··· ···

原文链接:https://www.cnblogs.com/sharpeye/p/18738577

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号