1. 程式人生 > 實用技巧 >我用shell寫了個mud遊戲:武林群俠傳

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

零、前言

學習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

叄、後記

程式碼已上傳git,後臺回覆github可獲取。

寫了一天挺累的,但是覺得還蠻有意思的。

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

也回憶了一下青春。

如果覺得還不錯,不妨轉發、在看一下吧。