はじめに
こんにちは!今回は、ちょっと変わったことに挑戦してみました。「PowerShellで何か面白いことできないかな?」と思いついたのが、このプロジェクトの始まりです。そうです、PowerShellでブロック崩しゲームを作ってみたんです!
なぜPowerShellでゲーム?
「えっ、PowerShellでゲーム?」と思った方も多いでしょう。実は私もそう思いました(笑)。普段はシステム管理やタスク自動化に使うPowerShellですが、たまには「遊び」の要素を取り入れてみるのも面白いんじゃないかと。
このプロジェクトの目的は以下の通りです:
- PowerShellの可能性を探る
- プログラミングを楽しむ
- 意外性のあるものを作ってみる
実用性?いえいえ、今回はそんなことは考えていません。純粋に「やってみたら面白そうだから」という理由だけです。
実装の概要
さて、具体的にどうやってブロック崩しゲームを実装したのか、簡単に説明しましょう。
- コンソール画面をゲームフィールドとして使用
- 文字でパドル、ボール、ブロックを表現
- 無限ループでゲームを進行
- キー入力で操作する
使用したPowerShellの機能:
-
System.Console
クラス:画面描画とキー入力の検出 - 配列操作:ゲーム状態の管理
- ループと条件分岐:ゲームロジックの実装
上の#ガブロック
◯がボール
====を矢印で操作してボールをうちかえす
面白かったポイント
- 意外な表現力:文字だけでもゲームらしく見える!
- シンプルな実装:意外と少ないコード量で実現できた
- PowerShellの新しい一面:普段と違う使い方で新鮮
ソースコード
おまちかね、ソースコードです!
# ゲームの設定
$width = 40
$height = 20
$paddleWidth = 6
$ballChar = "O"
$paddleChar = "="
$blockChar = "#"
# ゲームの状態
$paddleX = ($width / 2) - ($paddleWidth / 2)
$ballX = $width / 2
$ballY = $height - 2
$ballDX = 1
$ballDY = -1
$blocks = @()
$score = 0
# ブロックの初期化
for ($i = 0; $i -lt 5; $i++) {
for ($j = 0; $j -lt $width; $j++) {
$blocks += @{X = $j; Y = $i}
}
}
# ゲームループ
while ($true) {
# 画面クリア
Clear-Host
# ボールの移動
$ballX += $ballDX
$ballY += $ballDY
# 壁との衝突判定
if ($ballX -le 0 -or $ballX -ge $width - 1) {
$ballDX *= -1
}
if ($ballY -le 0) {
$ballDY *= -1
}
# パドルとの衝突判定
if ($ballY -ge $height - 1) {
if ($ballX -ge $paddleX -and $ballX -lt $paddleX + $paddleWidth) {
$ballDY *= -1
} else {
break # ゲームオーバー
}
}
# ブロックとの衝突判定
$newBlocks = @()
foreach ($block in $blocks) {
if ($ballX -eq $block.X -and $ballY -eq $block.Y) {
$ballDY *= -1
$score += 10
} else {
$newBlocks += $block
}
}
$blocks = $newBlocks
# 描画
$screen = @()
for ($y = 0; $y -lt $height; $y++) {
$line = " " * $width
if ($y -eq $ballY) {
$line = $line.Remove($ballX, 1).Insert($ballX, $ballChar)
}
if ($y -eq $height - 1) {
$line = $line.Remove($paddleX, $paddleWidth).Insert($paddleX, $paddleChar * $paddleWidth)
}
foreach ($block in $blocks) {
if ($block.Y -eq $y) {
$line = $line.Remove($block.X, 1).Insert($block.X, $blockChar)
}
}
$screen += $line
}
# 画面表示
$screen | ForEach-Object { Write-Host $_ }
Write-Host "Score: $score"
# キー入力
if ([System.Console]::KeyAvailable) {
$key = [System.Console]::ReadKey($true).Key
if ($key -eq "LeftArrow" -and $paddleX -gt 0) {
$paddleX--
}
if ($key -eq "RightArrow" -and $paddleX -lt $width - $paddleWidth) {
$paddleX++
}
}
# 速度調整
Start-Sleep -Milliseconds 50
}
Write-Host "Game Over! Final Score: $score"
遊び方
- 上記のコードを
breakout.ps1
として保存 - PowerShellを管理者権限で開く
- おまじない(実行ポリシーの変更):
Set-ExecutionPolicy RemoteSigned
- ゲームスタート!:
.\breakout.ps1
- 左右矢印キーでパドルを操作。ボールを落とさないように頑張ってください!
感想
正直、最初は「本当にできるのかな?」と不安でした。でも、実際にコードを書き始めると、どんどんアイデアが浮かんできて、気づいたら夢中になっていました。
PowerShellって、こんな使い方もできるんだ!という新鮮な驚きがありました。システム管理の強い味方が、こんな風に"遊び心"も持っていたなんて。
まとめ
このプロジェクトを通じて、プログラミングの楽しさを再確認できました。「できるかな?」と思ったことにチャレンジすると、意外な発見があるものですね。
皆さんも、普段使っている言語やツールで「ちょっと変わったこと」にチャレンジしてみてはいかがでしょうか?きっと新しい発見があるはずです。
さあ、あなたなりの「遊び」を見つけてみましょう。それが、プログラミングの新しい楽しみ方になるかもしれません。
Happy coding and happy playing!