1mj.c

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

C
1,606
字号
           ponid=check_id(str,"tin");
           if (ponid!=""){
              me=present(ponid, environment(this_object()));
              if (!me) me=find_player(ponid);
              if (!me) return 1;
              return do_win(str,me);
           }
        }
        if (Auto_Gon){
           ponid=check_id(str,"gon");
           if (ponid!=""){
              me=present(ponid, environment(this_object()));
              if (!me) me=find_player(ponid);
              if (!me) return 1;
              do_gon(str,me);
           }
        }
        if (Auto_Pon){
           ponid=check_id(str,"pon");
           if (ponid!=""){
              me=present(ponid, environment(this_object()));
              if (!me) me=find_player(ponid);
              if (!me) return 1;
              do_pon(str,me);
           }
        }
        if (count==(end-16-Goned)){
           Playing=0;
           Count++;
           message_vision("$N说道:此局"+HIY+"流局"+NOR+"请再重新开始 "+HIR+"start"+NOR+" 。\n",this_object());
           str="所剩下的牌只有:"+show_mj(List[count..end],2)+"\n";
           tell_room(environment(this_object()),str);
           if (Play==4){
              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);
                  }
              }
           }
           return 1;
        }
        if (Auto){
           if (NowPlayerId[NowPlayer]==P1Data["Id"]) who=P1Data;
           else if (NowPlayerId[NowPlayer]==P2Data["Id"]) who=P2Data;
           else if (NowPlayerId[NowPlayer]==P3Data["Id"]) who=P3Data;
           else if (NowPlayerId[NowPlayer]==P4Data["Id"]) who=P4Data;
           if (who["Auto"]=="auto"){
              me=present(NowPlayerId[NowPlayer], environment(this_object()));
              if (!me) me=find_player(NowPlayerId[NowPlayer]);
              if (!me) return 1;
              do_touch("AUTO",me);
           }
        }
        
        if(npc_action(me)) return 1;
        else {        
        //如果下一个出牌的是电脑,自动调用摸牌函数
        	PAUSE = 0;
        	str = me->query("id");
        	if( !userp(next_data(str, 1, "player")) ) 
        		do_touch( 0, next_data(str, 1, "player") );
        }
        
        return 1;
}
int do_eat(string str, object me)
{
        int LastDumpMan,i;
        string num1,num2;        
        mapping who, lastwho;
        if(!me) me=this_player();
 	 	
        if (!str || sscanf(str,"%s %s",num1,num2)!=2) return 0;
        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 (!LastDump || LastDump==""){
           command("hammer "+me->query("id"));
           command("say 摸牌吧。");
           return 1;
        }
        if (Touched){
           command("flop "+me->query("id"));
           command("say 打牌啦!!");
           return 1;
        }
        if (do_check_eat(num1,num2,LastDump)==0){
           command("flop "+me->name());
           command("say 你眼精花了ㄚ!!这样也能吃。");
           return 1;
        }
        if (num1==num2){
           command("flop "+me->name());
           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;
        LastDumpMan=do_check_Mj(MjE,num1);
        if (LastDumpMan==0) return notify_fail("没有["+num1+"]这种代码。\n");
        LastDumpMan=do_check_Mj(MjE,num2);
        if (LastDumpMan==0) return notify_fail("没有["+num2+"]这种代码。\n");
        LastDumpMan=do_check_Mj(who["Mj"],num1);
        if (LastDumpMan==0) return notify_fail("你没"+do_check_num(num1,0)+"这张牌。\n");
        LastDumpMan=do_check_Mj(who["Mj"],num2);
        if (LastDumpMan==0) return notify_fail("你没"+do_check_num(num2,0)+"这张牌。\n");
 message_vision("\n$N拿出了一张"+HIG+do_check_num(num1,0)+NOR+
                      "与一张"+HIY+do_check_num(num2,0)+NOR+
                      "吃下了"+HIR+do_check_num(LastDump,0)+NOR+"。\n\n",me);
        who["Out"]+=sort_data(num2+num1+LastDump);
        //who["Out"]+=LastDump;
        //who["Out"]+=num1;
        who["Mj"]=do_delete_Mj(who["Mj"],num1,1);
        who["Mj"]=do_delete_Mj(who["Mj"],num2,1);
        Touched=1;
        NO_HU=1;
        NO_GON=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"), 6));*/
       	tell_object(me,"以下是你的牌:\n");
       	i=0;
        if (who["Show"]=="代码") i=3;
        if (who["Show"]=="color") i=5;
        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_gon(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("say 牌局还没开始!!");
           return 1;
        }
        if (LastDumpId==me->query("id")){
           command("stare "+me->query("id"));
           command("say 那张牌是你自己打的!。");
           return 1;
        }
        if (Touched && NowPlayerId[NowPlayer]!=me->query("id")){
           command("hammer "+me->query("id"));
           command("say 别人没打牌你怎麽杠。");
           return 1;
        }
        if (!str) str=LastDump;
 
        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==1){
           if (!Touched) return notify_fail("你还没摸牌。\n");
           i=do_check_Mj(who["OutPon"],str);
           if (!i) return notify_fail("你只有一张不能杠  。\n");
           if (NO_GON) return notify_fail("这样无法杠牌。\n");
              message_vision("\n$N说道:"+HIB+"木工"+NOR+"~~~\n\n",me);
              who["Mj"]=do_delete_Mj(who["Mj"],str,1);
              destop+=str;		//杠完这牌当然要到桌面上来咯
              sort_data(who["OutPon"]+=str);
              str=List[end..end+1];
              end-=2;
              Goned++;
              message_vision("\n$N从後面补了一张牌。\n\n",me);
              printf("你补到一张%s\n",do_check_num(str,0));
              i=0;
              if (who["Show"]=="代码") i=3;
              if (who["Show"]=="color") i=5;
              who["Mj"]=str+who["Mj"];		//为了习惯把牌放在右边
              check_flower(who);
              tell_object(me,show_mj(who["Mj"],i));
              Touched=1;
              return 1;
        }
        if (i < 3) return notify_fail("你手中要有叁张"+do_check_num(str,0)+"才能杠。\n");
        if (!Touched){
           if (str!=LastDump) return notify_fail("这样无法杠。\n");
        }
        else if (i < 4) return notify_fail("你手中要有四张"+do_check_num(str,0)+"才能暗杠。\n");
        for (i=0;i<Play;i++) {
            if (NowPlayerId[NowPlayer]==me->query("id")) break;
            NowPlayer++;
            NowPlayer%=Play;
        }
        who["Mj"]=do_delete_Mj(who["Mj"],str,3);
        if (Touched && NowPlayerId[NowPlayer]==me->query("id")){
           NO_HU=0;
           message_vision("\n$N脸上露出邪恶的笑容说道:"+HIR"日音木工~~~"+NOR"嘿嘿.....\n\n",me);
           who["Mj"]=do_delete_Mj(who["Mj"],str,1);
           for (i=0;i<4;i++) who["Out"]+="xx";
           for (i=0;i<4;i++) who["OutGon"]+=str;
        }else{
           NO_HU=1;
           message_vision("\n$N大叫:"+do_check_num(str,0)+"~"+HIW+"木工~~~"+NOR+"\n\n",me);
           for (i=0;i<4;i++) who["Out"]+=str;
           //把杠的牌从出牌者面前拿掉!
        	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"), 6));        		
        */	
           PAUSE = 0;	//取消暂停
           if(userp(me)) who["Pause"] = "";//取消玩家的暂停标记
           for (i=0; i<3; i++) destop+=str;
        }
        str=List[end..end+1];
        end-=2;
        Goned++;
        message_vision("$N从後面补了一张牌。\n",me);
        tell_object(me,"你补到一张"+do_check_num(str,0)+"\n");
        who["Mj"]=str+who["Mj"];
        check_flower(who);
        i=0;
        if (who["Show"]=="代码") i=3;
        if (who["Show"]=="color") i=5;
        tell_object(me,show_mj(who["Mj"],i));
        if (Touched) return 1;//这句莫名其妙
        Touched=1;
        
        if(!userp(me)) {        	
        	call_out("dump_what", DELAY, me);//如果是NPC就继续出牌
        }
        return delete_last_dump(who["Id"]);
}
varargs int do_win(string str,object me)
{
        int i,j;
        int *winner=({0,0,0,0});
        string Mj="";
        mapping who;
        object met,obn;
 
        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;
        }
        
        if (NO_HU || LastDumpId==me->query("id")) return notify_fail("这样不能胡牌。\n");
        PAUSE = 0;		//取消暂停
        if (LastDump==""&&Touched) message_vision("\n$N大叫:"+HIW+"天~~~古月~~~"+NOR+"\n\n",me);
        else{
             tell_room(environment(this_object()),"\n"+me->name()+"大叫:"+HIW+"我~古月~啦~"+NOR+"\n\n",me);
             tell_object(me,"\n你大叫:"+HIW+"我~古月~啦~"+NOR+"\n\n");             
        }
        if (Touched&&NowPlayerId[NowPlayer]==me->query("id"))
           message_vision("$N说道:胡家"+me->name()+HIG+"自摸"+NOR+"~~~~~~~"+HIR+"吃红"+NOR+"~~~~~\n",this_object());
        else command("say "+me->name()+"胡了");
        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 (sizeof(who["OutFlower"]) ==16) i=1;
        else if (sizeof(who["OutFlower"]) ==14&&sizeof(P1Data["OutFlower"]+P2Data["OutFlower"]+P3Data["OutFlower"]+P4Data["OutFlower"])==16) i=1;
        if (!HU_F) i=0;
        if (i){
           Mj+="胡家的花牌是:\n";
           Mj+=show_mj(who["OutFlower"],1);
           if (NowPlayerId[NowPlayer]==who["Id"]) Mj+="胡家花胡自摸\n";
           else{
             if (sizeof(P1Data["OutFlower"])==2) LastDumpId=P1Data["Id"];
             else if (sizeof(P2Data["OutFlower"])==2) LastDumpId=P2Data["Id"];
             else if (sizeof(P3Data["OutFlower"])==2) LastDumpId=P3Data["Id"];
             else if (sizeof(P4Data["OutFlower"])==2) LastDumpId=P4Data["Id"];
             Mj+="\n花牌放枪者:"+HIB+LastDumpId+NOR+"\n";
           }
        }else{
          Mj+="胡家的牌是:\n";
          if (who["OutGon"]!=""){
             Mj+="暗杠的有:\n";
             Mj+=show_mj(who["OutGon"],0);
          }
          Mj+=show_mj(who["OutPon"]+who["Out"], 0);
          //Mj+=who["Id"]+":手中的牌有:\n";
          if (!Touched){
             who["Mj"]+=LastDump;

⌨️ 快捷键说明

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