当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]shell 写的小游戏
帖子发表于 : 2008-01-07 14:10 
头像

注册: 2006-10-12 1:21
帖子: 512
送出感谢: 0 次
接收感谢: 0 次
本人学习shell中,类似 md5大决战 写的小游戏,在此有很多问题搞不明白。想请教一下各位大侠。
1,好像是这行
eval ${1}_attack=\$[\$[\$${1}_fight + \$random_fight] \* \$[100 - \$\(echo \$${2}_speed\)] / 100]
有时会出现基数过大的错误,不知道为什么?
2,(( )) 和 $[ ] 到底有什么区别?怎么有时可以互换,有时不行?
3,shell 没有形参实参的说法?对传入的$1的更改,貌似直接就改了原数值


附件:
fight.zip [2.04 KiB]
被下载 71 次
md5.png
md5.png [ 287.84 KiB | 被浏览 952 次 ]



最后由 liujingjing5 编辑于 2008-01-07 14:23,总共编辑了 3 次
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-01-07 14:13 
头像

注册: 2006-10-12 1:21
帖子: 512
送出感谢: 0 次
接收感谢: 0 次
#!/bin/bash
#说明:运行方法 例如 ./fight 张三 李四
sleep 1
a1=$1 #a为名字
a2=$2
n1=$(echo $1 | md5sum) #n为名字的md5值
n2=$(echo $2 | md5sum)
########################################################################################################
a1_strength=$(echo $n1 | awk '{if(str=(substr($0,1,8))) print str}')#力量为md5前8位
a1_brain=$(echo $n1 | awk '{if(str=(substr($0,9,8))) print str}') #智力为9~16
a1_speed=$(echo $n1 | awk '{if(str=(substr($0,17,8))) print str}') #敏捷为17~24
a1_luck=$(echo $n1 | awk '{if(str=(substr($0,25,8))) print str}') #人品为25~32
a2_strength=$(echo $n2 | awk '{if(str=(substr($0,1,8))) print str}')
a2_brain=$(echo $n2 | awk '{if(str=(substr($0,9,8))) print str}')
a2_speed=$(echo $n2 | awk '{if(str=(substr($0,17,8))) print str}')
a2_luck=$(echo $n2 | awk '{if(str=(substr($0,25,8))) print str}')
#########################################################################################################
function getmd5() #将各属性的md5值转成两位整数
{
string=$(eval echo \$$1)
echo -en $string
str1=$(echo $string | awk '{if(str=(substr($0,1,1))) print str}')
str2=$(echo $string | awk '{if(str=(substr($0,2,1))) print str}')
str3=$(echo $string | awk '{if(str=(substr($0,3,1))) print str}')
str4=$(echo $string | awk '{if(str=(substr($0,4,1))) print str}')
str5=$(echo $string | awk '{if(str=(substr($0,5,1))) print str}')
str6=$(echo $string | awk '{if(str=(substr($0,6,1))) print str}')
str7=$(echo $string | awk '{if(str=(substr($0,7,1))) print str}')
str8=$(echo $string | awk '{if(str=(substr($0,8,1))) print str}')
eval $1=$(echo $[((str1+str2+str3+str4+str5+str6+str7+str8))*11] | awk '{if(str=(substr($0,1,2))) print str}') #将8位数的每位相加再乘以11,取前2位,得到整数
}
############################################################################################################
echo -en "\n数值分析中";sleep 1;echo -n " > ";sleep 1;echo -n " > ";sleep 1;echo -en " > ";sleep 1;echo "";echo ""
echo -e "$1 您的md5值\t\t$2 您的md5值";sleep 1
getmd5 a1_strength #调用方法来进行转换
getmd5 a1_brain
getmd5 a1_speed
getmd5 a1_luck
a1_life=$[$a1_strength*3 + (($a1_brain + $a1_speed))*2];sleep 1 #计算生命值
getmd5 a2_strength
getmd5 a2_brain
getmd5 a2_speed
getmd5 a2_luck
a2_life=$[$a2_strength*3 + (($a2_brain + $a2_speed))*2];sleep 1
##############################################################################################################
echo -e "\n\n对您解码后的数值\t\t对您解码后的数值" ; sleep 1 #打印已得的数值
echo -e "生命:$a1_life\t\t\t生命:$a2_life" ; sleep 1
echo -e "力量:$a1_strength\t\t\t力量:$a2_strength" ; sleep 1
echo -e "智力:$a1_brain\t\t\t智力:$a2_brain" ; sleep 1
echo -e "敏捷:$a1_speed\t\t\t敏捷:$a2_speed" ; sleep 1
echo -e "人品:$a1_luck\t\t\t人品:$a2_luck\n" ; sleep 1
echo -e "------战斗正式开始------\n";sleep 2
#############################################################################################################
signfirst=0 #求攻击优先标记,默认0
randomfirst=$(echo $RANDOM | awk '{if(str=(substr($0,2,1))) print str}')
#若随机数大于5则标志改为1
if [ $randomfirst -ge 5 ];then
signfirst=1
fi
#############################################################################################################
a1_max="a1_strength" #分别求得两位选手的主属性,(属性值最大的)
for mode in a1_strength a1_brain a1_speed
do
eval max=\$$a1_max
eval now=\$$mode
if [ $max -lt $now ];then
a1_max=$mode
fi
done
###################
a2_max="a2_strength"
for mode in a2_strength a2_brain a2_speed
do
eval max=\$$a2_max
eval now=\$$mode
if [ $max -lt $now ];then
a2_max=$mode
fi
done
##############################################################################################################
function attack1() ##########################################普通攻击函数
{
eval ${1}_fight=\$${1}_max #理论攻击力为最大属性值
random_fight=$(echo $RANDOM | awk '{if(str=(substr($0,2,2))) print str}') #生成随机攻击力
eval ${1}_attack=\$[\$[\$${1}_fight + \$random_fight] \* \$[100 - \$\(echo \$${2}_speed\)] / 100] #实际攻击为(理论攻击力+随机攻击力)X(1-对方敏捷/100)
eval ${2}_life=\$[\$${2}_life - \$${1}_attack] #计算被攻击者的剩余生命
eval echo -en " \$${1}\$${1}_life 发起攻击";echo -en "\t\t" ; eval echo -e " \$$2\$${2}_life 损失生命值 \$$1_attack"
echo ""
sleep 2
}

