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


推荐阅读
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 通过设置Linux中的cd命令别名,用户能够更加高效地在复杂的目录结构中进行工作目录的切换。本文介绍了几种实用的方法,帮助减少重复输入路径的工作量。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 每种编程语言都有其独特的完成任务的方式,这也说明了为什么有这么多语言可供选择。在JimHall的《不同的编程语言如何完成相同的事情》文章中,他演示了13种不同的语言如何使用不同的语 ... [详细]
  • 本文介绍了Linux操作系统的核心组成部分——内核及其版本分类,以及市面上常见的几种Linux发行版,旨在为初学者提供一个清晰的学习路径。 ... [详细]
  • 如何在Mozilla Firefox中调整GIF动画的循环次数
    本文介绍了如何通过调整Mozilla Firefox的高级设置来控制GIF动画的播放次数,帮助用户根据个人喜好自定义浏览体验。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • AcetoneISO:Ubuntu Linux下的全能虚拟光驱工具
    AcetoneISO 是一款功能强大的虚拟光驱软件,适用于 Linux 和 Mac 系统。它支持多种映像文件格式的挂载和转换,并提供丰富的文件管理功能。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • Ubuntu 14.04 系统安装后网卡名称修改方法
    本文介绍了在安装 Ubuntu 14.04 Server 版本后,如何将默认的网卡名称从非 eth 格式修改为传统的 eth 格式,并提供了详细的步骤和示例。 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • Linux bash 命令行下实现可视化文件或文件夹浏览
    Linuxbash命令行下实现可视化文件或文件夹浏览  有时候部署环境,需要配置文件路径或者载入相应的配置文件。这种情况下,如果用传统的手动修改配置的方式配置,会比较容易出意外(比 ... [详细]
  • Ubuntu 环境下配置 LAMP 服务器
    本文详细介绍了如何在 Ubuntu 系统上安装和配置 LAMP(Linux、Apache、MySQL 和 PHP)服务器。包括 Apache 的安装、PHP 的配置以及 MySQL 数据库的设置,确保读者能够顺利搭建完整的 Web 开发环境。 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
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社区 版权所有