热门标签 | 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] 下一页


推荐阅读
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了VMware的多种认证选项,帮助你根据职业需求和个人技能选择最合适的认证路径,涵盖从基础到高级的不同层次认证。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • PHP 时间与日期工具类:星座、干支、生肖的实现
    本文介绍了一个PHP时间与日期工具类,涵盖了时区设置、有效日期和时间检查、星座、干支、生肖计算等功能。该工具类特别适用于需要处理中国农历及西方星座的应用场景。 ... [详细]
  • 在Ubuntu 8.04中安装美观的Cairo-Dock桌面增强工具
    本文介绍如何在Ubuntu 8.04系统中安装和配置Cairo-Dock,这款桌面增强工具以其精美的界面和高效的功能备受用户青睐。文章将指导您通过简单的步骤完成安装,并提供一些实用的配置建议。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
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社区 版权所有