1mj.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 1,606 行 · 第 1/5 页
C
1,606 行
who["Mj"]=sort_data(who["Mj"]);
Mj+=show_mj(who["Mj"],0);
Mj+="所胡的牌是:"+HIR+do_check_num(LastDump,0)+NOR;
Mj+="\n放枪者:"+HIB+LastDumpId+NOR+"\n";
}else{
Mj+=show_mj(who["Mj"],0);
if (str) Mj+="所自摸的牌是:"+HIR+do_check_num(str,0)+NOR+"\n";
}
}
Playing=0;
tell_room(environment(this_object()),Mj);
Tc="";
//if (do_check_win(who["Mj"])==1||i==1){
if (do_check_win(sort_data(who["Mj"]))==1||i==1){//为了符合右边放牌的习惯……
//算台///////////////////////////////////
mixed MjT = ([
"@1" : ({ "庄家", 1 }),"@2" : ({ "自摸", 1 }),"@3" : ({ "花牌", 1 }),"@4" : ({ "门清", 1 }),
"@5" : ({ "东风", 1 }),"@6" : ({ "南风", 1 }),"@7" : ({ "西风", 1 }),"@8" : ({ "北风", 1 }),
"@9" : ({ "红中", 1 }),"@0" : ({ "青发", 1 }),"@a" : ({ "白板", 1 }),"@G" : ({ "一丕口", 1 }),
"@b" : ({ "海底摸月", 1 }),"@c" : ({ "海底捞鱼", 1 }),"@d" : ({ "平胡", 2 }),"@e" : ({ "东风东", 2 }),
"@f" : ({ "南风南", 2 }),"@g" : ({ "西风西", 2 }),"@h" : ({ "北风北", 2 }),"@i" : ({ "全求人", 2 }),
"@j" : ({ "叁暗刻", 2 }),"@H" : ({ "二丕口", 2 }),"@k" : ({ "叁杠子", 2 }),"@B" : ({ "春夏秋冬", 2 }),
"@C" : ({ "梅兰菊竹", 2 }),"@l" : ({ "门清自摸", 3 }),"@m" : ({ "碰碰胡", 4 }),"@n" : ({ "混一色", 4 }),
"@o" : ({ "小叁元", 4 }),"@p" : ({ "四暗刻", 6 }),"@q" : ({ "清一色", 8 }),"@r" : ({ "字一色", 8 }),
"@s" : ({ "七对子", 8 }),"@t" : ({ "大叁元", 8 }),"@u" : ({ "五暗刻", 8 }),"@F" : ({ "小四喜", 8 }),
"@D" : ({ "七抢一", 8 }),"@E" : ({ "绿一色", 16 }),"@v" : ({ "大四喜", 16 }),"@w" : ({ "天胡", 16 }),
"@x" : ({ "地胡", 16 }),"@y" : ({ "人胡", 16 }),"@z" : ({ "国士无双", 16 }),"@A" : ({ "八仙过海", 16 }),
"@J" : ({ "清老头", 8 }),"@I" : ({ "混老头", 4 }),
]);//H
get_tc(who);
////////////////
str="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
for (i=0;i<sizeof(Tc);i+=2){
str+=sprintf("\t\t\t%-12s%8s 台\n",MjT[Tc[i..i+1]][0],chinese_number(MjT[Tc[i..i+1]][1]));
j+=MjT[Tc[i..i+1]][1];
}
if (Count){
str+=sprintf("\t\t\t%-12s%8s 台\n","连"+chinese_number(Count)+"拉"+chinese_number(Count),chinese_number(Count*2));
j+=Count*2;
}
str+=sprintf("\t\t\t%20s\n","总台数:"+chinese_number(j+1)+" 台");
str+="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
tell_room(environment(this_player()),str);
if (query("ipu") < 1)
{
if (userp(me))
{
obn=new("/clone/money/gold");
obn->set_amount(2*j+4);
obn->move(me);
me->add("combat_exp",30*j+10);
me->add("potential",20*j+5);
}
}
/////////////
if (!Touched){
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
winner[1]+=j;
set_mjdata(me,winner);
met=present(LastDumpId, environment(this_object()));
if (!met) met=find_player(LastDumpId);
if (!met);
else{
if (!winner=get_mjdata(LastDumpId)) winner=({0,0,0,0});
winner[1]-=j; //战绩
winner[3]++; //放枪
set_mjdata(met,winner);
}
for (i=0;i<Play;i++){
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
else{
if (!winner=get_mjdata(NowPlayerId[i])) winner=({0,0,0,0});
winner[0]++; //局数
set_mjdata(met,winner);
}
}
}
}else{
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
winner[0]++;
winner[1]+=(j*3);
winner[2]++;
set_mjdata(me,winner);
for (i=0;i<Play;i++){
if (NowPlayerId[i]==me->query("id")) continue;
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
else{
if (!winner=get_mjdata(NowPlayerId[i])) winner=({0,0,0,0});
winner[0]++;
winner[1]-=j;
set_mjdata(met,winner);
}
}
}
}
if (NowPlayerId[0]==who["Id"]) Count++;
else{
Times++;
Count=0;
}
}else{
command("sigh "+who["Id"]);
message_vision("$N说道:玩家 ["+HIR+who["Id"]+HIG+"] 言乍~ 古月~~~"+NOR+"。\n",this_object());
Times++;
Count=0;
if (Play==4){
if (!winner=get_mjdata(me->query("id"))) winner=({0,0,0,0});
if (NowPlayerId[NowPlayer]==who["Id"]&&Touched){
if (who["Out"]==""&&who["OutPon"]==""){
winner[1]-=24;
j=-24;
}else {
winner[1]-=18;
j=-18;
}
}else{
if (who["Out"]==""&&who["OutPon"]==""){
winner[1]-=6;
j=-6;
}else{
winner[1]-=5;
j=-5;
}
}
////////////////
str="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
str+=sprintf("\t\t\t%-12s%8s 台\n","言乍古月",chinese_number(j));
str+=sprintf("\t\t\t%20s\n","总台数:"+chinese_number(j+5)+" 台");
str+="\t\t\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";
tell_room(environment(this_player()),str);
/////////////
set_mjdata(me,winner);
for (i=0;i<Play;i++){
met=present(NowPlayerId[i], environment(this_object()));
if (!met) met=find_player(NowPlayerId[i]);
if (!met);
else{
if (!winner=get_mjdata(NowPlayerId[i])) winner=({0,0,0,0});
winner[0]++;
set_mjdata(met,winner);
}
}
}
}
Mj="\n[0;1;36;46m ";
for (i=0; i<26; i++) Mj+=" ";
Mj+="[1;36;46m [0m\n";
Mj+="[1;36;46m [0;36m "+HIW+"中[0m文名字 [1m已[0m玩局数 [1m总[0m战迹 [1m自[0m摸次数 [1m放[0m枪次数[1;36;46m [0m\n";
for (i=0;i<Play;i++){
if (Play==4) winner=get_mjdata(NowPlayerId[i]);
// Mj+=sprintf("[1;36;46m [0;36m [1;37m%12s [33m%8d [35m%6d [32m%8d [34m%8d[1;36;46m [0m\n",
// NowPlayerId[i],winner[0],winner[1],winner[2],winner[3]);
}
Mj+="[1;36;46m ";
for (i=0; i<26; i++) Mj+=" ";
Mj+="[46m\[0m\n";
if (Play==4) tell_room(environment(this_object()),Mj);
call_out( "wash_mj", 3, Play);
return 1;
}
int do_check_win(string str)
{
int size=strlen(str),i,check;
int t,k,W,T,S,Sp;
string tempW="",tempT="",tempS="",tempB="";
string Special="1w9w1s9s1t9teasowenojofaba";
K=0;
if (size > 33){
if (do_check_Mj(str,"ea")&&do_check_Mj(str,"so")&&do_check_Mj(str,"we")&&do_check_Mj(str,"no")&&
do_check_Mj(str,"jo")&&do_check_Mj(str,"fa")&&do_check_Mj(str,"ba")&&
do_check_Mj(str,"1w")&&do_check_Mj(str,"9w")&&do_check_Mj(str,"1s")&&
do_check_Mj(str,"9s")&&do_check_Mj(str,"1t")&&do_check_Mj(str,"9t")){
//先删掉13只
for (i=0;i<sizeof(Special);i+=2) {
if (do_check_Mj(str,Special[i..i+1])){
str=do_delete_Mj(str,Special[i..i+1],1);
}
}
//查还有没13么中的牌只
for (i=0;i<sizeof(Special);i+=2) {
if (do_check_Mj(str,Special[i..i+1])){
Sp++;
}
}
if (Sp==1){
for (i=0;i<sizeof(Special);i+=2) {
if (do_check_Mj(str,Special[i..i+1])){
str=do_delete_Mj(str,Special[i..i+1],1);
t++;
Tc+="@z";//13么
}
}
}
else if (Sp==2){
for (i=0;i<sizeof(str);i+=2){
if (do_check_Mj(str,str[i..i+1])==2){
str=do_delete_Mj(str,str[i..i+1],1);
Sp=0;
t++;
}
}
if (Sp!=0){
if (str[0..1]+1==str[2..3]){
str=do_delete_Mj(str,str[6..7],1);
t++;
}else{
str=do_delete_Mj(str,str[0..1],1);
t++;
}
}
}
}else{
for (i=0;i<sizeof(str);i+=2){
if (do_check_Mj(str,str[i..i+1])==2) Sp++;
else if (do_check_Mj(str,str[i..i+1])==3) check++;
else if (do_check_Mj(str,str[i..i+1])==4) Sp++;
}
if (Sp==14&&check==3){
for (i=0;i<sizeof(str);i+=2){
if (do_check_Mj(str,str[i..i+1])==2){
str=do_delete_Mj(str,str[i..i+1],2);
i=-2;
}
else if (do_check_Mj(str,str[i..i+1])==4){
str=do_delete_Mj(str,str[i..i+1],4);
i=-2;
}
else if (do_check_Mj(str,str[i..i+1])==3) t++;
}
t=1;
Tc+="@s";//7对子
}
}
}
while(size--){
size--;
if (do_check_num(str[size..size+1],1) < 10) tempW+=str[size..size+1];
else if (do_check_num(str[size..size+1],1) < 19) tempT+=str[size..size+1];
else if (do_check_num(str[size..size+1],1) < 28) tempS+=str[size..size+1];
else tempB+=str[size..size+1];
}
if (tempB!=""){
for (i=0;i<strlen(tempB);i+=2){//
check=do_check_Mj(tempB,tempB[i..i+1]);
if (check==1) return 0;
else if (check==2){
tempB=do_delete_Mj(tempB,tempB[i..i+1],2);
t++;
i=-2;
}else if (check==3){
tempB=do_delete_Mj(tempB,tempB[i..i+1],3);
K++;
i=-2;
}
}//
}
if (tempW!="") W=check_hu(tempW);
if (tempT!="") T=check_hu(tempT);
if (tempS!="") S=check_hu(tempS);
if (K==3) Tc+="@j";//叁暗刻
else if (K==4) Tc+="@p";//四暗刻
else if (K==5) Tc+="@u";//五暗刻
if (W+T+S+t==1) return 1;
return 0;
}
int check_hu(string strW)
{
int i,j,check;
int k,t;
int A,B,C,D,E,F;
for (i=0;i<sizeof(strW);i+=2) {//再把顺子删掉
A=do_check_num(strW[i..i+1],2);
B=do_check_num(strW[i+2..i+3],2);
C=do_check_num(strW[i+4..i+5],2);
D=do_check_num(strW[i+6..i+7],2);
E=do_check_num(strW[i+8..i+9],2);
F=do_check_num(strW[i+10..i+11],2);
if (sizeof(strW) > 11 &&do_check_num(strW[i-2..i-1],2)!=A&&A+1==B&&B==C&&C+1==D&&D==E&&E+1==F
||do_check_num(strW[i-2..i-1],2)!=A&&A==B&&B+1==C&&C==D&&D+1==E&&E==F){
if (A==B&&B+1==C&&C==D&&D+1==E&&E==F){
if (do_check_Mj(Tc,"@G")==1){
Tc=do_delete_Mj(Tc,"@H",1);
Tc+="@H";
}else Tc+="@G";
}
for (j=0;j<6;j++) { //删掉顺子1 22 33 4 && 22 33 44
strW=do_delete_Mj(strW,strW[i..i+1],1);
}
i=-2;
}
else if (A+1==B&&B==C&&C==D&&D==E&&E+1==F){
for (j=0;j<2;j++) { //删掉顺子1 2 2 2 2 3
strW=do_delete_Mj(strW,strW[i..i+1],1);
}
strW=do_delete_Mj(strW,strW[i+6..i+7],1);
i=-2;
}
else if (sizeof(strW) > 9 && A+1==B&&B==C&&C==D&&D+1==E){
//删掉顺子12223中的1 2 3
strW=do_delete_Mj(strW,strW[i..i+1],1);
strW=do_delete_Mj(strW,strW[i..i+1],1);
strW=do_delete_Mj(strW,strW[i+4..i+5],1);
i=-2;
}
else if (sizeof(strW) > 9 && A==B&&B+1==C&&C+1==D&&D+1==E){
for (j=0;j<3;j++) { //删掉顺子11234中的2 3 4
strW=do_delete_Mj(strW,strW[i+4..i+5],1);
}
i=-2;
}
else if (sizeof(strW) > 5 && A+1==B&&B+1==C){
for (j=0;j<3;j++) { //删掉顺子123中的1 2 3
strW=do_delete_Mj(strW,strW[i..i+1],1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?