見出し画像

PowerShellでゲームを作る 蛇ゲーム

蛇ゲームを作ってみました



蛇ゲームとは

蛇ゲーム(Snake Game)は、シンプルながら非常に中毒性のある古典的なアーケードゲームです。このゲームの基本的な目標は、画面上の蛇を操作して餌(通常はドットや食べ物)を食べさせることです。蛇が餌を食べるたびに、その長さが伸びていきます。プレイヤーは、蛇が壁や自分自身にぶつからないように注意しながら、できるだけ多くの餌を食べさせるようにします。

ルールの概要:

  1. 操作: 矢印キーを使用して蛇を上下左右に移動させます。

  2. : 画面上にランダムに出現する餌を食べると、蛇の長さが伸びます。

  3. 障害物: 壁や蛇自身にぶつかるとゲームオーバーになります。

このシンプルなゲームは、古い携帯電話(特に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ボタンを押します


黒っぽい画面が出てきたら、

↑ のプログラムをコピーしてターミナルに張り付けてください


「強制的に貼り付け」をクリック


張り付けたら、エンターキーを押す。

これで遊べます。

2回目以降はsnakegameとコマンドを打つと遊べます。

ちょっと画面がチラチラしますが暇つぶしにどうぞ



このゲームは以前の記事「PowerShellでキーをリアルタイムに取得する」を元に作成しました。


PowerShellの参考書記事はこちら


#PowerShell #テキストゲーム #プログラミング初心者 #プログラミング学習
#レトロゲーム #蛇ゲーム #作ってみた


いいなと思ったら応援しよう!