ホームページ  >  記事  >  バックエンド開発  >  シェルでのテトリス_PHP チュートリアル

シェルでのテトリス_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:34:081175ブラウズ

#!/bin/bash
# テトリス ゲーム
# 2003 年 10 月 21 日 xhchen

#色の定義
cRed=1
cGreen=2
cYellow=3
cBlue=4
cFuchsia= 5
cCyan=6
cWhite=7
colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

#位置とサイズ
iLeft=3
iTop=2
((iTrayLeft = iLeft + 2) ))
((iTrayTop = iTop + 1))
((iTrayWidth = 10))
((iTrayHeight = 15))

#カラー設定
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan

#制御信号
#ゲームは 2 つのプロセスを使用します。1 つは入力の受信に使用され、もう 1 つはゲーム フローと表示インターフェイスに使用されます。
#前者が上、下、左などのキーを受信すると、後者に信号を送信することによって通知されます。
sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30

#7 つの異なるブロックの定義
#回転させることで、各ブロックをいくつかのスタイルで表示できます
box0=(0 0 0 1 1 0 1 1)
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
#ボックスのすべての定義はボックス変数に配置されます
box=( $ $ $ $ $ $)
#さまざまなブロックの回転後に可能なスタイルの数
countBox=(1 2 2 2 4 4 4)
#ボックス配列内のさまざまなブロックのオフセット
offsetBox= (0 1 3 5 7 11 15)

#速度レベルの増加ごとに蓄積する必要があるスコア
iScoreEachLevel=50 #7より大きいこと

#実行時データ
sig=0 #受信信号
iScore=0 #合計スコア
iLevel =0 #速度レベル
boxNew=() #新しい落下ボックスの位置定義
cBoxNew=0 #新しい落下ボックスの色
iBoxNewType=0 #新しい落下ボックスのタイプ
iBoxNewRotate=0 # New 落下するブロックの回転角度
boxCur=() #現在のブロックの位置定義
cBoxCur=0 #現在のブロックの色
iBoxCurType=0 #現在のブロックの種類
iBoxCurRotate=0 #回転現在のブロックの角度
boxCurX=-1 #現在のブロックのx座標位置
boxCurY=-1 #現在のブロックのy座標位置
iMap=() #背景ブロックチャート

#すべての背景ブロックを初期化します-1、ブロックがないことを意味します
for ((i = 0; i

#入力を受け取ります
function RunAsKeyReceiver()
{
ローカル pidDisplayer key aKey sig cESC sTTY

pidDisplayer=
aKey=(0 0 0)

cESC=`echo -ne ""`
cSpace=`echo -ne ""`

#ターミナルのプロパティを保存します。 read -s が端末キーを読み取ると、端末のプロパティが一時的に変更されます。
# read -s 中にプログラムが強制終了された場合、端末の混乱が生じる可能性があります。
# プログラムの終了時に端末属性を復元する必要があります。
sTTY=`stty -g`

#終了シグナルをキャプチャ
トラップ "MyExit;" INT TERM
トラップ "MyExitNoSub;" $sigExit

#カーソルを隠す
echo -ne "[?25l"


while (( 1))
do
#入力を読み取ります。注 -s はエコーせず、-n は文字を読み取った直後に戻ります
read -s -n 1 key

aKey[0]=$
aKey[1]=$
aKey[2]=$key
sig =0

#入力されたキーを確認します
if [[ $key == $cESC && $ == $cESC ]]
then
#ESC キー
MyExit
elif [[ $ == $cESC && $ == " [ " ]]
then
if [[ $key == "A" ]]; then sig=$sigRotate #<上矢印>
elif [[ $key == "B" ]]; then sig=$sigDown #<下キー>
elif [[ $key == "D" ]] then sig=$sigLeft #<左キー>
elif [[ $key == "C" ]]; #&lt; key == "S" == "]; = "a" ]]; 次に sig=$sigLeft #A, a
elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight #D, d
elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown #Spacebar
elif [[ $key == "Q" || $key == "q" ]] #Q, q
then
MyExit
fi

if [[ $sig != 0 ] ]
その後
#別のプロセスにメッセージを送信
kill -$sig $pidDisplayer
fi
完了
}

#終了前に回復
function MyExitNoSub()
{
local y

# ターミナルのプロパティを復元
stty $sTTY
((y = iTop + iTrayHeight + 4))

#カーソルを表示
echo -e "[?25h[$;0H"
exit
}


function MyExit()
{
#表示プロセスに通知する必要があるexit
キル - $ sigexit $ piddisplayer

myexitnosub
}#ディスプレイとゲームの流れを処理するメイン関数Runasdisplayer() $sigRotate;" $sigRotate
トラップ "sig=$sigLeft;" $sigLeft
トラップ "sig=$sigRight;" $sigRight
トラップ "sig=$sigDown;" $sigDown
トラップ "sig=$sigAllDown ;" $sigAllDown
トラップ "ShowExit;"

while (( 1 ))
do
#現在の速度レベル iLevel に従って、対応するループ数を設定します
for ((i = 0; i <21 - iLevel; i++ ))
do
sleep 0.02
sigThis=$sig
sig=0

# sig 変数に基づいて、対応する信号が受信されたかどうかを決定します
if ((sigThis then == sigRotate)) #Rotate
elif ( (sigThis == sigLeft)); then BoxLeft; #1 列を左に移動します
elif ((sigThis == sigRight)); then BoxRight; #(sigThis == sigAllDown); Move(y, x )、移動ブロックが (x, y) の位置に移動できるかどうかをテストします。0 が返された場合は問題ありません。1 は不可能です。
yTest=
xTest=
for (( j = 0; j < 8; j += 2))
do
((i = j + 1))
((y = $ + yTest))
(( x = $ + xTest))
if ( ( y < 0 || y >= iTrayHeight || x then
#他の既存のブロックと衝突
return 1
fi
完了
return
}


#現在移動しているブロックを後ろに置く



http://www.bkjia.com/PHPjc/508515.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/508515.html

技術記事

#!/bin/bash # テトリス ゲーム # 2003 年 10 月 21 日 xhchenxhchen@winbond.com.tw #色の定義 cRed=1 cGreen=2 cYellow=3 cBlue=4 cFuchsia=5 cCyan=6 cWhite=7 colorTable=($cRed $ c緑 $c黄色 $c...





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。