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


推荐阅读
  • 随着技术社区的发展,越来越多的技术爱好者选择通过撰写博客来分享自己的学习经验和项目进展。本文将介绍一个具体案例,即将一套原本运行于Windows平台的代码成功移植到Linux(Redhat)环境下的过程与挑战。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 2012年7月30日,语言岛团队宣布其智能记单词软件V0.3.4.554版本正式开源。该版本不仅支持跨平台使用,还引入了多项创新功能,旨在帮助用户更高效地记忆单词。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文详细介绍了如何在Ubuntu的Enlightenment (E17) 桌面环境中管理和优化桌面图标及根菜单。通过本文,您将了解这些功能的作用及其配置方法。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • C语言实现推箱子游戏的完整代码
    本文详细介绍了如何使用C语言在Linux环境下实现一个简单的推箱子游戏,包括游戏的基本规则、地图设计及代码实现。适合C语言初学者学习。 ... [详细]
  • 在安装Ubuntu 12.10并尝试安装VMware Tools时,遇到了一个常见的错误提示:指定的路径不是有效的3.5.0-17-generic内核头文件路径。本文将提供解决这一问题的具体步骤。 ... [详细]
  • 如何在Linux中实现字符设备控制
    本文详细探讨了在Linux环境下控制字符设备的方法,包括蜂鸣器和模数转换器(ADC)的实际操作案例。对于开发者来说,了解这些基础知识对于嵌入式系统的开发尤为重要。 ... [详细]
  • CentOS 转向引发争议,联合创始人推出 Rocky Linux
    CentOS 转向 CentOS Stream 引发用户不满,其联合创始人 Gregory Kurtzer 推出新的社区项目 Rocky Linux,旨在延续 CentOS 的精神。 ... [详细]
  • 在树莓派Ubuntu(ARM64)上安装Node.js
    本文详细介绍了如何在树莓派Ubuntu系统(ARM64架构)上安装Node.js,包括下载、解压、移动文件以及创建软链接等步骤。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
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社区 版权所有