e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 程序开发 >> PHP教程 >> shell中俄罗斯方块 >> 教程正文
 
教程搜索
 
 
相关教程
  • 利用Editplus2的用户工具功能来即时调
  • 遍历FTP下目录和文件生成数据库--可以
  • 关于PHP与Sybase数据库的连接与使用
  • 搜索引擎技术核心揭密(PHP)
  • PHP,21世纪的霸主(德国人写的文章,
  • PHP,21世纪的霸主(之4)
  • PHP避免重复申明函数的解决方案
  • 怎么利用PHP去ping一个地址
  • 用PHP判断oicq是否在线的小程序
  • PHP4.23在WindowsXP下的IIS和Apache2两
  • PHP调用java类的两种方法!
  • Java经典问题
  • JDBC学习笔记!
  • Java基础FAQ
  • shell中俄罗斯方块
  • 开始学php,发个贴纪念一下
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
shell中俄罗斯方块
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9

#!/bin/bash

# Tetris Game

# 10.21.2003 xhchen<xhchen@winbond.com.tw>

#颜色定义

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

#控制信号

#改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;

#当前者接收到上下左右等按键时,通过向后者发送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=($ $ $ $ $ $ $)

#各种方块旋转后可能的样式数目

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 * iTrayWidth; i++)); do iMap[$i]=-1; done

#接收输入的进程的主函数

function RunAsKeyReceiver()

{

local pidDisplayer key aKey sig cESC sTTY

pidDisplayer=

aKey=(0 0 0)

cESC=`echo -ne ""`

cSpace=`echo -ne ""`

#保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。

#如果在read -s时程序被不幸杀掉,可能会导致终端混乱,

#需要在程序退出时恢复终端属性。

sTTY=`stty -g`

#捕捉退出信号

trap "MyExit;" INT TERM

trap "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" ]]; 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 "[?25h[$;0H"

exit

}

function MyExit()

{

#通知显示进程需要退出

kill -$sigExit $pidDisplayer

MyExitNoSub

}

#处理显示和游戏流程的主函数

function RunAsDisplayer()

{

1 2 3 4 下一页
  • 上一篇教程: 开始学php,发个贴纪念一下
  • 下一篇教程: Java基础FAQ
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.