Perl語言 人機成語接龍遊戲及評分系統

2021-08-16 02:55:15 字數 3905 閱讀 2773

執行結果截圖:

讀取成語的檔案格式:

格式為機器出乙個成語,玩家接龍乙個,機器再次接龍,以此類推。

評分系統詳細rule為:

您一共有三次機會;

每答錯一次接龍會失去一次機會\n\t但相應的系統會給出最多十條提示成語可選以繼續進行比賽;

每個成語對應的分值由成語的「常用程度」和「可接成語數量」即難度係數來決定;

15秒內接上正確的成語則得對應分數;

超過15秒則按照冪函式對分值加權,時間越久分值越低;

本次接龍比賽預設能在三次機會內回答出10次(不考慮常用程度、難度係數和時間權重)成語的接龍(不包括提示成語)為滿分100;

最高100分 最低0分;

您可以輸入『h』選擇求助,但是依然會減少一次機會,請謹慎使用;

如果機器沒有可接的成語,算您獲勝,您可以得到附加分20分;

**部分:

main();

sub main

sub init

sub rule_show

sub readidiom=$fpy;#構造關鍵字是成語,值是首拼音的雜湊

$hash2=$lpy;#構造關鍵字是成語,值是尾拼音的雜湊

push(@},$chengyu);#由於關鍵字為首拼音的雜湊的值是若干個成語,所以構造值為陣列的雜湊

} }close(in);

#foreach $chengyu(sort keys %hash1)\n";}

#foreach $chengyu(sort keys %hash2)\n";}

#foreach(@}) }

sub time_diffi-$;

print "本次回答用時$diffi秒\t:)\n";

return $diffi;

}sub display

elsif($hash1 eq $hash2)}};

#foreach(@answers)

if(@answers==0)

else

} else

else

killed();

alive_check();

print "i will give idioms for you\n";

@answers=@}};

#foreach(@answers)#當人接錯時,這句可以列印出來所有可以接的成語

if(@answers==0)#機器上次給出的成語沒有可接的,故無法給出提示。

else

else

}print "plz choose a number\n";

$num=;

chomp($num);

print "the idiom you chose is: $answers[$num]\n";

$tpy=$hash2;#得到人選的成語的尾拼音

jielong(\$answers[$num]);

@answers_array=@};#機器將這個拼音作為首拼音查詢成語

if(@answers_array==0)

else

}} }

}sub killed

elsif($chancenum==1)

}sub zisha

sub alive_check

elsif($chancenum<=0) }

sub time_mark>15)/(sqrt($/15));}#先不設定超時會丟掉一次機會

else;}

$fina_mark=sprintf("%.3f", $fina_mark);#保留三位小數

print"\t這次回答原始分值為$分\n\t\t共耗時$秒 時間修正後的分值為$fina_mark 分\n";

return $fina_mark;

}sub idiom_mark";

@split_idiom=$=~/../g;

#foreach(@split_idiom)

#print $split_idiom[1];

if($split_idiom[1] eq $split_idiom[0] and $split_idiom[2] eq $split_idiom[3])」難度較低,初始分值為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])」難度中下,初始分值為7\n";$i_mark=7;}

#elsif($split_idiom[0]=~/[\一\二\三\四\五\六\七\八\九\十\百\千\萬]/ or

#$=~/.*[\一\二\三\四\五\六\七\八\九\十\百\千\萬]+$/)」難度為8\t";$i_mark=8;}

elsif(hz_usual(\@split_idiom))」難度偏低,初始分值為8\n";$i_mark=8;}

#對於只有乙個可接成語(2倍分值),但成語是最俗的aabb的情況(6分),也會得到12分,超過10分的設定;

else」難度適中,初始分值為10\n";$i_mark=10;}

return $i_mark;

}sub hz_usual=1;}

foreach(@)) )

} return 0; }

sub answer_difficulty}};

#print $;

$answer_num=scalar(@}}});

#print "\n@}}}.length\n";

if($answer_num==0)

if($answer_num==1);

print "\t剛剛您的回答是唯一乙個答案,難度極高\n\t故成語分值獲得2倍加權——成語分值為$w_mark\n";}

elsif($answer_num<5);

print "\t剛剛您的回答是僅僅$answer_num\個答案中的乙個,難度很高\n\t故成語分值獲得1.8倍加權——加權後成語分值為$w_mark\n";}

elsif($answer_num<13);

print "\t剛剛您的回答是$answer_num\個答案中的乙個,難度較高\n\t故成語分值獲得1.5倍加權——加權後成語分值為$w_mark\n";}

elsif($answer_num<21);

print "\t剛剛您的回答是$answer_num\個答案中的乙個,難度中等偏上\n\t故成語分值獲得1.2倍加權——加權後成語分值為$w_mark\n";}

else;

print "\t剛剛您的回答是$answer_num\個答案中的乙個,較為簡單\n\t沒有難度加成。故加權後成語分值仍為$w_mark\n";}

return $w_mark;

#最後單獨生成乙份所有包括分數變化的流程的txt檔案

#而在輸入中只產生簡潔的接龍

}sub total_sum;

}sub nomoreanswer

sub nomoreidiom_check";

if(@}}}==0)

}sub win_germore

sub jielong);

}sub show_jielongprint":)";

}

桌面接龍遊戲

問 os為?windows 2003 server 問 這台是你的個人電腦?還是公司或家人共用的電腦?自用問 這張桌布是什麼?從哪裡取得的?沒桌布,簡單就是美 問 更換桌布的頻率高嗎?心血來潮的時候就換一下,多數時候都是空白的。問 桌面上有幾多個icon?沒幾個,在家比較整齊一些,不像在單位的。問 ...

桌面接龍遊戲

問 os為?winxp 問 這台是你的個人電腦?還是公司或家人共用的電腦?公司問 這張桌布是什麼?從哪裡取得的?網上找到的一堆windows桌面主題中自帶的 問 更換桌布的頻率高嗎?幾乎不換 問 桌面上有幾多個icon?常用的,大概10多個吧 問 一堆檔案和捷徑放得亂七八糟的桌面,你看得下去嗎?正在...

1051 接龍遊戲

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond description 給出了n個單詞,已經按長度排好了序。如果某單詞i是某單詞j的字首,i j算一次接龍 兩個相同的單詞不能算接龍 你的任務是 對於輸入的單詞,找出最長的龍。輸入描述 input description...