1mj.c

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

C
1,606
字号
#include <ansi.h>
inherit NPC;
#define MJ_DATA "/data/games/mj_data.o"
#define END 286
#define START 0
void check_flower(mapping who);
int to_say_play();
int to_say_rule();
int do_check_Mj(string datastr,string str);
int do_check_eat(string num1,string num2,string LastDump);
int delete_last_dump(string whoId);
int do_check_win(string str);
int check_hu(string strW);
int set_mjdata(object me,int *winner);
int *get_mjdata(string id);
int get_tc(mapping who);

int get_attitudes(mapping who);		//获得NPC的打牌态度,直接决定其出牌和胡牌的类型
void dump_what( object who );		//加入计算出什么牌的函数。
string filt_mj(string strW, object me);	//**********************/
string find_mj(string str, string mj);	//*********/
int npc_action( object me );		//******/
int get_times( mapping who );		//专门算台的

mixed next_data( string str, int i, string key );	//找出当前出牌者(id == str)的下 i 家Data里面的所以资料(key关键字),
							//这是最强大的一个函数!!!!!!!!!
string next_mj( string mj, int i );			//承继next_data 的思想咯。

int do_pause( object me );	//加入停下来让玩家考虑是否碰牌,杠牌等。
int undo_pause(object me);		//***********************
int do_continue(object me);	//防止游戏不能进行!具体为什么有时程序会停下来出错原因荒凉不明白,估计是函数调用太深的缘故
				//但键入调用该函数的命令后可以解决问题就行了。
				
varargs int do_dump(string str,object me);
varargs int do_touch(string str,object me);
varargs int wash_mj(int amount);
varargs int do_win(string str,object me);
varargs int do_gon(string str,object me);
varargs int do_pon(string str,object me);
varargs int do_eat(string str, object me);
string check_id(string str,string kind);
string do_delete_Mj(string datastr,string str,int amount);
string show_mj(string str,int flag);
string sort_data(string str);
mixed do_check_num(string str,int flag);
//牌只资料
string MjE= "1w2w3w4w5w6w7w8w9w1t2t3t4t5t6t7t8t9t1s2s3s4s5s6s7s8s9seasowenojofabaf1f2f3f4f5f6f7f8";
string *MjC = ({"",
                "一万","二万","叁万","四万","伍万","六万","七万","八万","九万",
                "一筒","二筒","叁筒","四筒","伍筒","六筒","七筒","八筒","九筒",
                "一索","二索","叁索","四索","伍索","六索","七索","八索","九索",
                "东风","南风","西风","北风","红中","青发","白板",
                "1春","2夏","3秋","4冬","1梅","2兰","3竹","4菊","暗杠","||||"
              });
int K;
string Tc = "";
//资料
int Auto;
int Auto_Tin;
int Auto_Gon;
int Auto_Pon;
int Count;
int count;
int end;
int Goned;
int HU_F;
int NO_HU;
int NO_GON;
int Playing;
int Play;
int Times;
int Touched;
int NowPlayer;
string List ="";
string LookP ="";
string *NowPlayerId = ({ "east com","south com","west com","" });
string LastDumpId="";
string LastDump="";
 
mapping P1Data = ([
"Show": "color","Id": "east com","Name": "","Mj": "","Out": "","OutGon": "","OutPon": "",
"OutFlower": "","Auto": "","AutoTin": "","AutoGon": "","AutoPon": "","Dump": "",
"Attitude": "common", "Hu_type": "", "3Ps": "", "3Es":"", "2Ps": "", "2Es1": "", "2Es2": "", "1s": "",	//为了能判断出什么牌而加入
"Pause": ""
               ]);
mapping P2Data = ([
"Show": "color","Id": "south com","Name": "","Mj": "","Out": "","OutGon": "","OutPon": "",
"OutFlower": "","Auto": "","AutoTin": "","AutoGon": "","AutoPon": "","Dump": "",
"Attitude": "common", "Hu_type": "", "3Ps": "", "3Es":"", "2Ps": "", "2Es1": "", "2Es2": "", "1s": "",	//为了能判断出什么牌而加入
"Pause": ""
               ]);
