运行结果截图:

读取成语的文件格式:

格式为机器出一个成语,玩家接龙一个,机器再次接龙,以此类推。

评分系统详细Rule为:
您一共有三次机会;
每答错一次接龙会失去一次机会\n\t但相应的系统会给出最多十条提示成语可选以继续进行比赛;
每个成语对应的分值由成语的“常用程度”和“可接成语数量”即难度系数来决定;
15秒内接上正确的成语则得对应分数;
超过15秒则按照幂函数对分值加权,时间越久分值越低;
本次接龙比赛默认能在三次机会内回答出10次(不考虑常用程度、难度系数和时间权重)成语的接龙(不包括提示成语)为满分100;
最高100分 最低0分;
您可以输入‘h’选择求助,但是依然会减少一次机会,请谨慎使用;
如果机器没有可接的成语,算您获胜,您可以得到附加分20分;

代码部分:

main();sub main{
init();
Rule_show();
ReadIdiom("IdiomPY.txt");
#time_mark(\14.2,\2);
display();
#idiom_mark(\"一心一意");
#answer_Difficulty(\"一心一意",\15);
}
sub init{
$chanceNum=3;
$total_mark=0;
$totalround=0;
@jielongIdioms=();
}sub Rule_show{print"RULE:您一共有三次机会\n";print"RULE:每答错一次接龙会失去一次机会\n\t但相应的系统会给出最多十条提示成语可选以继续进行比赛\n";print "RULE:每个成语对应的分值由成语的“常用程度”和“可接成语数量”即难度系数来决定\n";print "RULE:15秒内接上正确的成语则得对应分数\n";print "RULE:超过15秒则按照幂函数对分值加权,时间越久分值越低\n";print "RULE:本次接龙比赛默认能在三次机会内回答出10次(不考虑常用程度、难度系数和时间权重)成语的接龙(不包括提示成语)为满分100";print "RULE:最高100分 最低0分\n";print "RULE:您可以输入‘h’选择求助,但是依然会减少一次机会,请谨慎使用\n";print "RULE:如果机器没有可接的成语,算您获胜,您可以得到附加分20分;\n\n"}sub ReadIdiom{my($file)=@_;open(in,$file);while(<in>){chomp;if(/^(\S+) ([^_]+)\d.*_([^_]+)\d$/){#根据文件IdiomPY.txt中的格式利用正则表达式提取所需内容$chengyu=$1;$FPY=$2;$LPY=$3;push(@array,$chengyu);#print "$chengyu=>$FPY=>$LPY\n";$hash1{$chengyu}=$FPY;#构造关键字是成语,值是首拼音的哈希$hash2{$chengyu}=$LPY;#构造关键字是成语,值是尾拼音的哈希push(@{$hash3{$FPY}},$chengyu);#由于关键字为首拼音的哈希的值是若干个成语,所以构造值为数组的哈希}}close(in);#foreach $chengyu(sort keys %hash1){print "$chengyu $hash1{$chengyu}\n";}#foreach $chengyu(sort keys %hash2){print "$chengyu $hash2{$chengyu}\n";}#foreach(@{$hash3{"an"}}){print "$_\n";}}
sub time_diffi{
my($after,$bef)=@_;
my($diffi)=${$after}-${$bef};
print "本次回答用时$diffi秒\t:)\n";
return $diffi;
}sub display{$i=int(rand()*@array.length);#随机产生一个数组的下标$machine=@array[$i];#jielong(\$machine);#print "Machine".$machine;jielong(\$machine);print"game start!\n the first idiom is $machine\n";#机器随机给出一个成语,让用户接print"plz input an idiom or input 'q' to exit\nPlayer:";$prev_time=time;while(1){alive_check();noMoreIdiom_check(\$machine);#玩家没什么可接的,给出提示,只能继续输入答案并失去一次机会$input =<stdin>;chomp($input);if($input eq "q"){zisha();alive_check();last;}elsif($hash1{$input} eq $hash2{$machine}){#如果人接的成语的首拼音恰好是机器给出成语的尾拼音,证明接对了 $later_time= time;#从1970.1.1到现在的秒数#print $later_time;#$howlong=$later_time-$prev_time;jielong(\$input);my($time_waste)= time_diffi(\$later_time,\$prev_time);my ($init_mark)=idiom_mark(\$input);#调用判断成语常用程度的函数my($weighted_mark)=answer_Difficulty(\$machine,\$init_mark);my($final_mark)=time_mark(\$weighted_mark,\$time_waste);#调用时间修正分数的函数#print "用时$howlong\t";total_sum($final_mark);print"the answer is right,plz input an idiom\n";@answers=@{$hash3{$hash2{$input}}};#foreach(@answers){print"$_\n";}if(@answers==0){print "there is not an idiom\nYou win.\n";win_gerMore();#机器没什么可接的则玩家得到20+额外分。比赛结束last;}else{ $machine=$answers[rand()*@answers];print "Machine:$machine\n";jielong(\$machine);$prev_time=time;}}else{if($input eq "h"){print "您选择了求助\n";}else{print "the answer is wrong.";}killed();alive_check();print "I will give idioms for you\n";@answers=@{$hash3{$hash2{$machine}}};#foreach(@answers){print "$_\n";}#当人接错时,这句可以打印出来所有可以接的成语if(@answers==0){print "there ia not an idiom\n本次接龙结束!\n";last;}#机器上次给出的成语没有可接的,故无法给出提示。else {for($i=0;$i<@answers;$i++){if($i==10){last;}else {print "($i)$answers[$i]\n";}}print "plz choose a number\n";$num=<stdin>;chomp($num);print "The idiom you chose is: $answers[$num]\n";$TPY=$hash2{$answers[$num]};#得到人选的成语的尾拼音jielong(\$answers[$num]);@answers_array=@{$hash3{$TPY}};#机器将这个拼音作为首拼音查找成语if(@answers_array==0){noMoreAnswer();}else{$machine=$answers_array[rand()*@answers_array];print "Machine:$machine\n";jielong(\$machine);$prev_time=time;}}}}
}
sub killed{$chanceNum--;if($chanceNum>1){print "\n   :(您当前失去一次机会,还有$chanceNum 次机会\n";}elsif($chanceNum==1){print "\n   :(您又失去一次机会,再答错游戏将会结束\n"}
}
sub zisha{$chanceNum--;$chanceNum--;$chanceNum--;$q=1;}
sub alive_check{if($q==1){    print"游戏玩家已选择退出\n";print"您共回答$totalround\个成语,共得$total_mark\分\n";show_jielong();last;}elsif($chanceNum<=0){print"您的机会已用完,游戏结束!\n";print"您共使用了3次机会,共回答$totalround\个成语,共得$total_mark\分\n";show_jielong();last;}}
sub time_mark{my($mark,$time_use)=@_;my($fina_mark);if(${$time_use}>15){$fina_mark=${$mark}/(sqrt(${$time_use}/15));}#先不设置超时会丢掉一次机会else{$fina_mark=${$mark};}$fina_mark=sprintf("%.3f", $fina_mark);#保留三位小数print"\t这次回答原始分值为${$mark}分\n\t\t共耗时${$time_use}秒 时间修正后的分值为$fina_mark 分\n";return $fina_mark;
}
sub idiom_mark{my($idiom)=@_;my($i_mark);#print"${$idiom}";@split_Idiom=${$idiom}=~/../g;#foreach(@split_Idiom){print "$_ ";}#print $split_Idiom[1];if($split_Idiom[1] eq $split_Idiom[0] and $split_Idiom[2] eq $split_Idiom[3]){print "\t成语“${$idiom}”难度较低,初始分值为6\n";$i_mark=6;}elsif($split_Idiom[1] eq $split_Idiom[0] or $split_Idiom[2] eq $split_Idiom[3] or $split_Idiom[1] eq $split_Idiom[3] or $split_Idiom[0] eq $split_Idiom[2]){print "\t成语“${$idiom}”难度中下,初始分值为7\n";$i_mark=7;}#elsif($split_Idiom[0]=~/[\一\二\三\四\五\六\七\八\九\十\百\千\万]/ or#${$idiom}=~/.*[\一\二\三\四\五\六\七\八\九\十\百\千\万]+$/){print"成语“${$idiom}”难度为8\t";$i_mark=8;}elsif(HZ_usual(\@split_Idiom)){print"\t成语“${$idiom}”难度偏低,初始分值为8\n";$i_mark=8;}#对于只有一个可接成语(2倍分值),但成语是最俗的AABB的情况(6分),也会得到12分,超过10分的设定;else{print"\t成语“${$idiom}”难度适中,初始分值为10\n";$i_mark=10;}return $i_mark;}
sub HZ_usual{#判断是否存在简单的字,以此降低成语分值my($ch)=@_;#传进来分隔号的成语数组@HZ=("一","二","三","四","五","六","七","八","九","十","百","千","万");foreach(@HZ){$HZ_u{$_}=1;}foreach(@{$ch}){if( defined($HZ_u{$_}) ){return 1;}}return 0;}
sub answer_Difficulty{my($mach,$init_mark)=@_;my($answer_num ,$w_mark);#print @{$hash3{$hash2{"一心一意"}}};#print ${$mach};$answer_num=scalar(@{$hash3{$hash2{${$mach}}}});#print "\n@{$hash3{$hash2{${$mach}}}}.length\n";if($answer_num==0){noMoreAnswer();}if($answer_num==1){$w_mark=2*${$init_mark};print "\t刚刚您的回答是唯一一个答案,难度极高\n\t故成语分值获得2倍加权——成语分值为$w_mark\n";}elsif($answer_num<5){$w_mark=1.8*${$init_mark};print "\t刚刚您的回答是仅仅$answer_num\个答案中的一个,难度很高\n\t故成语分值获得1.8倍加权——加权后成语分值为$w_mark\n";}elsif($answer_num<13){$w_mark=1.5*${$init_mark};print "\t刚刚您的回答是$answer_num\个答案中的一个,难度较高\n\t故成语分值获得1.5倍加权——加权后成语分值为$w_mark\n";}elsif($answer_num<21){$w_mark=1.2*${$init_mark};print "\t刚刚您的回答是$answer_num\个答案中的一个,难度中等偏上\n\t故成语分值获得1.2倍加权——加权后成语分值为$w_mark\n";}else{$w_mark=${$init_mark};print "\t刚刚您的回答是$answer_num\个答案中的一个,较为简单\n\t没有难度加成。故加权后成语分值仍为$w_mark\n";}return $w_mark;
#最后单独生成一份所有包括分数变化的流程的txt文件
#而在输入中只产生简洁的接龙}
sub total_sum{my($temp_mark)=@_;$total_mark+=$temp_mark;#print "故您"$totalround++;if($total_mark>=100){$total_mark==100};
}
sub noMoreAnswer{print"提示:!!!机器给出的当前成语没有可接的成语\n本次接龙结束!\n";print"您共使用了3次机会,共回答$totalround\个成语,共得$total_mark\分";show_jielong();last;
}
sub noMoreIdiom_check{
my($mach)=@_;
#print "123${$mach}";
if(@{$hash3{$hash2{${$mach}}}}==0){noMoreAnswer();}
}
sub win_gerMore{
print"你可以得到附加分20分!\n";total_sum(\20);$totalround--;
}
sub jielong{
#把所有接到的成语放到一个数组中,最后遍历输出整个成语的流程!
my($temp_ma)=@_;
push(@jielongIdioms,${$temp_ma});
}
sub show_jielong{print"整个接龙过程如下:\n\t";foreach(@jielongIdioms){print "$_-->";}print":)";
}

Perl语言:人机成语接龙游戏及评分系统相关推荐

  1. c语言成语接龙编程,C语言完成成语接龙小游戏

    用C语言实现成语接龙小游戏(新手上路,大神勿喷) 1.首先需要找到一个成语库(从网上下载即可,保存为.txt文件) 2.整体思路如下 由于要用的成语保存在文件里,一边用一边读取会降低代码的效率,所以我 ...

  2. C语言接龙,C语言完成成语接龙小游戏

    用C语言实现成语接龙小游戏(新手上路,大神勿喷) 1.首先需要找到一个成语库(从网上下载即可,保存为.txt文件) 2.整体思路如下 由于要用的成语保存在文件里,一边用一边读取会降低代码的效率,所以我 ...

  3. C语言完成成语接龙小游戏

    用C语言实现成语接龙小游戏(新手上路,大神勿喷) 1.首先需要找到一个成语库(从网上下载即可,保存为.txt文件) 2.整体思路如下 由于要用的成语保存在文件里,一边用一边读取会降低代码的效率,所以我 ...

  4. Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!

    英语单词学习应用 周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多.本来周末打算照着扇贝/极光单词,写一个英语单词自测工具.但苦 ...

  5. 安卓大作业-字典App 可以查询汉字 可以玩成语接龙游戏

    字典App(下载链接在文末) 本App包含汉字查询,拼音查询,部首查询,成语查询,查询的可以收藏,还有成语接龙游戏,游戏可以闯关计时,所有功能均能正常使用,适合初学者学习使用,详情请看下图: 点我下载 ...

  6. python成语接龙到为所欲为_为所欲为是第一个成语开头的成语接龙游戏

    为所欲为是第一个成语开头的成语接龙游戏 日期:2018-10-30 12:22 人气: 次 来源:未知 → 为所欲为 → 为富不仁 → 仁者能仁 → 仁同一视 → 视同路人 → 人无远虑 → 虑周藻密 ...

  7. 学富五车的你,敢迎战Python开发的成语接龙游戏吗?

    成语接龙 今天难得下班早,不用做公司的末班车,和同事乘公交回家.中途上来几个学生,相互在玩着成语接龙游戏.说是成语,但词汇却真是不堪入耳. 6月高考的前一天,我发布的一篇文章,决战高考,帮你秒变成语之 ...

  8. 学富五车的你,敢来迎战Python开发的成语接龙游戏吗?

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 真者,精诚之至也,不精不诚,不能动 ...

  9. Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!

    明天你好,我叫干不倒 一直比较喜欢看<欢乐喜剧人>,其中有一期小沈龙的节目,名字叫明天你好,我叫干不倒... 父亲的身体一直不好,因为常年的酗酒抽烟,患脑梗好些年头了,周末病情有些恶化,住 ...

最新文章

  1. 【Flask】CORS同源问题解决
  2. python atm作业详解_Python ATM功能实现代码实例
  3. tensorflow keras 对应版本
  4. mybatis之一对多
  5. 【模型解读】从2D卷积到3D卷积,都有什么不一样
  6. SpringMVC拦截器-拦截器的作用
  7. OSCACHE(转)
  8. 基于Fabric的性能测试与调优实践
  9. java生成三角网_源码:基于离散点的构TIN算法(三角网)
  10. 数据结构期末复习(四)
  11. python os.open禁止写入缓存区_Python-设置文件缓冲类型
  12. Matplotlib简介和pyplot的简单使用——subplot
  13. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ④ 初认识阿里天猫精灵官方Genie BT mesh Stack框架, windows平台搭建打印Hello World !
  14. 百词斩不复习_有人用过百词斩和不背单词两款背单词app吗?良心推荐哪一个好一点?...
  15. centos du 命令使用
  16. UPC6605 所罗门王的宝藏
  17. CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION
  18. H5页面调起关注微信公众号的方法
  19. MAXIMO语言切换,以及设置多语言
  20. Ubuntu 20.04安装velodyne_simulator

热门文章

  1. 动画演示:Excel中批量生成标签,也可以生成送货单、成绩通知单
  2. 明日之后茅斯沼泽宝箱位置及开箱技巧:花了三个小时整理的最全宝箱位置
  3. dnf服务器喇叭涨价消息,关于近期服务器喇叭价格走低的一些吐槽
  4. 数据库系统|实验课准备APPserv安装以及问题解决
  5. 从高考到程序员,就这样慢慢的生活挺好
  6. 图灵奖获得者罗杰·瑞迪:AI不可能取代人类
  7. Ant中build.xml对多module部署配置
  8. 分享:为什么说精细化管理才是餐饮软件的关键?
  9. 【论文翻译】AFFormer:Head-Free Lightweight Semantic Segmentation with Linear Transformer
  10. 社区团购怎么做?相对传统电商有哪些优势?