前言
试试比较多动态画面的飞机游戏是否可以用 Shell 来实现。
正文
试了一次性 echo 一个大字串,或者是分批 echo 小一点的字串,发现都很卡,最后还是保留最初的方案,有需要输出屏的时候就直接 echo。也弄过一个消息队列的结构,后来改着改着,发现消息队列都用不上了。
截图如下:
代码
颜色代码头文件 colors.sh
#!/bin/bash
# colors.sh
# 作者:亚丹
# http://seesea.blog.chinaunix.net
# http://blog.csdn.net/nicenight
# 一些输出控制常量定义,已经不只包括颜色常量了,对不起这个文件名呀
# 控制序列初始字符
ESC="\E"
# 前景色
BLK=$ESC"[30m"
RED=$ESC"[31m"
GRN=$ESC"[32m"
YEL=$ESC"[33m"
BLU=$ESC"[34m"
MAG=$ESC"[35m"
CYN=$ESC"[36m"
WHT=$ESC"[37m"
# 高亮前景色
HIR=$ESC"[1;31m"
HIG=$ESC"[1;32m"
HIY=$ESC"[1;33m"
HIB=$ESC"[1;34m"
HIM=$ESC"[1;35m"
HIC=$ESC"[1;36m"
HIW=$ESC"[1;37m"
# 背景色
BBLK=$ESC"[40m"
BRED=$ESC"[41m"
BGRN=$ESC"[42m"
BYEL=$ESC"[43m"
BBLU=$ESC"[44m"
BMAG=$ESC"[45m"
BCYN=$ESC"[46m"
BWHT=$ESC"[47m"
# 高亮背景色
BHIR=$ESC"[41;1m"
BHIG=$ESC"[42;1m"
BHIY=$ESC"[43;1m"
BHIB=$ESC"[44;1m"
BHIM=$ESC"[45;1m"
BHIC=$ESC"[46;1m"
BHIW=$ESC"[47;1m"
# 恢复默认显示
NOR=$ESC"[2;37;0m"
# 闪烁效果
BLINK=$ESC"[5m"
# 粗体效果
BOLD=$ESC"[1m"
# 反向显示
INV=$ESC"[7m"
主程序源文件 aircraft.sh
#!/bin/bash
# aircraft.sh
#
# 作者:亚丹
# 时间:2012-06-27
# seesea2517#gmail*com
# http://seesea.blog.chinaunix.net
# http://blog.csdn.net/nicenight
#
# 功能:飞机游戏的Demo
# 游戏规则:
# 1. 射击敌机,击中一架敌机得一分
# 2. 每十分升一级
# 3. 升级后,敌机的出现几率将会上升
# 4. 升级后,将增加可发射子弹的数量
source colors.sh
# ============================================================================
# 全局配置
# ============================================================================
# 响应的信号
declare -r SIG_UP=SIGRTMIN+1
declare -r SIG_DOWN=SIGRTMIN+2
declare -r SIG_LEFT=SIGRTMIN+3
declare -r SIG_RIGHT=SIGRTMIN+4
declare -r SIG_SHOOT=SIGRTMIN+5
declare -r SIG_PAUSE=SIGRTMIN+6
declare -r SIG_EXIT=SIGRTMIN+7
# 响应的按键(注意:使用大写配置)
declare -r KEY_UP="W"
declare -r KEY_DOWN="S"
declare -r KEY_LEFT="A"
declare -r KEY_RIGHT="D"
declare -r KEY_SHOOT="J"
declare -r KEY_PAUSE="P"
declare -r KEY_EXIT="Q"
# 游戏区域位置大小
declare -r GAME_AREA_TOP=10
declare -r GAME_AREA_LEFT=30
declare -r GAME_AREA_WIDTH=43
declare -r GAME_AREA_HEIGHT=33
# 标题位置
declare -r TITLE_POS_LEFT=22
declare -r TITLE_POS_TOP=2
# 信息显示位置
declare -r MSG_POS_TOP=$(( GAME_AREA_TOP + GAME_AREA_HEIGHT - 20 ))
declare -r MSG_POS_LEFT=$(( GAME_AREA_LEFT + GAME_AREA_WIDTH + 10 ))
declare -r MSG_SCORE_TOP=$(( MSG_POS_TOP + 1 ))
declare -r MSG_SCORE_LEFT=$(( MSG_POS_LEFT + 16 ))
declare -r MSG_LEVEL_TOP=$(( MSG_POS_TOP + 2 ))
declare -r MSG_LEVEL_LEFT=$MSG_SCORE_LEFT
declare -r MSG_BULLET_TOP=$(( MSG_POS_TOP + 3 ))
declare -r MSG_BULLET_LEFT=$MSG_SCORE_LEFT
declare -r MSG_TOP_SCORE_TOP=$(( MSG_POS_TOP + 4 ))
declare -r MSG_TOP_SCORE_LEFT=$MSG_SCORE_LEFT
# 游戏边界显示字符(分横向和纵向两种字符)
declare -r BORDER_H="${BHIG} ${NOR}"
declare -r BORDER_V="${BHIG} ${NOR}"
# 游戏最高分存放文件
declare -r FILE_TOP_SCORE=".top_score"
# ============================================================================
# 全局常量
# ============================================================================
# 玩家图标 敌机图标
# A -+-
# -=#=- -=#=-
# -+- V
declare -r player_width=5 # 玩家图标的宽
declare -r player_height=3 # 玩家图标的高
declare -r player_gun_offset_c=$(( (player_width - 1) / 2 - 1 )) # 玩家枪炮的相对于坐标的偏移
declare -r player_gun_offset_r=-2 # 玩家枪炮的相对于坐标的偏移
declare -r enemy_width=5 # 敌机图标的宽
declare -r enemy_height=3 # 敌机图标的高
declare -r enemy_random_range_max=20 # 每帧随机产生敌机的随机数范围 20 表示 1/20 的几率
# 各种不同风格的星星集合
declare -ar ar_star_style=( "${RED}.${NOR}" "${GRN}.${NOR}" "${YEL}.${NOR}" "${BLU}.${NOR}" "${MAG}.${NOR}" "${CYN}.${NOR}" "${WHT}.${NOR}" "${HIR}.${NOR}" "${HIG}.${NOR}" "${HIY}.${NOR}" "${HIB}.${NOR}" "${HIM}.${NOR}" "${HIC}.${NOR}" "${HIW}.${NOR}" )
# 敌机颜色列表
declare -ar ar_enemy_color=( "$HIR" "$HIG" "$HIY" "$HIB" "$HIM" "$HIC" "$HIW" )
# ============================================================================
# 全局变量
# =======================================================&