mapping P3Data = ([
"Show": "color","Id": "west com","Name": "","Mj": "","Out": "","OutGon": "","OutPon": "",
"OutFlower": "","Auto": "","AutoTin": "","AutoGon": "","AutoPon": "","Dump": "",
"Attitude": "common", "Hu_type": "", "3Ps": "", "3Es":"", "2Ps": "", "2Es1": "", "2Es2": "", "1s": "",	//为了能判断出什么牌而加入
"Pause": ""
               ]);
mapping P4Data = ([
"Show": "color","Id": "","Name": "","Mj": "","Out": "","OutGon": "","OutPon": "",
"OutFlower": "","Auto": "","AutoTin": "","AutoGon": "","AutoPon": "","Dump": "",
"Pause": ""
               ]);

//以下为人机对战而加               

int PAUSE = 0;			//判断是否处于暂停状态;PAUSE==1是为NPC叫的暂停,任何玩家都可以用continue命令取消;PAUSE==2
				//是为玩家叫的暂停,只有该玩才可用continue命令解除
string destop="";			//是桌面喔。
int DELAY =2;			//NPC摸牌或出牌的延时
string TIMES = "";


void create()
{
set_name("白晶晶",({"bai jingjing", "bai", "jingjing", "jing"}));
        set_weight(1);
        set("gender", "女性");
        set("age", 18);
        set("long",
                "她就是白晶晶,你可以问她关于麻将的问题(ask bai about mj)。\n"
                );
        set("attitude", "friendly");

        set("per", 28);
        set("str", 30);
        set("int", 37);
        set("con", 36);
        set("dex", 38);
        
        set("unit","张");
        set("inquiry",([
           "mj": (: to_say_play :),
           "麻将": (: to_say_play :),
           "玩法": (: to_say_play :),
           "play": (: to_say_play :),
           "规则": (: to_say_rule :),
           "rule": (: to_say_rule :),
           ]));
        setup();
        seteuid(getuid());
}
void init()
{
   add_action("do_addin","addin");
   add_action("do_dump","dump");
   add_action("do_eat","eat");
   add_action("do_gon","gon");
   add_action("do_win","hu");
   add_action("do_help","help");
   add_action("do_look","look");
   add_action("do_look",".");
   add_action("do_look",".1");
   add_action("do_look",".2");
   add_action("do_look",".3");
   add_action("do_look",".4");
   add_action("do_look","..");
   add_action("do_touch","mo");
   add_action("do_touch","0");
   add_action("do_pon","pon");
   add_action("do_pon","p");
   add_action("do_restart","restart");
   add_action("wash_mj","start");
   add_action("do_setmj","setmj");
   add_action("show_top","top");
   add_action("ch","ch");
   add_action("do_pause","pause");		//加入叫暂停命令
   add_action("do_continue","continue");	//加入牌局继续的命令,防止函数执行过长时出错不能继续。   

/*East = present( "east com" );
South = present( "south com" );
West = present( "west com" );*/

}
int do_addin()
{
        object me=this_player();
        if (me->query("id")==P1Data["Id"]
        ||  me->query("id")==P2Data["Id"]
        ||  me->query("id")==P3Data["Id"]
        ||  me->query("id")==P4Data["Id"]){
            if (!Playing) message_vision("$N对着欠脚啊~~不停的哭哭啼啼.....。\n",me);
            else message_vision("$N对着大家说今天自摸"+(random(12)+1)+"次就好。\n",me);
            return 1;
        }
       if (Playing){
                if (random(1))
                message_vision(this_object()->name()+
                "对着"+me->name()+"说道:牌局正在进行中请到旁边坐一下...。\n",me);
                else  message_vision("$N对着大家说:“我也要玩啦~~”不停的哭哭啼啼.....。\n",me);
                return 1;
        }
        if (!P4Data["Id"] || P4Data["Id"]==""){
                 P4Data["Id"]=me->query("id");
           if (userp(me))
{
set("ipu",0);
}
                 message_vision("$N加入了这场牌局。\n",me);                 
                 NowPlayerId[3]=me->query("id");
                 Play = 4;
                 Times=0;
                 LookP+=me->name();
                 return 1;
        }else if ( P2Data["Id"]=="south com"){
           P2Data["Id"]=me->query("id");
           NowPlayerId[1]=me->query("id");
           if (userp(me))
{
set("ipu",1);
}
           message_vision("$N加入了这场牌局。\n",me);
           //Play++;
           Times=0;
           LookP+="在前面有"+me->name()+",";
           return 1;
        }else if ( P3Data["Id"]=="west com"){
                 P3Data["Id"]=me->query("id");
           if (userp(me))
{
set("ipu",1);
}
                 message_vision("$N加入了这场牌局。\n",me);
                 NowPlayerId[2]=me->query("id");
                 //Play++;
                 Times=0;
                 LookP+=me->name()+",";
                 return 1;
        }else if ( P1Data["Id"]=="east com"){
                 P1Data["Id"]=me->query("id");
           if (userp(me))
{
set("ipu",1);
}
                 message_vision("$N加入了这场牌局。\n",me);
                 NowPlayerId[0]=me->query("id");
                 //Play++;
                 Times=0;
                 LookP+=me->name()+",";
                 return 1;
        }
        return notify_fail("人数已足。\n");
}
int do_dump(string str,object me)
{
        int check,i;
        int *winner=({0,0,0,0});
        string ponid;
        mapping who;
        object met;
 
        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("kick "+me->query("id"));
           command("say 牌局还没开始你拿牌乱丢!!");
           return 1;
        }
        tell_object(me,"换谁打牌:"+NowPlayerId[NowPlayer]+"\n");
        if (!str) return notify_fail("指令:dump <代码>\n");
        if (me->query("id")!=NowPlayerId[NowPlayer]){
           command("hammer "+me->query("id"));
           command("say 想偷打牌!!作弊啊?");
           return 1;
        }
        if (!Touched){
           command("faint "+me->query("id"));
           command("say 你还没摸牌!!");
           return 1;
        }
        if (Goned==5){
           message_vision("$N说道:此局因"+HIR+"五杠合牌"+NOR+"请再重新开始 start 。\n",this_object());
           Playing=0;
           Count++;
           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;
        }
        NO_HU=0;
        HU_F=0;
        NO_GON=0;
        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;
        check=do_check_Mj(MjE,str);
        if (check==0) return notify_fail("没有["+str+"]这种代码。\n");
        check=do_check_Mj(who["Mj"],str);
        if (check==0) return notify_fail("你没"+do_check_num(str,0)+"这张牌。\n");
        tell_object(me,"你说道:"+do_check_num(str,0)+"\n");
        //tell_room(environment(this_object()),me->name()+"说道:"+do_check_num(str,0)+"\n",me);
        //tell_room(environment(this_object()),me->name()+"说道:"+do_check_num(str,0)+"\n"+show_mj(str, 6) + "\n",me);
        tell_room(environment(this_object()),me->name()+"说道:"+do_check_num(str,0)+"\n",me);
        //command("say "+me->name()+"打出了一张"+do_check_num(str,0));
        who["Mj"]=do_delete_Mj(who["Mj"],str,1);
        who["Mj"]=sort_data(who["Mj"]);		//打完之后把牌整理好
        destop+=str;				//把牌加到桌面上,当然是为了计算出什么牌咯
        LastDump=str;
        who["Dump"]=str+who["Dump"];
        
        tell_room(environment(this_object()),show_mj(who["Dump"]+"zz"+who["Out"]+who["OutPon"]+who["OutFlower"], 6));	//方便看牌
        LastDumpId=who["Id"];
        Touched=0;
        NowPlayer++;
        NowPlayer%=Play;
        //message_vision("$N说道:现在轮到"+HIY+NowPlayerId[NowPlayer]+NOR+"摸牌。\n",this_object());没有必要让所有人看到这句吧??
        tell_object(present(NowPlayerId[NowPlayer]), "白晶晶对你说:现在轮到你摸牌。\n");
        if (Auto_Tin){

⌨️ 快捷键说明

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