我用shell寫了個mud遊戲:武林群俠傳

姚毛毛 發表於 2020-06-30

零、前言

學習shell的時候,無聊的我,寫了個簡單版的文字mud,暫且叫武林群俠傳吧。可能90後都不知道文字mud是什麼了……哈哈

壹、效果

先看下效果吧,GIF圖如下

在這裡插入圖片描述

文字效果如下:

[[email protected] 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 "\033[91m 江湖險惡,少俠請重新來過! \033[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的語法跟用法。

也回憶了一下青春。

如果覺得還不錯,不推薦以下吧。