有没有俄罗斯方块自动下落脚本?

查看:7161|回复:32
(33.13 KB)
要是自己也能写出这样的程序那该多好呀~~~复制内容到剪贴板代码: #!/bin/bash
# Tetris Game
# 10.21.2003 xhchen&[email].tw[/email]&
#APP declaration
APP_NAME=&${0##*[\\/]}&
APP_VERSION=&1.0&
cFuchsia=5
colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)
#位置和大小
((iTrayLeft = iLeft + 2))
((iTrayTop = iTop + 1))
((iTrayWidth = 10))
((iTrayHeight = 15))
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan
#改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30
#七中不同的方块的定义
#通过旋转,每种方块的显示的样式可能有几种
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变量中
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
#各种方块旋转后可能的样式数目
countBox=(1 2 2 2 4 4 4)
#各种方块再box数组中的偏移
offsetBox=(0 1 3 5 7 11 15)
#每提高一个速度级需要积累的分数
iScoreEachLevel=50& & & & #be greater than 7
#运行时数据
sig=0& & & & & & & & #接收到的signal
iScore=0& & & & #总分
iLevel=0& & & & #速度级
boxNew=()& & & & #新下落的方块的位置定义
cBoxNew=0& & & & #新下落的方块的颜色
iBoxNewType=0& & & & #新下落的方块的种类
iBoxNewRotate=0& & & & #新下落的方块的旋转角度
boxCur=()& & & & #当前方块的位置定义
cBoxCur=0& & & & #当前方块的颜色
iBoxCurType=0& & & & #当前方块的种类
iBoxCurRotate=0& & & & #当前方块的旋转角度
boxCurX=-1& & & & #当前方块的x坐标位置
boxCurY=-1& & & & #当前方块的y坐标位置
iMap=()& & & & & & & & #背景方块图表
#初始化所有背景方块为-1, 表示没有方块
for ((i = 0; i & iTrayHeight * iTrayW i++)); do iMap[$i]=-1; done
#接收输入的进程的主函数
function RunAsKeyReceiver()
& & & & local pidDisplayer key aKey sig cESC sTTY
& & & & pidDisplayer=$1
& & & & aKey=(0 0 0)
& & & & cESC=`echo -ne &\033&`
& & & & cSpace=`echo -ne &\040&`
& & & & #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
& & & & #如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
& & & & #需要在程序退出时恢复终端属性。
& & & & sTTY=`stty -g`
& & & & #捕捉退出信号
& & & & trap &MyE& INT TERM
& & & & trap &MyExitNoS& $sigExit
& & & & #隐藏光标
& & & & echo -ne &\033[?25l&
& & & & while :
& & & & do
& & & & & & & & #读取输入。注-s不回显,-n读到一个字符立即返回
& & & & & & & & read -s -n 1 key
& & & & & & & & aKey[0]=${aKey[1]}
& & & & & & & & aKey[1]=${aKey[2]}
& & & & & & & & aKey[2]=$key
& & & & & & & & sig=0
& & & & & & & & #判断输入了何种键
& & & & & & & & if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
& & & & & & & & then
& & & & & & & & & & & & #ESC键
& & & & & & & & & & & & MyExit
& & & & & & & & elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == &[& ]]
& & & & & & & & then
& & & & & & & & & & & & if [[ $key == &A& ]]; then sig=$sigRotate& & & & #&向上键&
& & & & & & & & & & & & elif [[ $key == &B& ]]; then sig=$sigDown& & & & #&向下键&
& & & & & & & & & & & & elif [[ $key == &D& ]]; then sig=$sigLeft& & & & #&向左键&
& & & & & & & & & & & & elif [[ $key == &C& ]]; then sig=$sigRight& & & & #&向右键&
& & & & & & & & & & & & fi
& & & & & & & & elif [[ $key == &W& || $key == &w& ]]; then sig=$sigRotate& & & & #W, w
& & & & & & & & elif [[ $key == &S& || $key == &s& ]]; then sig=$sigDown& & & & #S, s
& & & & & & & & elif [[ $key == &A& || $key == &a& ]]; then sig=$sigLeft& & & & #A, a
& & & & & & & & elif [[ $key == &D& || $key == &d& ]]; then sig=$sigRight& & & & #D, d
& & & & & & & & elif [[ &[$key]& == &[]& ]]; then sig=$sigAllDown& & & & #空格键
& & & & & & & & elif [[ $key == &Q& || $key == &q& ]]& & & & & & & & & & & & #Q, q
& & & & & & & & then
& & & & & & & & & & & & MyExit
& & & & & & & & fi
& & & & & & & & if [[ $sig != 0 ]]
& & & & & & & & then
& & & & & & & & & & & & #向另一进程发送消息
& & & & & & & & & & & & kill -$sig $pidDisplayer
& & & & & & & & fi
& & & & done
#退出前的恢复
function MyExitNoSub()
& & & & local y
& & & & #恢复终端属性
& & & & stty $sTTY
& & & & ((y = iTop + iTrayHeight + 4))
& & & & #显示光标
& & & & echo -e &\033[?25h\033[${y};0H&
& & & & exit
function MyExit()
& & & & #通知显示进程需要退出
& & & & kill -$sigExit $pidDisplayer
& & & & MyExitNoSub
#处理显示和游戏流程的主函数
function RunAsDisplayer()
& & & & local sigThis
& & & & InitDraw
& & & & #挂载各种信号的处理函数
& & & & trap &sig=$sigR& $sigRotate
& & & & trap &sig=$sigL& $sigLeft
& & & & trap &sig=$sigR& $sigRight
& & & & trap &sig=$sigD& $sigDown
& & & & trap &sig=$sigAllD& $sigAllDown
& & & & trap &ShowE& $sigExit
& & & & while :
& & & & do
& & & & & & & & #根据当前的速度级iLevel不同,设定相应的循环的次数
& & & & & & & & for ((i = 0; i & 21 - iL i++))
& & & & & & & & do
& & & & & & & & & & & & sleep 0.02
& & & & & & & & & & & & sigThis=$sig
& & & & & & & & & & & & sig=0
& & & & & & & & & & & & #根据sig变量判断是否接受到相应的信号
& & & & & & & & & & & & if ((sigThis == sigRotate)); then BoxR& & & & #旋转
& & & & & & & & & & & & elif ((sigThis == sigLeft)); then BoxL& & & & #左移一列
& & & & & & & & & & & & elif ((sigThis == sigRight)); then BoxR& & & & #右移一列
& & & & & & & & & & & & elif ((sigThis == sigDown)); then BoxD& & & & #下落一行
& & & & & & & & & & & & elif ((sigThis == sigAllDown)); then BoxAllD& & & & #下落到底
& & & & & & & & & & & & fi
& & & & & & & & done
& & & & & & & & #kill -$sigDown $$
& & & & & & & & BoxDown& & & & #下落一行
& & & & done
#BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以
function BoxMove()
& & & & local j i x y xTest yTest
& & & & yTest=$1
& & & & xTest=$2
& & & & for ((j = 0; j & 8; j += 2))
& & & & do
& & & & & & & & ((i = j + 1))
& & & & & & & & ((y = ${boxCur[$j]} + yTest))
& & & & & & & & ((x = ${boxCur[$i]} + xTest))
& & & & & & & & if (( y & 0 || y &= iTrayHeight || x & 0 || x &= iTrayWidth))
& & & & & & & & then
& & & & & & & & & & & & #撞到墙壁了
& & & & & & & & & & & & return 1
& & & & & & & & fi
& & & & & & & & if ((${iMap[y * iTrayWidth + x]} != -1 ))
& & & & & & & & then
& & & & & & & & & & & & #撞到其他已经存在的方块了
& & & & & & & & & & & & return 1
& & & & & & & & fi
& & & & done
& & & & return 0;
#将当前移动中的方块放到背景方块中去,
#并计算新的分数和速度级。(即一次方块落到底部)
function Box2Map()
& & & & local j i x y xp yp line
& & & & #将当前移动中的方块放到背景方块中去
& & & & for ((j = 0; j & 8; j += 2))
& & & & do
& & & & & & & & ((i = j + 1))
& & & & & & & & ((y = ${boxCur[$j]} + boxCurY))
& & & & & & & & ((x = ${boxCur[$i]} + boxCurX))
& & & & & & & & ((i = y * iTrayWidth + x))
& & & & & & & & iMap[$i]=$cBoxCur
& & & & done
& & & & #消去可被消去的行
& & & & line=0
& & & & for ((j = 0; j & iTrayWidth * iTrayH j += iTrayWidth))
& & & & do
& & & & & & & & for ((i = j + iTrayWidth - 1; i &= i--))
& & & & & & & & do
& & & & & & & & & & & & if ((${iMap[$i]} == -1)); fi
& & & & & & & & done
& & & & & & & & if ((i &= j)); fi
& & & & & & & & ((line++))
& & & & & & & & for ((i = j - 1; i &= 0; i--))
& & & & & & & & do
& & & & & & & & & & & & ((x = i + iTrayWidth))
& & & & & & & & & & & & iMap[$x]=${iMap[$i]}
& & & & & & & & done
& & & & & & & & for ((i = 0; i & iTrayW i++))
& & & & & & & & do
& & & & & & & & & & & & iMap[$i]=-1
& & & & & & & & done
& & & & done
& & & & if ((line == 0)); fi
& & & & #根据消去的行数line计算分数和速度级
& & & & ((x = iLeft + iTrayWidth * 2 + 7))
& & & & ((y = iTop + 11))
& & & & ((iScore += line * 2 - 1))
& & & & #显示新的分数
& & & & echo -ne &\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}& && && &&
& & & & if ((iScore % iScoreEachLevel & line * 2 - 1))
& & & & then
& & & & & & & & if ((iLevel & 20))
& & & & & & & & then
& & & & & & & & & & & & ((iLevel++))
& & & & & & & & & & & & ((y = iTop + 14))
& & & & & & & & & & & & #显示新的速度级
& & & & & & & & & & & & echo -ne &\033[3${cScoreValue}m\033[${y};${x}H${iLevel}& && &&&&
& & & & & & & & fi
& & & & fi
& & & & echo -ne &\033[0m&
& & & & #重新显示背景方块
& & & & for ((y = 0; y & iTrayH y++))
& & & & do
& & & & & & & & ((yp = y + iTrayTop + 1))
& & & & & & & & ((xp = iTrayLeft + 1))
& & & & & & & & ((i = y * iTrayWidth))
& & & & & & & & echo -ne &\033[${yp};${xp}H&
& & & & & & & & for ((x = 0; x & iTrayW x++))
& & & & & & & & do
& & & & & & & & & & & & ((j = i + x))
& & & & & & & & & & & & if ((${iMap[$j]} == -1))
& & & & & & & & & & & & then
& & & & & & & & & & & & & & & & echo -ne &&&&
& & & & & & & & & & & & else
& & & & & & & & & & & & & & & & echo -ne &\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m&
& & & & & & & & & & & & fi
& & & & & & & & done
& & & & done
function BoxDown()
& & & & local y s
& & & & ((y = boxCurY + 1))& & & & #新的y坐标
& & & & if BoxMove $y $boxCurX& & & & #测试是否可以下落一行
& & & & then
& & & & & & & & s=&`DrawCurBox 0`&& & & & #将旧的方块抹去
& & & & & & & & ((boxCurY = y))
& & & & & & & & s=&$s`DrawCurBox 1`&& & & & #显示新的下落后方块
& & & & & & & & echo -ne $s
& & & & else
& & & & & & & & #走到这儿, 如果不能下落了
& & & & & & & & Box2Map& & & & & & & & #将当前移动中的方块贴到背景方块中
& & & & & & & & RandomBox& & & & #产生新的方块
& & & & fi
function BoxLeft()
& & & & local x s
& & & & ((x = boxCurX - 1))
& & & & if BoxMove $boxCurY $x
& & & & then
& & & & & & & & s=`DrawCurBox 0`
& & & & & & & & ((boxCurX = x))
& & & & & & & & s=$s`DrawCurBox 1`
& & & & & & & & echo -ne $s
& & & & fi
function BoxRight()
& & & & local x s
& & & & ((x = boxCurX + 1))
& & & & if BoxMove $boxCurY $x
& & & & then
& & & & & & & & s=`DrawCurBox 0`
& & & & & & & & ((boxCurX = x))
& & & & & & & & s=$s`DrawCurBox 1`
& & & & & & & & echo -ne $s
& & & & fi
function BoxAllDown()
& & & & local k j i x y iDown s
& & & & iDown=$iTrayHeight
& & & & #计算一共需要下落多少行
& & & & for ((j = 0; j & 8; j += 2))
& & & & do
& & & & & & & & ((i = j + 1))
& & & & & & & & ((y = ${boxCur[$j]} + boxCurY))
& & & & & & & & ((x = ${boxCur[$i]} + boxCurX))
& & & & & & & & for ((k = y + 1; k & iTrayH k++))
& & & & & & & & do
& & & & & & & & & & & & ((i = k * iTrayWidth + x))
& & & & & & & & & & & & if (( ${iMap[$i]} != -1)); fi
& & & & & & & & done
& & & & & & & & ((k -= y + 1))
& & & & & & & & if (( $iDown & $k )); then iDown=$k; fi
& & & & done
& & & & s=`DrawCurBox 0`& & & & #将旧的方块抹去
& & & & ((boxCurY += iDown))
& & & & s=$s`DrawCurBox 1`& & & & #显示新的下落后的方块
& & & & echo -ne $s
& & & & Box2Map& & & & & & & & #将当前移动中的方块贴到背景方块中
& & & & RandomBox& & & & #产生新的方块
function BoxRotate()
& & & & local iCount iTestRotate boxTest j i s
& & & & iCount=${countBox[$iBoxCurType]}& & & & #当前的方块经旋转可以产生的样式的数目
& & & & #计算旋转后的新的样式
& & & & ((iTestRotate = iBoxCurRotate + 1))
& & & & if ((iTestRotate &= iCount))
& & & & then
& & & & & & & & ((iTestRotate = 0))
& & & & fi
& & & & #更新到新的样式, 保存老的样式(但不显示)
& & & & for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j & 8; j++, i++))
& & & & do
& & & & & & & & boxTest[$j]=${boxCur[$j]}
& & & & & & & & boxCur[$j]=${box[$i]}
& & & & done
& & & & if BoxMove $boxCurY $boxCurX& & & & #测试旋转后是否有空间放的下
& & & & then
& & & & & & & & #抹去旧的方块
& & & & & & & & for ((j = 0; j & 8; j++))
& & & & & & & & do
& & & & & & & & & & & & boxCur[$j]=${boxTest[$j]}
& & & & & & & & done
& & & & & & & & s=`DrawCurBox 0`
& & & & & & & & #画上新的方块
& & & & & & & & for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j & 8; j++, i++))
& & & & & & & & do
& & & & & & & & & & & & boxCur[$j]=${box[$i]}
& & & & & & & & done
& & & & & & & & s=$s`DrawCurBox 1`
& & & & & & & & echo -ne $s
& & & & & & & & iBoxCurRotate=$iTestRotate
& & & & else
& & & & & & & & #不能旋转,还是继续使用老的样式
& & & & & & & & for ((j = 0; j & 8; j++))
& & & & & & & & do
& & & & & & & & & & & & boxCur[$j]=${boxTest[$j]}
& & & & & & & & done
& & & & fi
#DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。
function DrawCurBox()
& & & & local i j t bDraw sBox s
& & & & bDraw=$1
& & & & s=&&
& & & & if (( bDraw == 0 ))
& & & & then
& & & & & & & & sBox=&\040\040&
& & & & else
& & & & & & & & sBox=&[]&
& & & & & & & & s=$s&\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m&
& & & & fi
& & & & for ((j = 0; j & 8; j += 2))
& & & & do
& & & & & & & & ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
& & & & & & & & ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))
& & & & & & & & #\033[y;xH, 光标到(x, y)处
& & & & & & & & s=$s&\033[${i};${t}H${sBox}&
& & & & done
& & & & s=$s&\033[0m&
& & & & echo -n $s
#更新新的方块
function RandomBox()
& & & & local i j t
& & & & #更新当前移动的方块
& & & & iBoxCurType=${iBoxNewType}
& & & & iBoxCurRotate=${iBoxNewRotate}
& & & & cBoxCur=${cBoxNew}
& & & & for ((j = 0; j & ${#boxNew[@]}; j++))
& & & & do
& & & & & & & & boxCur[$j]=${boxNew[$j]}
& & & & done
& & & & #显示当前移动的方块
& & & & if (( ${#boxCur[@]} == 8 ))
& & & & then
& & & & & & & & #计算当前方块该从顶端哪一行&冒&出来
& & & & & & & & for ((j = 0, t = 4; j & 8; j += 2))
& & & & & & & & do
& & & & & & & & & & & & if ((${boxCur[$j]} & t)); then t=${boxCur[$j]}; fi
& & & & & & & & done
& & & & & & & & ((boxCurY = -t))
& & & & & & & & for ((j = 1, i = -4, t = 20; j & 8; j += 2))
& & & & & & & & do
& & & & & & & & & & & & if ((${boxCur[$j]} & i)); then i=${boxCur[$j]}; fi
& & & & & & & & & & & & if ((${boxCur[$j]} & t)); then t=${boxCur[$j]}; fi
& & & & & & & & done
& & & & & & & & ((boxCurX = (iTrayWidth - 1 - i - t) / 2))
& & & & & & & & #显示当前移动的方块
& & & & & & & & echo -ne `DrawCurBox 1`
& & & & & & & & #如果方块一出来就没处放,Game over!
& & & & & & & & if ! BoxMove $boxCurY $boxCurX
& & & & & & & & then
& & & & & & & & & & & & kill -$sigExit ${PPID}
& & & & & & & & & & & & ShowExit
& & & & & & & & fi
& & & & fi
& & & & #清除右边预显示的方块
& & & & for ((j = 0; j & 4; j++))
& & & & do
& & & & & & & & ((i = iTop + 1 + j))
& & & & & & & & ((t = iLeft + 2 * iTrayWidth + 7))
& & & & & & & & echo -ne &\033[${i};${t}H& && &&&&
& & & & done
& & & & #随机产生新的方块
& & & & ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
& & & & ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
& & & & for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j & 8; j++, i++))
& & & & do
& & & & & & & & boxNew[$j]=${box[$i]};
& & & & done
& & & & ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))
& & & & #显示右边预显示的方块
& & & & echo -ne &\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m&
& & & & for ((j = 0; j & 8; j += 2))
& & & & do
& & & & & & & & ((i = iTop + 1 + ${boxNew[$j]}))
& & & & & & & & ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
& & & & & & & & echo -ne &\033[${i};${t}H[]&
& & & & done
& & & & echo -ne &\033[0m&
function InitDraw()
& & & & clear
& & & & RandomBox& & & & #随机产生方块,这时右边预显示窗口中有方快了
& & & & RandomBox& & & & #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落
& & & & local i t1 t2 t3
& & & & #显示边框
& & & & echo -ne &\033[1m&
& & & & echo -ne &\033[3${cBorder}m\033[4${cBorder}m&
& & & & ((t2 = iLeft + 1))
& & & & ((t3 = iLeft + iTrayWidth * 2 + 3))
& & & & for ((i = 0; i & iTrayH i++))
& & & & do
& & & & & & & & ((t1 = i + iTop + 2))
& & & & & & & & echo -ne &\033[${t1};${t2}H||&
& & & & & & & & echo -ne &\033[${t1};${t3}H||&
& & & & done
& & & & ((t2 = iTop + iTrayHeight + 2))
& & & & for ((i = 0; i & iTrayWidth + 2; i++))
& & & & do
& & & & & & & & ((t1 = i * 2 + iLeft + 1))
& & & & & & & & echo -ne &\033[${iTrayTop};${t1}H==&
& & & & & & & & echo -ne &\033[${t2};${t1}H==&
& & & & done
& & & & echo -ne &\033[0m&
& & & & #显示&Score&和&Level&字样
& & & & echo -ne &\033[1m&
& & & & ((t1 = iLeft + iTrayWidth * 2 + 7))
& & & & ((t2 = iTop + 10))
& & & & echo -ne &\033[3${cScore}m\033[${t2};${t1}HScore&
& & & & ((t2 = iTop + 11))
& & & & echo -ne &\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}&
& & & & ((t2 = iTop + 13))
& & & & echo -ne &\033[3${cScore}m\033[${t2};${t1}HLevel&
& & & & ((t2 = iTop + 14))
& & & & echo -ne &\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}&
& & & & echo -ne &\033[0m&
#退出时显示GameOVer!
function ShowExit()
& & & & local y
& & & & ((y = iTrayHeight + iTrayTop + 3))
& & & & echo -e &\033[${y};0HGameOver!\033[0m&
& & & & exit
#显示用法.
function Usage
& & & & cat && EOF
Usage: $APP_NAME
Start tetris game.
&&-h, --help& && && && &&&display this help and exit
& && &--version& && && &&&output version information and exit
#游戏主程序在这儿开始.
if [[ &$1& == &-h& || &$1& == &--help& ]]; then
& & & & Usage
elif [[ &$1& == &--version& ]]; then
& & & & echo &$APP_NAME $APP_VERSION&
elif [[ &$1& == &--show& ]]; then
& & & & #当发现具有参数--show时,运行显示函数
& & & & RunAsDisplayer
& & & & bash $0 --show&& & & & #以参数--show将本程序再运行一遍
& & & & RunAsKeyReceiver $!& & & & #以上一行产生的进程的进程号作为参数
专注中小企业IT实施,构建最具性价 ...
让我想起了曾经的高手,以前的视频就是有个黑人歌手在跳舞。
学习了!!!
助理工程师
相当强大。:ldw7: :ldw7: :ldw7:
初级工程师
膜拜啊!!强大
太强了, 学习中
这个好早前久玩过了
:(mars_23): :(mars_23): 太厉害了。。。
太强了,佩服的五体投地
够强。。。。:lol
强大啊,妈妈的!
顶,拿走了
赞一个:ldw2:
入则恳恳以尽忠,出则谦谦以自悔...
中级工程师
太牛了,copy以下后运行,膜拜了。。
膜拜了。。。。。。。。。。。什么时候咱能学到这样就好了
别看资料,看聊效!!!
非常强大啊,高手啊
向LZ致敬学习;P
永夜的shell真的是炉火纯青了...
不断更新自己...日事日毕....工作娱乐生活相结合....& & !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN HTML HEAD TITLE 俄罗斯方块 /TITLE META NAME=Generator CONTENT=EditPlus META NAME=Author CONTENT=dolphin META NAME=Description CONTENT=俄罗斯方块 游戏 STYLE .btnup{ bor……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程2016年12月 Linux/Unix社区大版内专家分月排行榜第二
2016年12月 Linux/Unix社区大版内专家分月排行榜第二
2016年12月 Linux/Unix社区大版内专家分月排行榜第二
2016年12月 Linux/Unix社区大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。脚本、批处理(13)
C/C++(35)
BAT版本:@echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:日 ver 2.0
if &%1& equ &para2& goto :para2
set &d-v=for %%a in (!str!) do set/a one=0x%%a,x=one/4+n,y=one%%4+m&(for %%b in (&r!x!.!y!&) do if &!%%~b!& equ & & (set r!x!.!y!=■) else (set err=1))&
::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v%)
::变量使用:one
set &d-e=set aec=!cr!!cr!
┌───────────┐!cr!&(for /l %%a in (2,1,#) do for %%b in (&│!ebuf:@=%%a!│  !ebu%%a!&) do set aec=!aec!
%%~b!cr!)&cls&!aec!
└───────────┘&
::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
set ebu4=第!guan!关
set ebu6=总分:!fen!
::各种图标定义
set ga1=0 1 5 6
set ga2=1 4 5 8
set gb1=1 2 4 5
set gb2=0 4 5 9
set za1=4 5 6 7
set za2=1 5 9 d
::■■■■
set qa1=1 5 9 8
set qa2=0 4 5 6
set qa3=0 1 4 8
set qa4=0 1 2 6
set qb1=0 4 8 9
set qb2=0 1 2 4
set qb3=0 1 5 9
set qb4=2 4 5 6
set ta1=0 1 4 5
set sa1=0 1 2 5
set sa2=1 4 5 9
set sa3=1 4 5 6
set sa4=0 4 5 8
set tw1=0 1
set tw2=0 4
set sh1=1 4 5 6 9
set sh2=1 4 5 6 9
set ao1=0 1 2 4 6
set ao2=0 1 4 8 9
set ao3=0 4 5 6 2
set ao4=0 1 5 8 9
set tt1=0 1 2 5 9
set tt2=0 4 8 5 6
set tt3=1 5 8 9 a
set tt4=2 4 5 6 a
echo 0 2 &%~n0.tmp
start &aswd& %0 para2
::起动控制窗口
set k3=k%%=mx,k+
set k4=down
::按键定义
setlocal enabledelayedexpansion
for /l %%a in (0,1,10) do (set &ebuf=!ebuf!^!r@.%%a^!&)
for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2 tw_2 on_2 sh_2 ao_4 tt_4) do (
for /f &tokens=1,2 delims=_& %%b in (&%%a&) do (
set _%%b=%%c
for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
::定义各种图型的可变型数,及单个图的随机号
for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
set/a fen=0,guan=1
::初始化坐标空间18行,10列
set/a &m=4,t=2,n=1,down=450/(guan&&2),bti=0&
set/a r=!random!%%nx+1
set ttr=!_ttr!
set _ttr=!ran%r%!
::随机取一个图标,
if not defined ttr goto :loop
set mx=!_%ttr:~,2%!
set k=%ttr:~2%
set str=!%ttr%!
set _str=!%_ttr%!
setlocal enabledelayedexpansion
for %%a in (!_str!) do set/a one=0x%%a,x=one/4+8,y=one%%4&set kk!x!.!y!=■
for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
::对预备图标的处理
for /f &tokens=1,2& %%a in (%~n0.tmp) do (
if %%b geq 6 (call :error %%b&exit)
if %%a neq !test! (
set bs=!str!&set/a bm=m,bk=k
set/a !k%%b!=1
if &%%b& equ &3& (for %%b in (&!ttr:~,2!!k!&) do set str=!%%~b!)
setlocal enabledelayedexpansion
(%d-v:#=3%)
rem 调用函数把图标点放置到总坐标空间
if defined err (
set/a m=bm,k=bk
set str=!bs!
if &%%b& equ &4& goto :jmpout
(%d-e:#=18%)
rem 调用显示函数
set test=%%a
set ti=1!time:~7,1!!time:~9,2!
if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
if !tn! gtr !down! (
set/a bti=ti,n+=1
setlocal enabledelayedexpansion
(%d-v:#=3%)
if defined err (
goto :jmpout
(%d-e:#=18%)
goto :cont
set/a n-=1
(%d-v:#=3%)
for /l %%a in (18,-1,2) do for %%b in (&!ebuf:@=%%a!&) do if &%%~b& neq &■■■■■■■■■■■& (set e!m!=%%~b&set/a m-=1)
if !m! neq 1 (
for /l %%a in (!m!,-1,2) do set &e%%a=           &
for /l %%a in (18,-1,2) do (
for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
set/a &fen=fen+(m-1)*10,guan=fen/150+1&
if !n! leq 2 (
echo 游戏结束!
ping -n 3 127.1 &nul
goto :restart
goto :loop
mode con: cols=30 lines=2
echo a左 d右 w转 s加速 q退出
set/a n=n%%10+1
choice /c adwsgq /n &nul
&%~n0.%n% %errorlevel%
if %errorlevel% geq 6 exit
goto :p_lp
if %1 equ 6 echo 谢谢使用,再见。。。
if %1 gtr 6 echo 对不起!choice.exe 文件不存在,不能运行。。。
ping -n 3 127.1 &nul
&style&.c {margin :1width:19height:19background:position:}
.d {margin :1width:19height:19background:position:}
.f {top:0left:0background:position:}
&body&&/body&&html&
var over=false,shapes=(&0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2&).split(&;&);
function create(tag,css){
var elm=document.createElement(tag);
elm.className =
document.body.appendChild(elm);
function Tetris(c, t, x, y){
var c=c?c:&c&;
this.divs = [create(&div&,c),create(&div&,c),create(&div&,c),create(&div&,c)];
this.reset = function(){
this.x = typeof x != 'undefined'?x:3;
this.y = typeof y != 'undefined'?y:0;
this.shape = t?t:shapes[Math.floor(Math.random()*(shapes.length-0.00001))].split(&,&);
this.show();
if(this.field&&this.field.check(this.shape,this.x,this.y,'v')=='D'){
this.field.fixShape(this.shape,this.x,this.y);
alert('game over');}}
this.show = function(){
for(var i in this.divs){
this.divs[i].style.left = (this.shape[i*2]*1+this.x)*20+'px';
this.divs[i].style.top = (this.shape[i*2+1]*1+this.y)*20+'px';}}
this.field=
this.hMove = function(step){
var r = this.field.check(this.shape,this.x- -step,this.y,'h');
if(r!='N'&&r==0){
this.show();}}
this.vMove = function(){
if(this.field.check(this.shape,this.x,this.y- -1,'v')=='N'){
this.show();}
this.field.fixShape(this.shape,this.x,this.y);
this.field.findFull();
this.reset();}}
this.rotate = function(){
var s=this.
var newShape=[3-s[1],s[0],3-s[3],s[2],3-s[5],s[4],3-s[7],s[6]];
var r = this.field.check(newShape,this.x,this.y,'h');
if(r=='D')
this.shape=newS
this.show();}
else if(this.field.check(newShape,this.x-r,this.y,'h')==0){
this.x-=r;
this.shape=newS
this.show();}}
this.reset();}
function Field(w,h){
this.width = w?w:10;
this.height = h?h:20;
this.show = function(){
var f = create(&div&,&f&)
f.style.width=this.width*20+'px';
f.style.height=this.height*20+'px';}
this.findFull = function(){
for(var l=0;l&this.l++){
for(var i=0;i&this.i++){
s+=this[l*this.width+i]?1:0;}
if(s==this.width){
this.removeLine(l);}}}
this.removeLine = function(line){
for(var i=0;i&this.i++){
document.body.removeChild(this[line*this.width+i]);}
for(var l=l&0;l--){
for(var i=0;i&this.i++){
this[l*this.width- -i]=this[(l-1)*this.width- -i];
if(this[l*this.width- -i])this[l*this.width- -i].style.top = l*20+'px';}}}
this.check = function(shape, x, y, d){
var r1=0,r2='N';
for(var i=0;i&8;i+=2){
if(shape[i]- -x & 0 && shape[i]- -x &r1)
{r1 = shape[i]- -x;}
else if(shape[i]- -x&=this.width && shape[i]- -x&r1)
{r1 = shape[i]- -x;}
if(shape[i+1]- -y&=this.height || this[shape[i]- -x- -(shape[i+1]- -y)*this.width])
if(d=='h'&&r2=='N')return r1&0?r1-this.width- -1:r1;
else return r2;}
this.fixShape = function(shape,x,y){
var d=new Tetris(&d&,shape,x,y);
for(var i=0;i&8;i+=2){
this[shape[i]- -x- -(shape[i+1]- -y)*this.width]=d.divs[i/2];}}}
var f = new Field();
var s = new Tetris();
window.setInterval(&if(!over)s.vMove();&,500);
document.onkeydown = function(e){
var e = window.event ? window.event :
switch(e.keyCode){
case 38: //up
s.rotate();
case 40: //down
s.vMove();
case 37: //left
s.hMove(-1);
case 39: //right
s.hMove(1);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:147546次
积分:2227
积分:2227
排名:第16477名
原创:71篇
转载:27篇
评论:134条}

我要回帖

更多关于 俄罗斯方块高清版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信