1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは!今回は、ちょっと変わったことに挑戦してみました。「PowerShellで何か面白いことできないかな?」と思いついたのが、このプロジェクトの始まりです。そうです、PowerShellでブロック崩しゲームを作ってみたんです!

なぜPowerShellでゲーム?

「えっ、PowerShellでゲーム?」と思った方も多いでしょう。実は私もそう思いました(笑)。普段はシステム管理やタスク自動化に使うPowerShellですが、たまには「遊び」の要素を取り入れてみるのも面白いんじゃないかと。

このプロジェクトの目的は以下の通りです:

  1. PowerShellの可能性を探る
  2. プログラミングを楽しむ
  3. 意外性のあるものを作ってみる

実用性?いえいえ、今回はそんなことは考えていません。純粋に「やってみたら面白そうだから」という理由だけです。

実装の概要

さて、具体的にどうやってブロック崩しゲームを実装したのか、簡単に説明しましょう。

  1. コンソール画面をゲームフィールドとして使用
  2. 文字でパドル、ボール、ブロックを表現
  3. 無限ループでゲームを進行
  4. キー入力で操作する

使用したPowerShellの機能:

  • System.Consoleクラス:画面描画とキー入力の検出
  • 配列操作:ゲーム状態の管理
  • ループと条件分岐:ゲームロジックの実装

image.png

上の#ガブロック
◯がボール
====を矢印で操作してボールをうちかえす

image.png

面白かったポイント

  1. 意外な表現力:文字だけでもゲームらしく見える!
  2. シンプルな実装:意外と少ないコード量で実現できた
  3. 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"

遊び方

  1. 上記のコードをbreakout.ps1として保存
  2. PowerShellを管理者権限で開く
  3. おまじない(実行ポリシーの変更):
    Set-ExecutionPolicy RemoteSigned
    
  4. ゲームスタート!:
    .\breakout.ps1
    
  5. 左右矢印キーでパドルを操作。ボールを落とさないように頑張ってください!

感想

正直、最初は「本当にできるのかな?」と不安でした。でも、実際にコードを書き始めると、どんどんアイデアが浮かんできて、気づいたら夢中になっていました。

PowerShellって、こんな使い方もできるんだ!という新鮮な驚きがありました。システム管理の強い味方が、こんな風に"遊び心"も持っていたなんて。

まとめ

このプロジェクトを通じて、プログラミングの楽しさを再確認できました。「できるかな?」と思ったことにチャレンジすると、意外な発見があるものですね。

皆さんも、普段使っている言語やツールで「ちょっと変わったこと」にチャレンジしてみてはいかがでしょうか?きっと新しい発見があるはずです。

さあ、あなたなりの「遊び」を見つけてみましょう。それが、プログラミングの新しい楽しみ方になるかもしれません。

Happy coding and happy playing!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?