• 我用shell写了个mud游戏:武林群侠传


    零、前言

    学习shell的时候,无聊的我,写了个简单版的文字mud,暂且叫武林群侠传吧。可能90后都不知道文字mud是什么了……哈哈

    壹、效果

    先看下效果吧,GIF图如下

    在这里插入图片描述

    文字效果如下:

    [root@yaomm mud]# sh mudGameV03.sh 
    初始生命值:【10】
     2020-06-24/23:05:31 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 1 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:31 #######  你的对手【小兵甲】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳,2、排云掌,3、风神腿】,请输入 0~2 这3个数字选择武功:1
    您使出了【 排云掌 】
     2020-06-24/23:05:31 #######  您被【小兵甲】打败了,生命值减一,当前生命值:【9】 ######## 
     2020-06-24/23:05:31 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:32 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 2 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:32 #######  你的对手【小兵甲】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳,2、排云掌,3、风神腿】,请输入 0~2 这3个数字选择武功:2
    您使出了【 风神腿 】
     2020-06-24/23:05:33 #######   您打败了【小兵甲】,经验加1,当前战力值:【3】 ######## 
     2020-06-24/23:05:33 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:34 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 3 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:34 #######  你的对手【小兵甲】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳,2、排云掌,3、风神腿】,请输入 0~2 这3个数字选择武功:3
     2020-06-24/23:05:36 ####### ERROR:  无效输入,请输入 0~2 这3个数字来选择武功! ######## 
    ############# 使用武功出错,本回合重新开始 ###################
     2020-06-24/23:05:36 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 3 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:36 #######  你的对手【小兵甲】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳,2、排云掌,3、风神腿】,请输入 0~2 这3个数字选择武功:1
    您使出了【 排云掌 】
     2020-06-24/23:05:39 #######   您打败了【小兵甲】,经验加1,当前战力值:【6】 ######## 
    【Lv1 初出茅庐】您已不再是战五渣,继续努力!
     2020-06-24/23:05:40 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:41 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 4 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:41 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:2
    您使出了【 十三太保横练神功 】
     2020-06-24/23:05:43 #######  您被【兵丁头目】打败了,生命值减一,当前生命值:【8】 ######## 
     2020-06-24/23:05:43 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:44 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 5 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:44 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:2
    您使出了【 十三太保横练神功 】
     2020-06-24/23:05:46 #######   您打败了【兵丁头目】,经验加2,当前战力值:【9】 ######## 
     2020-06-24/23:05:46 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:47 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 6 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:47 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:1
    您使出了【 葵花点穴手 】
     2020-06-24/23:05:48 #######   您打败了【兵丁头目】,经验加2,当前战力值:【12】 ######## 
     2020-06-24/23:05:48 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:49 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 7 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:49 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:1
    您使出了【 葵花点穴手 】
     2020-06-24/23:05:57 #######  您被【兵丁头目】打败了,生命值减一,当前生命值:【7】 ######## 
     2020-06-24/23:05:57 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:05:58 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 8 关战斗开始------------------------------ ######## 
     2020-06-24/23:05:58 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:2
    您使出了【 十三太保横练神功 】
     2020-06-24/23:06:00 #######   您打败了【兵丁头目】,经验加2,当前战力值:【15】 ######## 
     2020-06-24/23:06:00 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:06:01 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 9 关战斗开始------------------------------ ######## 
     2020-06-24/23:06:01 #######  你的对手【兵丁头目】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv2,2、葵花点穴手,3、十三太保横练神功】,请输入 0~2 这3个数字选择武功:2
    您使出了【 十三太保横练神功 】
     2020-06-24/23:06:10 #######   您打败了【兵丁头目】,经验加2,当前战力值:【18】 ######## 
    【Lv2 小试牛刀】您小试牛刀,便已在江湖上打出了名号!
     2020-06-24/23:06:10 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:06:11 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 10 关战斗开始------------------------------ ######## 
     2020-06-24/23:06:11 #######  你的对手【锦衣卫】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv3,2、葵花宝典,3、紫霞神功】,请输入 0~2 这3个数字选择武功:1
    您使出了【 葵花宝典 】
     2020-06-24/23:06:12 #######   您打败了【锦衣卫】,经验加3,当前战力值:【21】 ######## 
     2020-06-24/23:06:12 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
     
     
     2020-06-24/23:06:13 #######  >>>>>>>>>>>>>>>>>>>>>>--------第 11 关战斗开始------------------------------ ######## 
     2020-06-24/23:06:13 #######  你的对手【锦衣卫】已出现,对方已经开始发起攻击 ######## 
    请出招反击:【1、野球拳Lv3,2、葵花宝典,3、紫霞神功】,请输入 0~2 这3个数字选择武功:0
    您使出了【 野球拳Lv3 】
     2020-06-24/23:06:13 #######   您打败了【锦衣卫】,经验加3,当前战力值:【24】 ######## 
     2020-06-24/23:06:13 #######  <<<<<<<<<<<<<<<<<<<<<---------本回合结束!敌人刷新中,请等待……-------------------- ######## 
    -----------------------------------------------------------------------------------------
    

    代码太多,不全贴出来了,说下主要思路。

    贰、代码解析

    1、定义级别

    根据战力值定义青铜、白银这样的段位,根据段位随机对手、武功!

    #####################################################
    # 作者:姚毛毛
    # 版本:v0.3
    # 更新日期:2020-06-24
    # 更新日志:添加招式、战斗过程
    # ---------------------------------------------------
    # 战力值<=5:   Lv0 战五渣
    # 战力值5-15:  Lv1 初出茅庐
    # 战力值16-30: Lv2 小试牛刀
    # 战力值31-40: Lv3 锋芒毕露
    # 战力值41-50: Lv4 声名鹊起
    # 战力值51-60: Lv5 名动江湖
    # 战力值61-70: Lv6 一代宗师
    # 战力值71-80: Lv7 武林盟主
    # 战力值81-90: Lv8 隐士高人
    # 战力值91-100: Lv9 江湖传说
    # 战力值小于0:Lv-1 死亡,少侠重来
    #####################################################
    

    2、定义全局变量

    初始战力值为0,初始等级为0,当前生命值是最大生命值-扣除生命值。
    每次战斗失败都扣除一点生命值

    # 战力值
    GLOBAL_POWER=0
    # 名字
    GLOBAL_NAME='少侠'
    # 等级
    GLOBAL_LEVEL=0 
    # 生命,初始生命值10点,下个版本规划:每升一级,最大生命值=10+等级*5
    GLOBAL_LIFE=10
    GLOBAL_LIFE_MAX=10
    # 已扣除生命值
    GLOBAL_LIFE_DEDUCT=0
    # 战斗回合
    GLOBAL_COUNT=1
    

    3、定义段位对应的随机敌人与武功

    function loadData() {
      #  Lv0 对手:1、小兵甲;2、明教教众;3、黄河四鬼;
      #declare -A map0
      #map0=(["1"]="小兵甲" ["2"]="明教教众" ["3"]="黄河四鬼" )
      LEVEL_0_AI=("小兵甲" "明教教众" "黄河四鬼")
      LEVEL_0_KongFu=("野球拳" "排云掌" "风神腿")
    
      LEVEL_1_AI=("兵丁头目" "天地会青木堂成员" "沙船帮舵主")
      LEVEL_1_KongFu=("野球拳Lv2" "葵花点穴手" "十三太保横练神功")
    
      LEVEL_2_AI=("锦衣卫" "天地会青木堂香主" "沙船帮长老")
      LEVEL_2_KongFu=("野球拳Lv3" "葵花宝典" "紫霞神功")
    
      LEVEL_3_AI=("锦衣卫伍长" "黑白双煞" "沙船帮帮主")
      LEVEL_3_KongFu=("野球拳Lv4" "三分归元气" "独孤九剑")
    
      LEVEL_4_AI=("锦衣卫百户" "铁拳无敌归辛树" "天地会陈近南")
      LEVEL_4_KongFu=("野球拳Lv5" "吸星大法" "脚底抹油")
    
      LEVEL_5_AI=("锦衣卫千户" "燕子坞慕容复" "金蛇郎君")
      LEVEL_5_KongFu=("野球拳Lv6" "斗转星移" "神行百变")
    
      LEVEL_6_AI=("右军统领" "鸠摩智" "铁掌帮裘千仞")
      LEVEL_6_KongFu=("野球拳Lv7" "天山折梅手" "一阳指")
    
      LEVEL_7_AI=("左军统领" "大理段誉" "战神乔峰")
      LEVEL_7_KongFu=("野球拳Lv8" "六脉神剑" "少林般若掌")
    
      LEVEL_8_AI=("柱国大将军" "中神通王重阳" "老顽童周伯通")
      LEVEL_8_KongFu=("野球拳Lv9" "战神图录" "左右互搏术")
    
      LEVEL_9_AI=("黄裳" "逍遥子" "武当张三丰")
      LEVEL_9_KongFu=("野球拳Lv10" "乾坤大罗移" "降龙十八掌")
    
    }
    

    4、定义段位对应的文字

    # 判断战力值
    function levelEcho() 
    {
      getLevel # 计算战力等级
      
     #  echo "GLOBAL_POWER: $GLOBAL_POWER"
     #  echo "GLOBAL_LEVEL: $GLOBAL_LEVEL"
      
      case $GLOBAL_LEVEL in
      0)
    #   GLOBAL_ECHO="【Lv0 战五渣】您还需继续磨练!"
    #    echoUtil
            echo "【Lv0 战五渣】您还需继续磨练!"
    	;;
      1)
    #    GLOBAL_ECHO="【Lv1 初出茅庐】您已不再是战五渣,继续努力!"
    #    echoUtil
            echo "【Lv1 初出茅庐】您已不再是战五渣,继续努力!"
    	;;
      2)
    
            echo "【Lv2 小试牛刀】您小试牛刀,便已在江湖上打出了名号!"
    
         ;;
      3)
            echo "【Lv3 锋芒毕露】江湖上已经有你的一席之地!"
    
         ;;
      4)
            echo "【Lv4 声名鹊起】随着你行侠仗义,在江湖中积极奔走,已经有了侠少的名号!"
    
         ;;
      5)
            echo "【Lv5 名动江湖】江湖中多年奔波,凡是江湖人,已无人不知、无人不晓您的名号!"
    
         ;;
      6)
            echo "【Lv6 一代宗师】您经过多年磨练,功法大成,声望日隆,终成一代宗师!"
    
         ;;
      7)
          echo "【Lv7 武林盟主】经多派掌门推举,你当仁不让,成为武林盟主,号令天下!"
    
         ;;
      8)
          echo "【Lv8 隐士高人】您已尝过世间繁华,厌倦武林诡谲、尔虞我诈,因此金盆洗手,退隐山林!"
         ;;
    
      9)
         echo "【Lv9 江湖传说】您虽已不在江湖,但江湖永远流传着你的传说!"
         ;;  
      *)
       # echo -e "33[91m 江湖险恶,少侠请重新来过! 33[0m"
       GLOBAL_ECHO=" 江湖险恶,少侠请重新来过!"
       echoUtil
    	;;
      esac
    }
    

    5、战斗计算

    1)获得随机对手

     cur_AI_str=LEVEL_${GLOBAL_LEVEL}_AI[$index_AI]
      # echo "cur_AI:$cur_AI"
     
      cur_AI=${!cur_AI_str} 
      GLOBAL_ECHO="你的对手【${cur_AI}】已出现,对方已经开始发起攻击"
    

    2) 输入招式

    read -p "请出招反击:【1、${!cur_kongfu0},2、${!cur_kongfu1},3、${!cur_kongfu2}】,请输入 0~2 这3个数字选择武功:" kongfu
    

    3) 获取功夫名

      cur_k_0=LEVEL_${GLOBAL_LEVEL}_KongFu[$kongfu]
    

    4 ) 战斗胜利,增加经验值、战力值

    let GLOBAL_POWER+=3 # 加速战力值增长
    

    5)战斗失败,削减生命值

    let GLOBAL_LIFE_DUCKCT++
    # 当前生命值= 最大生命值 - 已扣除生命值
    GLOBAL_LIFE=$[ $GLOBAL_LIFE_MAX - $GLOBAL_LIFE_DUCKCT ]
    

    6、循环调用战斗函数

     ……
      while :
      do
    
        # 获取AI 敌人,进行战斗
        getAI 
        is_ai=$?    
     	    ……
        ……
        if [ $GLOBAL_LIFE -le 0 ];then
           echo "你的生命值已小于0,游戏结束,请少侠重新来过!"
           exit
        fi
    
      done
    

    叁、后记

    写了一天挺累的,但是觉得还蛮有意思的。

    熟悉了不少shell的语法跟用法。

    也回忆了一下青春。

    如果觉得还不错,不推荐以下吧。

  • 相关阅读:
    平时代码中用不到设计模式?Are you kidding me?
    关于kubernetes我们还有什么可做的?
    R语言︱文本挖掘——词云wordcloud2包
    描述性统计分析-用脚本将统计量函数批量化&分步骤逐一写出
    R语言读写中文编码方式
    R画图中英文字体完美解决方案
    Python 和 R 数据分析/挖掘工具互查
    关于ř与tableau的集成---- k均值聚类
    tableau 连接R语言
    小识Tableau
  • 原文地址:https://www.cnblogs.com/yaomaomao/p/13211921.html
Copyright © 2020-2023  润新知