热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell版俄罗斯方块

文章标题:shell版俄罗斯方块。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  把注释加进去了,可能不是很详尽,

  只希望能把问题表现的清楚一点

  感谢各位兄弟的捧场,

  属于旧瓶装新酒了,呵呵

  如果你的终端可以显示出颜色,效果会好点

  运行于GNU bash, version 2.05a.0(1)-release (i686-pc-linux-gnu)

  ---------------------------------------------------

  果然在新的ubuntu下不能运行了,需要将类似\33的地方改成\033,

  感谢网友thinux和guotao_buaa帮忙修改,已经将新的代码补入。

  1.#!/bin/bash

  2.

  3.# Tetris Game

  4.# 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]>

  5.

  6.#APP declaration

  7.APP_NAME="${0##*[\\/]}"

  8.APP_VERSION="1.0"

  9.

  10.

  11.#颜色定义

  12.cRed=1

  13.cGreen=2

  14.cYellow=3

  15.cBlue=4

  16.cFuchsia=5

  17.cCyan=6

  18.cWhite=7

  19.colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

  20.

  21.#位置和大小

  22.iLeft=3

  23.iTop=2

  24.((iTrayLeft = iLeft + 2))

  25.((iTrayTop = iTop + 1))

  26.((iTrayWidth = 10))

  27.((iTrayHeight = 15))

  28.

  29.#颜色设置

  30.cBorder=$cGreen

  31.cScore=$cFuchsia

  32.cScoreValue=$cCyan

  33.

  34.#控制信号

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

  36.#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。

  37.sigRotate=25

  38.sigLeft=26

  39.sigRight=27

  40.sigDown=28

  41.sigAllDown=29

  42.sigExit=30

  43.

  44.#七中不同的方块的定义

  45.#通过旋转,每种方块的显示的样式可能有几种

  46.box0=(0 0 0 1 1 0 1 1)

  47.box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)

  48.box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)

  49.box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)

  50.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)

  51.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)

  52.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)

  53.#所有其中方块的定义都放到box变量中

  54.box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})

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

  56.countBox=(1 2 2 2 4 4 4)

  57.#各种方块再box数组中的偏移

  58.offsetBox=(0 1 3 5 7 11 15)

  59.

  60.#每提高一个速度级需要积累的分数

  61.iScoreEachLevel=50        #be greater than 7

  62.

  63.#运行时数据

  64.sig=0                #接收到的signal

  65.iScore=0        #总分

  66.iLevel=0        #速度级

  67.boxNew=()        #新下落的方块的位置定义

  68.cBoxNew=0        #新下落的方块的颜色

  69.iBoxNewType=0        #新下落的方块的种类

  70.iBoxNewRotate=0        #新下落的方块的旋转角度

  71.boxCur=()        #当前方块的位置定义

  72.cBoxCur=0        #当前方块的颜色

  73.iBoxCurType=0        #当前方块的种类

  74.iBoxCurRotate=0        #当前方块的旋转角度

  75.boxCurX=-1        #当前方块的x坐标位置

  76.boxCurY=-1        #当前方块的y坐标位置

  77.iMap=()                #背景方块图表

  78.

  79.#初始化所有背景方块为-1, 表示没有方块

  80.for ((i = 0; i

  81.

  82.

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

  84.function RunAsKeyReceiver()

  85.{

  86.        local pidDisplayer key aKey sig cESC sTTY

  87.

  88.        pidDisplayer=$1

  89.        aKey=(0 0 0)

  90.

  91.        cESC=`echo -ne "\033"`

  92.        cSpace=`echo -ne "\040"`

  93.

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

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

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

  97.        sTTY=`stty -g`

  98.

  99.        #捕捉退出信号

  100.        trap "MyExit;" INT TERM

  101.        trap "MyExitNoSub;" $sigExit

  102.

  103.        #隐藏光标

  104.        echo -ne "\033[?25l"

  105.

  106.

  107.        while :

  108.        do

  109.                #读取输入。注-s不回显,-n读到一个字符立即返回

  110.                read -s -n 1 key

  111.

  112.                aKey[0]=${aKey[1]}

  113.                aKey[1]=${aKey[2]}

  114.                aKey[2]=$key

  115.                sig=0

  116.

  117.                #判断输入了何种键

  118.                if [[ $key == $cESC && ${aKey[1]} == $cESC ]]

  119.                then

  120.                        #ESC键

  121.                        MyExit

  122.                elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]

  123.                then

  124.                        if [[ $key == "A" ]]; then sig=$sigRotate        #<向上键>

  125.                        elif [[ $key == "B" ]]; then sig=$sigDown        #<向下键>

  126.                        elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左键>

  127.                        elif [[ $key == "C" ]]; then sig=$sigRight        #<向右键>

  128.                        fi

  129.                elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w

  130.                elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s

  131.                elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a

  132.                elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d

  133.                elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown        #空格键

  134.                elif [[ $key == "Q" || $key == "q" ]]                        #Q, q

  135.                then

  136.                        MyExit

  137.                fi

  138.

  139.                if [[ $sig != 0 ]]

  140.                then

  141.                        #向另一进程发送消息

  142.                        kill -$sig $pidDisplayer

  143.                fi

  144.        done

  145.}

  146.

  147.#退出前的恢复

  148.function MyExitNoSub()

  149.{

  150.        local y

  151.

  152.        #恢复终端属性

  153.        stty $sTTY

  154.        ((y = iTop + iTrayHeight + 4))

  155.

  156.        #显示光标

  157.        echo -e "\033[?25h\033[${y};0H"

  158.        exit

  159.}

  160.

  161.

  162.function MyExit()

  163.{

  164.        #通知显示进程需要退出

  165.        kill -$sigExit $pidDisplayer

  166.

  167.        MyExitNoSub

  168.}

  169.

  170.

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

  172.function RunAsDisplayer()

  173.{

  174.        local sigThis

  175.        InitDraw

  176.

  177.        #挂载各种信号的处理函数

  178.        trap "sig=$sigRotate;" $sigRotate

  179.        trap "sig=$sigLeft;" $sigLeft

  180.        trap "sig=$sigRight;" $sigRight

  181.        trap "sig=$sigDown;" $sigDown

  182.        trap "sig=$sigAllDown;" $sigAllDown

  183.        trap "ShowExit;" $sigExit

  184.

  185.        while :

  186.        do

  187.                #根据当前的速度级iLevel不同,设定相应的循环的次数

  188.                for ((i = 0; i <21 - iLevel; i++))

  189.                do

  190.                        sleep 0.02

  191.                        sigThis=$sig

  192.                        sig=0

  193.

[1] [2] [3] 下一页


推荐阅读
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文讨论了在Linux系统中,使用chown命令将django项目目录下的static目录的拥有者从root改为eureka的问题。作者尝试了多种命令,包括chown和sudo chown等,但都没有成功修改拥有者。文章提供了相关目录的权限信息,并补充了项目所在磁盘和操作系统的信息。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
author-avatar
Just忽略我_559
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有