function attack2() ##########################################连击攻击函数
{
eval ${1}_fight=\$${1}_max
random_fight=$(echo $RANDOM | awk '{if(str=(substr($0,2,2))) print str}')
eval ${1}_attack=\$[\$[\$${1}_fight + \$random_fight] \* \$[100 - \$\(echo \$${2}_speed\)] / 100]
eval ${2}_life=\$[\$${2}_life - \$${1}_attack]
eval echo -e " \$${1}\$${1}_life 把\$${2}\$${2}_life 按在地上一顿暴打!!" ; sleep 1
eval echo -e " \$$2 损失生命值 \$$1_attack" ; sleep 1
eval ${2}_life=\$[\$${2}_life \- \$${1}_attack]
eval echo -e " \$$2 损失生命值 \$$1_attack"
echo ""
sleep 2
}

function attack3() ##########################################投毒攻击函数
{
eval ${2}_strength=\$[\$${2}_strength / 2] #先将被攻击者的各属性减半
eval ${2}_brain=\$[\$${2}_brain / 2]
eval ${2}_speed=\$[\$${2}_speed / 2]
eval ${2}_luck=\$[\$${2}_luck / 2]
eval echo "\$${1}向\$${2}投毒 \$${2}各属性减半"
echo "";sleep 1
eval ${1}_fight=\$${1}_max
random_fight=$(echo $RANDOM | awk '{if(str=(substr($0,2,2))) print str}')
eval ${1}_attack=\$[\$[\$${1}_fight + \$random_fight] \* \$[100 - \$\(echo \$${2}_speed\)] / 100]
eval ${2}_life=\$[\$${2}_life - \$${1}_attack]
eval echo -en " \$${1}\$${1}_life 发起攻击";echo -en "\t\t" ; eval echo -e " \$$2\$${2}_life 损失生命值 \$$1_attack"
echo ""
sleep 2
}


function fight() #############################################攻击控制主函数
{
random_luck=$(echo $RANDOM|awk '{if(str=(substr($0,2,2))) print str}')

if [ $[$(eval echo \$${2}_speed)+$random_luck] -ge 100 ];then #若被攻击者的敏捷+随机数 大于 100,直接判定攻击被闪避
eval echo -en " \$${1} 发起攻击";echo -en "\t\t" ; eval echo -e " \$$2 华丽的一个闪避" ; echo "" ;sleep 2
signfirst=$[(($signfirst+1)) % 2]
continue
fi

eval type_fight=\$[$(echo $RANDOM|awk '{if(str=(substr($0,2,2))) print str}') + \$${1}_luck]
if [ $type_fight -ge 100 ] && [ $[$type_fight % 2] -eq 0 ];then
attack2 $1 $2
elif [ $type_fight -ge 100 ] && [ $[$type_fight % 2] -eq 1 ];then
attack3 $1 $2
else
attack1 $1 $2
fi
#调整攻击优先标记
signfirst=$[(($signfirst+1)) % 2] #转换攻击者
#监视是否死人
if [ $(eval echo \$${2}_life) -le 0 ];then
eval echo "\$$2被打败了!"
break
fi
}
###############################################################################################################
while : #循环调用攻击控制函数
do
if [ $signfirst -eq 0 ];then
fight a1 a2
else
fight a2 a1
fi
done


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-01-07 14:14 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
:lol: 这么多数值计算的东东,其实不适合用Shell写的.


_________________
关注我的blog: ε==3


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-01-08 14:02 

注册: 2006-07-09 12:22
帖子: 1331
地址: 南京
送出感谢: 0 次
接收感谢: 1
$[...]在man中有说明啊,以后会废弃的;完全$((...))代替。

shell中的function,变量传进去,"$*"成了常量,你如何能改变它的值呢?

另:代码用BB帖,不然会有笑脸的。:D


页首
 用户资料  
 
5 楼 
 文章标题 : 这算什么?!
帖子发表于 : 2008-01-19 20:26 
头像

注册: 2007-11-07 14:41
帖子: 296
地址: 佳木斯
送出感谢: 0 次
接收感谢: 0 次
代码:
./fight: line 127: 22+08: 基数值过大 (error token is "08")


这是怎么回事


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译