![見出し画像](https://assets.st-note.com/production/uploads/images/165248620/rectangle_large_type_2_50db9ab673b998fffc500ac1f4f9226a.png?width=1200)
PowerShellでゲームを作る 蛇ゲーム
蛇ゲームを作ってみました
![](https://assets.st-note.com/img/1733836181-J2qWohVRScdba0e3MXDGCsA7.png)
蛇ゲームとは
蛇ゲーム(Snake Game)は、シンプルながら非常に中毒性のある古典的なアーケードゲームです。このゲームの基本的な目標は、画面上の蛇を操作して餌(通常はドットや食べ物)を食べさせることです。蛇が餌を食べるたびに、その長さが伸びていきます。プレイヤーは、蛇が壁や自分自身にぶつからないように注意しながら、できるだけ多くの餌を食べさせるようにします。
ルールの概要:
操作: 矢印キーを使用して蛇を上下左右に移動させます。
餌: 画面上にランダムに出現する餌を食べると、蛇の長さが伸びます。
障害物: 壁や蛇自身にぶつかるとゲームオーバーになります。
このシンプルなゲームは、古い携帯電話(特にNokia)で人気を博しました。また、さまざまなプラットフォームでプレイできる多くのバリエーションも存在します。あなたも、昔のゲームのノスタルジアを感じたいときや、ちょっとした暇つぶしに蛇ゲームを楽しんでみてはいかがでしょうか? 🐍
上の文章はAIに書いてもらいました
下が人間が作ったプログラム
WindowsのPowerShellで動きます。
# キー入力の取得ができるようにする
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Keyboard
{
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vKey);
}
"@
function snakegame() {
# 仮想キー割り当て
$VK_SPACE = 0x20 # SPACEキー
$VK_LEFT = 0x25 # 左方向キー
$VK_UP = 0x26 # 上方向キー
$VK_RIGHT = 0x27 # 右方向キー
$VK_DOWN = 0x28 # 下方向キー
# 画面
$disp0=@(
"#######################",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"#######################"
)
# 自分の位置xy
$x=3
$y=5
# 自分の移動方向増分xy
$dx=0
$dy=0
# スコア
$score=0
# しっぽ位置配列
$tail=@()
# 描画速度 小さいほど早い
$speed = 330
# 餌をセットする
function set-Esa($esacnt,$map) {
# 乱数のリセット
$rand = Get-Random -SetSeed $(Get-Date -Format "ffff")
$width = $map[0].length-1
$heigth= $map.Length-1
# エサの設置
for($i=0;$i -lt $esacnt;$i++) {
do {
$esa_x = Get-Random -Minimum 1 -Maximum $width
$esa_y = Get-Random -Minimum 1 -Maximum $heigth
} while($map[$esa_y][$esa_x] -ne " ")
$map[$esa_y]=$map[$esa_y].Remove($esa_x,1)
$map[$esa_y]=$map[$esa_y].insert($esa_x,"E")
}
# 障害物を作る
do {
$kabe_x = Get-Random -Minimum 2 -Maximum (${width}-1)
$kabe_y = Get-Random -Minimum 2 -Maximum (${heigth}-1)
} while($map[$kabe_y][$kabe_x] -ne " ")
$map[$kabe_y]=$map[$kabe_y].Remove($kabe_x,1)
$map[$kabe_y]=$map[$kabe_y].insert($kabe_x,"#")
return $map
}
# 画面のクリア
cls
# 自キャラの初期位置セット
$disp0[$y]=$disp0[$y].Remove($x,1)
$disp0[$y]=$disp0[$y].insert($x,"@")
# エサ
$disp0 = set-Esa 3 $disp0
# 画面表示
$disp0
write-host " "
write-host "キャラ説明:"
write-host "@ 自分 矢印キーで上下左右に動く"
write-host ". しっぽ エサを食べると伸びる"
write-host "E エサ"
write-host "# 壁 ぶつかると 〇ぬ"
write-host " "
write-host "矢印キーを押すとスタート"
write-host " "
# 一度GetAsyncKeyStateを呼び出してキー入力をリセットする
$dummy = [Keyboard]::GetAsyncKeyState($VK_LEFT)
$dummy = [Keyboard]::GetAsyncKeyState($VK_UP)
$dummy = [Keyboard]::GetAsyncKeyState($VK_RIGHT)
$dummy = [Keyboard]::GetAsyncKeyState($VK_DOWN)
while($True){
# キー入力のチェック
$key_left = [Keyboard]::GetAsyncKeyState($VK_LEFT)
$key_up = [Keyboard]::GetAsyncKeyState($VK_UP)
$key_right = [Keyboard]::GetAsyncKeyState($VK_RIGHT)
$key_down = [Keyboard]::GetAsyncKeyState($VK_DOWN)
if ($key_left -ne 0 -and $dx -eq 0) {
$dx=-1
$dy=0
} elseif ($key_up -ne 0 -and $dy -eq 0) {
$dx=0
$dy=-1
} elseif ($key_right -ne 0 -and $dx -eq 0) {
$dx=1
$dy=0
} elseif ($key_down -ne 0 -and $dy -eq 0) {
$dx=0
$dy=1
}
if($dx -eq 0 -and $dy -eq 0) {continue}
# 描画のために自分の位置を消す
$disp0[$y]=$disp0[$y].replace("@"," ")
# 移動先位置を計算
$mx = $x + $dx
$my = $y + $dy
if($disp0[$my][$mx] -eq "E") {
# 餌を食べた
$score+=1
# スピードを早くする
$speed-=10
# エサを追加
$disp0 = set-Esa 1 $disp0
} elseif($disp0[$my][$mx] -eq "#") {
# 壁に激突した
write-host "壁にぶつかりました"
write-host "得点は $score 点でした"
break
} elseif($disp0[$my][$mx] -eq ".") {
# しっぽに激突した
write-host "しっぽにぶつかりました"
write-host "得点は $score 点でした"
break
}
# 自分のキャラ表示
$x = $mx
$y = $my
$disp0[$y]=$disp0[$y].Remove($x,1)
$disp0[$y]=$disp0[$y].insert($x,"@")
# しっぽ表示
for($i=0;$i -lt $tail.Length;$i++) {
$tail_x,$tail_y = $tail[$i]
$disp0[$tail_y]=$disp0[$tail_y].Remove($tail_x,1)
$disp0[$tail_y]=$disp0[$tail_y].insert($tail_x,".")
}
$tail+=,@($mx,$my)
# 最後尾のしっぽを消す
if($tail.Length -ge $score+2) {
$tail_x,$tail_y = $tail[0]
$disp0[$tail_y]=$disp0[$tail_y].Remove($tail_x,1)
$disp0[$tail_y]=$disp0[$tail_y].insert($tail_x," ")
$tail = $tail[1..($score+1)]
}
# 画面再描画
cls
$disp0
$score
Start-Sleep -Milliseconds $speed
}
}
snakegame
遊び方
WindowsボタンとRキー同時に押します
出てきた画面に半角小文字でpowershellと入力してOKボタンを押します
![](https://assets.st-note.com/img/1733836100-nAJPR9dMZgzGe4I1mLbfoqCi.png?width=1200)
黒っぽい画面が出てきたら、
↑ のプログラムをコピーしてターミナルに張り付けてください
![](https://assets.st-note.com/img/1733836100-iHfU09o2OetEDXS76bu4ACFg.png?width=1200)
「強制的に貼り付け」をクリック
![](https://assets.st-note.com/img/1733836100-AnYcNB4oziuLFhSdRKXIOWgx.png?width=1200)
張り付けたら、エンターキーを押す。
これで遊べます。
2回目以降はsnakegameとコマンドを打つと遊べます。
ちょっと画面がチラチラしますが暇つぶしにどうぞ
このゲームは以前の記事「PowerShellでキーをリアルタイムに取得する」を元に作成しました。
PowerShellの参考書記事はこちら
#PowerShell #テキストゲーム #プログラミング初心者 #プログラミング学習
#レトロゲーム #蛇ゲーム #作ってみた