1mj.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 1,606 行 · 第 1/5 页

C
1,606
字号
           		i=-2;
        	}
        }
 
        if (sizeof(strW) > 5){
           for (i=0;i<sizeof(strW);i+=2) {//再把刻删掉
               check=do_check_Mj(strW,strW[i..i+1]);
               if (check==3){
                  K++;
                  strW=do_delete_Mj(strW,strW[i..i+1],3);
                  i=-2;
                  }
              }
           }
           for (i=0;i<sizeof(strW);i+=2) {//再把对删掉
               check=do_check_Mj(strW,strW[i..i+1]);
               if (check==2){
                  t++;
                  strW=do_delete_Mj(strW,strW[i..i+1],2);
                  i=-2;
               }
           }
           if (strW!="") return 99;
           return t;
}

int do_touch(string str,object me)
{
        int i,check;
        mapping who;        
 
        if (!me) me=this_player();
        if (check_id(me->query("id"),"player")!="");
        else {
           command("stare "+me->query("id"));
           command("say 这牌局跟你没关系。");
           return 1;
        }
        if (!Playing){
           command("say 牌局还没开始你要摸牌去藏起来ㄚ~~");
           return 1;
        }
        //tell_object(me,"换谁摸牌:"+NowPlayerId[NowPlayer]+"\n");
        if (me->query("id")!=NowPlayerId[NowPlayer]){
           command("hammer "+me->query("id"));
           command("say 想偷牌!!没那麽容易~~");
           return 1;
        }
        if (me->query("id")==P1Data["Id"]) who=P1Data;
        else if (me->query("id")==P2Data["Id"]) who=P2Data;
        else if (me->query("id")==P3Data["Id"]) who=P3Data;
        else if (me->query("id")==P4Data["Id"]) who=P4Data;
        
        if(NowPlayerId[NowPlayer]==me->query("id") && Touched==1){
        	do_dump( who["Mj"][0..1], me);
        	return 1;
        }
        if (Touched){
           command("flop "+me->query("id"));
           command("say 打牌啦!!");
           return 1;
        }
        if (PAUSE){
           command("flop "+me->query("id"));
           command("say 等等,有人在看牌。!!");
           return 1;
        }
        
        NO_HU=0;
        NO_GON=0;
        
        if (who["Auto"]=="auto"){
           if (str=="AUTO");
           else{
             write("设定自动听牌後、不可自己摸牌。\n");
              return 1;
            }
        }
        Touched=1;
        str=List[count..count+1];
        count+=2;        
        tell_room(environment(this_object()),me->name()+"摸了一张牌。",me);
        
        if(userp(me)) tell_object(me,"你摸了一张牌。");
        //tell_object(me,"你摸到一张"+do_check_num(str,0)+"\n");
        if (who["Auto"]=="auto"){
           if (do_check_num(str,1) > 34){
              for (i=0;i<1;i++){
                   who["OutFlower"]+=str;
                   HU_F=1;
                   tell_room(environment(this_object()),me->name()+"说道:"+HIB+"花牌"+NOR+"补花!!。\n\n"+me->name()+"往後面补了一张牌。\n",me);
                   tell_object(me,"你说道:"+HIB+"花牌"+NOR+"补花!!。\n\n你往後面补了一张牌。\n");
                   str=List[end..end+1];
                   end-=2;
                   tell_object(me,"你摸到了一张"+do_check_num(str,0)+"\n");
                   if (do_check_num(str,1) > 34) i--;
              }
           }
           check=do_check_Mj(who["AutoTin"],str);
           if (check!=0){
              who["Mj"]+=str;
              who["Mj"]=sort_data(who["Mj"]);
              return do_win(str,me);
           }
           do_dump(str,me);
        }
        who["Mj"]=str+who["Mj"];
        check_flower(who);
        i=0;
        if (who["Show"]=="代码") i=3;
        if (who["Show"]=="color") i=5;
        if(userp(me)) tell_object(me,"还有"+chinese_number((end-count-16-Goned)/2)+"只牌就流局了。\n"+show_mj(who["Mj"],i));
        
        if( !userp(me) ){
        	who["Mj"]=sort_data(who["Mj"]);
        	dump_what( me ); //如果摸牌者是电脑,调用函数计算出什么牌。        	
        }
        return 1;
}
int do_pon(string str,object me)
{
        int i;
        mapping who, lastwho;
 
        if (!me) me=this_player();
        if (check_id(me->query("id"),"player")!="");
        else {
           command("stare "+me->query("id"));
           command("say 这牌局跟你没关系。");
           return 1;
        }
        if (!Playing){
           command("die "+me->query("id"));
           command("say 牌局还没开始!!碰你的头啦!!");
           return 1;
        }
        if (Touched){
           command("hammer "+me->query("id"));
           command("say 别人没打牌你怎麽碰。");
           return 1;
        }
        if (LastDumpId==me->query("id")){
           command("stare "+me->query("id"));
           command("say 那张牌是你自己打的!。");
           return 1;
        }
        if (!str) str=LastDump;
        else if (str!=LastDump) return notify_fail("那张"+do_check_num(str,0)+"已经过期了。\n");
        if (me->query("id")==P1Data["Id"]) who=P1Data;
        else if (me->query("id")==P2Data["Id"]) who=P2Data;
        else if (me->query("id")==P3Data["Id"]) who=P3Data;
        else if (me->query("id")==P4Data["Id"]) who=P4Data;
        if (who["Auto"]=="auto") return 1;
        i=do_check_Mj(who["Mj"],str);
        if (i==0) return notify_fail("你没"+do_check_num(str,0)+"这张牌要怎麽碰。\n");
        if (i < 2) return notify_fail("你手中要有两张"+do_check_num(str,0)+"才能碰。\n");
        message_vision("\n$N大叫:"+do_check_num(str,0)+"~"+HIW+"石並~~~"+NOR+"\n\n",me);        
        remove_call_out("do_touch");//不能让NPC摸牌(自从了next_data函数之后,这句好象没有用咯。:P)
        PAUSE = 0;		//取消暂停
        if(userp(me)) who["Pause"]="";//取消玩家的暂停标记
        destop+=str;		//把碰了的牌
        destop+=str;		//摆上桌面
        for (i=0;i<Play;i++) {
            if (NowPlayerId[NowPlayer]==me->query("id")) break;
            NowPlayer++;
            NowPlayer%=Play;
        }
        for (i=0;i<3;i++) who["OutPon"]+=str;
        who["Mj"]=do_delete_Mj(who["Mj"],str,2);
        who["AutoPon"]=do_delete_Mj(who["AutoPon"],str,1);
        NO_HU=1;
        NO_GON=1;
        Touched=1;
        //把碰的牌从出牌者面前拿掉!
        lastwho = next_data( LastDumpId, 0, "data");
        lastwho["Dump"] = do_delete_Mj(lastwho["Dump"], str, 1);        
        //再显示所有的牌,这样可以更好的把握!!        	还是不要吧!
        /*for(i=0; i<4; i++)
        	tell_room(environment(this_object()),next_data(LastDumpId , i, "id")+
        		"前面的牌是:\n"+show_mj(next_data(LastDumpId, i, "allout"), 5));*/
        if(userp(me)) tell_object(me, "以下是你的牌:\n");
        i=0;
        if (who["Show"]=="代码") i=3;
        if (who["Show"]=="color") i=5;        
        tell_object(me,show_mj(who["Out"]+who["OutPon"],i));
        tell_object(me,show_mj(who["Mj"],i));
        
        //如果碰的是电脑,自动调用出牌函数         
        if( !userp(me) ) call_out( "dump_what", DELAY, me );            
        
        return delete_last_dump(who["Id"]);
}
int do_restart(string str)
{
        object me=this_player();
        if (me->query("id")=="guest") return 0;
        if (str!="mj"){
           if (check_id(me->query("id"),"player")!="");
           else {
              command("stare "+me->query("id"));
              command("say 这牌局跟你没关系。");
              return 1;
           }
        }
        message_vision("$N把牌局重新设定。\n",me);
        message_vision("$N说道:牌局重新设定请用"+HIR+" addin "+NOR+"加入牌局。\n",this_object());
        NowPlayerId[0]="east com";
        NowPlayerId[1]="south com";
        NowPlayerId[2]="west com";
        NowPlayerId[3]="";
        P1Data["Id"]="east com";
        P2Data["Id"]="south com";
        P3Data["Id"]="west com";
        P4Data["Id"]="";
        P1Data["Pause"]="";
        P2Data["Pause"]="";
        P3Data["Pause"]="";
        P4Data["Pause"]="";
        Count=0;
        LookP ="";
        Play=START;
        Times=START;
        end=END;
        count=START;
        Playing=START;
        PAUSE = 0;
        return 1;
}
int wash_mj(int amount)
{
        int i,x;
        string str,countstr="";
        mapping who;
        object ob;
        mixed *X,MjE_Data = ([
"1w" : 0,"2w" : 0,"3w" : 0,"4w" : 0,"5w" : 0,"6w" : 0,"7w" : 0,"8w" : 0,"9w" : 0,
"1s" : 0,"2s" : 0,"3s" : 0,"4s" : 0,"5s" : 0,"6s" : 0,"7s" : 0,"8s" : 0,"9s" : 0,
"1t" : 0,"2t" : 0,"3t" : 0,"4t" : 0,"5t" : 0,"6t" : 0,"7t" : 0,"8t" : 0,"9t" : 0,
"ea" : 0,"so" : 0,"we" : 0,"no" : 0,"jo" : 0,"fa" : 0,"ba" : 0,
"f1" : 0,"f2" : 0,"f3" : 0,"f4" : 0,"f5" : 0,"f6" : 0,"f7" : 0,"f8" : 0
                            ]);
        if (!Play){
           command("say 没有玩家要我白洗牌!!门都没有。");
           return 1;
        }
        if (Playing){
           command("say 牌局正在进行中。");
           return 1;
        }
        command("say 我帮忙洗牌,等等谁胡要吃红喔..:)");
        if (Play<4) command("say 玩家不足四人所以不计分。");
        for(i=0; i<4; i++){
        	who = next_data( P1Data["id"], i, "data");
        	
        	who["Mj"]="";
        	who["OutGon"]="";
        	who["Out"]="";
        	who["OutPon"]="";
        	who["OutFlower"]="";
        	who["Auto"]="";
        	who["AutoTin"]="";
        	who["AutoGon"]="";
        	who["AutoPon"]="";
        	who["Dump"]="";
	}
 
        end=END;
        NO_HU=START;
        NO_GON=START;
        count=START;
        Playing=START;
        List="";
        NowPlayer=START;
        Touched=START;
        Auto=START;
        Auto_Tin=START;
        Auto_Gon=START;
        Auto_Pon=START;
        Goned=START;
        LastDump="";
        LastDumpId="";
        X = keys(MjE_Data);
        for (i=0;i<144;i++){
            x = random(sizeof(X));
            
            if (X[x]=="f1"||X[x]=="f2"||X[x]=="f3"||X[x]=="f4"||
                X[x]=="f5"||X[x]=="f6"||X[x]=="f7"||X[x]=="f8"){
                   List += X[x];
                   X -= ({X[x]});
            }
            else{               
                  MjE_Data[X[x]] = MjE_Data[X[x]] + 1;
                  List += X[x];
                  if(MjE_Data[X[x]] == 4) X -= ({X[x]});                  
            }
        }
 
//        for (i=0;i<sizeof(X);i++) printf("%s=%d ",X[i],MjE_Data[X[i]]);
	PAUSE = 0;
        command("say 嗯!!好了可以开始了来吧!!");
        if (Count) countstr="[连庄"+chinese_number(Count)+"]";
        if (!Times);
        else{
          if (Count);
          else {
            str=NowPlayerId[0];
            if (Play>1) NowPlayerId[0]=NowPlayerId[1];
            if (Play>2) NowPlayerId[1]=NowPlayerId[2];
            if (Play>3) NowPlayerId[2]=NowPlayerId[3];
            NowPlayerId[Play-1]=str;
          }
        }
        if (Times/Play == 4) Times=0;
        if (Times/Play == 3) str=HIW+"北风"+NOR;
        if (Times/Play == 2) str=HIY+"西风"+NOR;
        if (Times/Play == 1) str=HIR+"南风"+NOR;
        if (Times/Play == 0) str=HIG+"东风"+NOR;
        TIMES = str;
        i=Times;
        i%=Play;
        i++;
        message_vision("["+str+chinese_number(i)+"]牌局开始:庄家"+HIY+NowPlayerId[0]+HIR+countstr+NOR+"掷出骰子"+

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?