piggy.c

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

C
2,054
字号
{
        string  str="",  toreturn;
        int  i=13,  base,  count=0;
        mapping  card;

        switch  (suit)
        {
	case  "spade":
	        str  +=  "\n  "+HIB"黑桃:"NOR;
	        base=1;
	        break;
	case  "heart":
	        str  +=  "\n  "+HIR"红桃:"NOR;
	        base=14;
	        break;
	case  "diamond":
	        str  +=  "\n  "+HIR"方片:"NOR;
	        base=27;
	        break;
	case  "club":
	        str  +=  "\n  "+HIB"草花:"NOR;
	        base=40;
	        break;
	default:
	        return  "函数错误:display_suit。\n";
        }
        while  (i--)
        {
	card=CARDS[i+base];
	if  (dir  ==  card["status"])
	{
	        count++;
	        str  +=  CNUM[card["rank"]]+",";
	}
	continue;
        }
        if  (!count  ||  !str)
	return  "";
        toreturn=str[0..(strlen(str)-3)];
        return  toreturn;
}
int  search_suit(object  me,  string  suit)
{
        int  count=0,  i=13,  base;
        string  dir=search_my_dir(me);

        switch  (suit)
        {
	case  "spade":
	        base=1;
	        break;
	case  "heart":
	        base=14;
	        break;
	case  "diamond":
	        base=27;
	        break;
	case  "club":
	        base=40;
	        break;
	default:
	        return  notify_fail("函数错误:search_suit。\n");
        }
        while(i--)
        {
	if(CARDS[i+base]["status"]==dir)
	{
//	        tell_room(HERE,  "you  have  "+CARDS[i+base]["name"]+"\n");
	        count++;
	}
	continue;
        }
        return  count;
}

/******************************************************************************/
//  some  functions  for  others  to  use.

void  renew(string  type)
{
        int  i  =  NUM,  j=CARDNO;
        switch  (type)
        {
	case  "round":
	        GAMEINFO["round"]++;
	        all_have("played_card");
	        GAMEINFO["suit"]="";
	        break;
	case  "hand":
	        TABLE["cond"]="等发牌";
	        GAMEINFO["round"]=0;
	        GAMEINFO["suit"]  =  "";
	        GAMEINFO["rlead"]  =  PIG_OWNER;
	        GAMEINFO["next"]  =  "";
	        CLAIM["claimer"]  =  "";
	        SOLD=([  "pig":  ({"not"}),  "blood":  ({"not"}),
			"sheep":  ({"not"}),  "doubler":  ({"not"}),  ]);
	        FULL="";
	        PIG_OWNER="";
	        while(j--)
		CARDS[j+1]["status"]  =  "undealt";
	        while  (i--)
	        {
		GAMEINFO[SUIT[i]]  =  0;
		CLAIM[DIR[i]]  =  "no";
		TABLE[DIR[i]]["card"]=0;
		TABLE[DIR[i]]["collected"]=({});
		TABLE[DIR[i]]["sold"]=({});
		TABLE[DIR[i]]["status"]="filled";
		SCORING["hand"][DIR[i]]=0;
	        }
	        break;
	case  "sitting":
	        renew("hand");
	        PIGHEAD=({});
	        while(i--)
	        {
		SCORING["sitting"][DIR[i]]  =  0;
		SCORING["hand"][DIR[i]]  =  0;
	        }
	        break;
	case  "all":
	        renew("sitting");
	        while(i--)
		if  (TABLE[DIR[i]]["player_id"]  ==  "no  one")
		        TABLE[DIR[i]]["status"]  =  "empty";
	        TABLE["cond"]  =  "等人";
	        GAMEINFO["rlead"]  =  "";
	        break;
	default:
	        tell_room(HERE,"函数用法错误:renew。\n");
	        break;
        }
        return;
}

int  all_have(string  arg)
{
        int  value=1,  i=NUM;
        object  me;

        switch  (arg)
        {
	case  "players":
	        while(i--)
	        {
		if  (TABLE[DIR[i]]["player_name"]  ==  "「空」"
		  ||  !present(TABLE[DIR[i]]["player_id"],  HERE))
		        value  =  0;
	  	continue;
	        }
	        break;
	case  "played_card":
	        while(i--)
	        {
		CARDS[TABLE[DIR[i]]["card"]]["status"]="played";
		TABLE[DIR[i]]["card"]=0;
		continue;
	        }
	        break;
	case  "agreed_claim":
	        while(i--)
	        {
		if  (CLAIM[DIR[i]]  !=  "yes")
		        value  =  0;
		continue;
	        }
	        break;
	case  "cards":
	        while(i--)
	        {
		if  (!TABLE[DIR[i]]["card"])
		        value  =  0;
		continue;
	        }
	        break;
	case  "given_head":
	        while(i--)
	        {
		me=find_me(DIR[i]);
		me->add("piggy/head_given",  sizeof(PIGHEAD));
		continue;
	        }
	        break;
	case  "req_deal":
	        while(i--)
	        {
		if  (TABLE[DIR[i]]["status"]  !=  "asked_for_deal")
		        value  =  0;
		continue;
	        }
	        break;
	case  "pass":
	        while(i--)
	        {
		if  (TABLE[DIR[i]]["status"]  !=  "passed")
		        value  =  0;
		continue;
	        }
	        break;
	        
	default:
	        tell_room(HERE,"函数用法错误:all_have。\n");
	        value  =  0;
	        break;
        }
        return  value;
}

/******************************************************************************/
//  functions  to  look.  look  table,  of  course,  checks  the  table.
//  look  gaoshi  reviews  the  rules  of  this  game......

string  look_table()
{
        string  cond=this_player()->query("env/brief_message");
        if(is_dir(cond))
	cond="YES";

        return  display_table(cond);
}
string  look_collected()
{
        string  str;
        int  i=NUM;

        if  (TABLE["cond"]  !=  "出牌"  &&  TABLE["cond"]  !=  "算分")
	return  "现在没在打牌,桌子上空着。\n";
        str  =  display_sell();
        while  (i--)
        {
	str  +=  "\n"+CDIR[DIR[i]]+"家"+TABLE[DIR[i]]["player_name"]+"收了如下的牌:";
	str  +=  check_collected(DIR[i],  "spade");
	str  +=  check_collected(DIR[i],  "heart");
	str  +=  check_collected(DIR[i],  "diamond");
	str  +=  check_collected(DIR[i],  "club");
        }
        return  str+"\n";
}
string  look_hand()
{
        object  me=this_player();
        string  str="",  dir;

        if  (!in_table(me))
	return  "对不起,你并不在拱猪。\n";
        if  (TABLE["cond"]  ==  "算分")
	return  "这把已经打完了。\n";
        if  (TABLE["cond"]  ==  "等人"  ||  TABLE["cond"]  ==  "等发牌")
	return  "你手中还没有牌。\n";
        dir=search_my_dir(me);
        str  +=  "\n你手中的牌如下:\n";
        str  +=  display_suit(dir,  "spade");
        str  +=  display_suit(dir,  "heart");
        str  +=  display_suit(dir,  "diamond");
        str  +=  display_suit(dir,  "club");

        return  str+"\n\n";
}
string  look_note()
{
        string  str;
        object  me=this_player();

        if  (TABLE["cond"]  ==  "等人")
	return  "纸上画着一个猪头,旁边的名字被人擦去了。下面是个表格,画得歪七扭八的。\n";
        return  display_score();
}
string  display_score()
{
        int  i  =  NUM;
        string  format  =  "│%2s家:%-12s   %6d  %6d   %2s│\n";
        string  str  =  "\n┌────────────────────────┐\n"
		+    "│方向 玩家        盘分   总分   猪│\n"
		+    "├────────────────────────┤\n";


        while  (i--)
        {
	str  +=  sprintf(format,  CDIR[DIR[i]],  TABLE[DIR[i]]["player_name"],
			SCORING["hand"][DIR[i]],  SCORING["sitting"][DIR[i]],
			(member_array(DIR[i],  PIGHEAD)  ==  -1  ?  " ":  "√"));
	continue;
        }
        str  +=  "└────────────────────────┘\n";
        return  str;
}

string  display_sell()
{
        int  counta=0,  count=0,  countm=0,  i=NUM,  j;
        string  card,  *asell=({}),  str="",  dir;

        if  (SOLD["pig"][0]  ==  "a")
                counta++;
        else  if  (SOLD["pig"][0]  ==  "m")
                countm++;
        if  (SOLD["blood"][0]  ==  "a")
                counta++;
        else  if  (SOLD["blood"][0]  ==  "m")
                countm++;
        if  (SOLD["sheep"][0]  ==  "a")
                counta++;
        else  if  (SOLD["sheep"][0]  ==  "m")
                countm++;
        if  (SOLD["doubler"][0]  ==  "a")
                counta++;
        else  if  (SOLD["doubler"][0]  ==  "m")
                countm++;
        if  (!(countm+counta))  str  +=  "这把没人卖牌。\n";
        else
        {
                str  +=  "卖牌情况如下:\n";
                while(i--)
                {
        	        dir=DIR[i];
        	        if  (!(j=sizeof(TABLE[dir]["sold"])))
        		continue;
        	        str  +=  "  "+CDIR[dir]+"家"+HIC+TABLE[dir]["player_name"]+NOR;
        	        count=0;
        	        while  (j--)
        	        {
        		card=TABLE[dir]["sold"][j];
        		if  (SOLD[card][0]=="a")  count++;
        		else  str  +=  "明卖"+CCARD[card]+",";
        	        }
        	        if  (!count)  str  =  str[0..(strlen(str)-3)]+"。";
        	        else  str  +=  "暗卖"+chinese_number(count)+"张。";
        	        str  +=  "\n";
                }
        }
        return  str;
}
string  display_table(string  cond)
{
        int  i,  index,  j,  size,  cnt;
        string  str,  dir,  state;
        mapping  status=allocate_mapping(4),  tmp  =  allocate_mapping(3);
        mapping  sell=allocate_mapping(4);

        sell=([
	"east":  ({" "," ",  " ",  " ",}),
	"north":  "",
	"west":  ({" "," ",  " ",  " ",}),
	"south":  "",
]);
        status=([
	"east":  ([  "card":  "   ",
		      "player":  "「空」",  ]),
	"north":  ([  "card":  "   ",
		      "player":  "「空」",  ]),
	"west":  ([  "card":  "   ",
		      "player":  "「空」",  ]),
	"south":  ([  "card":  "   ",
		      "player":  "「空」",  ]),
]);

        i  =  NUM;
        while(i--)
        {
	dir  =  DIR[i];
	if  (!is_empty(dir))
	        status[dir]["player"]=TABLE[dir]["player_name"];
	if  (index=TABLE[dir]["card"])
	        status[dir]["card"]  =  CARDS[index]["name"];
	continue;
        }
        if(is_dir(cond))
	state="第"+chinese_number(GAMEINFO["round"])+"轮结束,"+TABLE[cond]["player_name"]+"的牌最大。";
        else
	state  =  (TABLE["cond"]  ==  "出牌"  ?
	        "现在是第"+chinese_number(GAMEINFO["round"])+"轮,该"
		+TABLE[GAMEINFO["next"]]["player_name"]+"出牌:"  :  "");
        if  ((cond  ||  TABLE["cond"]  !=  "出牌")  &&  !is_dir(cond))
	str  =  sprintf(PIGSTATE_SHORT,  state,
	        status["north"]["player"],  status["north"]["card"],
	        status["west"]["player"],  status["west"]["card"],
	        status["east"]["card"],  status["east"]["player"],
	        status["south"]["card"],  status["south"]["player"]);
        else
        {
	if  (j=sizeof(TABLE["north"]["sold"]))
	{
	        cnt=j;
	        size=j;
	        while(j--)
		sell["north"]  +=  sold_display("north",  j,  1);
	        sell["north"]  =  treat_sold(sell["north"],  size);
//	        sell["north"]  =  sell["north"][0..(strlen(sell["north"])-3)];
	}
	else  sell["north"]="        ";
	if  (cnt  <  4  &&  j=sizeof(TABLE["south"]["sold"]))
	{
	        cnt+=j;
	        size=j;
	        while(j--)
		sell["south"]  +=  sold_display("south",  j,  1);
	        sell["south"]  =  treat_sold(sell["south"],  size);
//	        sell["south"]  =  sell["south"][0..(strlen(sell["south"])-3)];
	}
	else  sell["south"]="        ";
	if  (cnt  <  4  &&  j=sizeof(TABLE["east"]["sold"]))
	{
	        cnt  +=  j;
	        switch(j)
	        {
	            case  1:
		sell["east"][1]=sold_display("east",  0,  0);
		break;
	            case  2:
		sell["east"][1]=sold_display("east",  0,  0);
		sell["east"][2]=sold_display("east",  1,  0);
		break;
	            case  3:
		sell["east"][0]=sold_display("east",  0,  0);
		sell["east"][1]=sold_display("east",  1,  0);
		sell["east"][2]=sold_display("east",  2,  0);
		break;
	            case  4:
		sell["east"][0]=sold_display("east",  0,  0);
		sell["east"][1]=sold_display("east",  1,  0);
		sell["east"][2]=sold_display("east",  1,  0);
		sell["east"][3]=sold_display("east",  3,  0);
		break;
	        }
	}
	if  (cnt  <  4  &&  j=sizeof(TABLE["west"]["sold"]))
	{
	        cnt  +=  j;
	        switch(j)
	        {
	            case  1:
		sell["west"][1]=sold_display("west",  0,  0);
		break;
	            case  2:
		sell["west"][1]=sold_display("west",  0,  0);
		sell["west"][2]=sold_display("west",  1,  0);
		break;
	            case  3:
		sell["west"][0]=sold_display("west",  0,  0);
		sell["west"][1]=sold_display("west",  1,  0);
		sell["west"][2]=sold_display("west",  2,  0);
		break;
	            case  4:
		sell["west"][0]=sold_display("west",  0,  0);
		sell["west"][1]=sold_display("west",  1,  0);
		sell["west"][2]=sold_display("west",  1,  0);
		sell["west"][3]=sold_display("west",  3,  0);
		break;
	        }
	}
	str  =  sprintf(PIGSTATE_FULL,  state,
	        status["north"]["player"],
	        sell["north"],
	        sell["west"][0],
	        status["north"]["card"],
	        sell["east"][0],
	        sell["west"][1],
	        sell["east"][1],
	        status["west"]["player"],
	        status["west"]["card"],
	        status["east"]["card"],
	        status["east"]["player"],
	        sell["west"][2],
	        sell["east"][2],
	        sell["west"][3],
	        status["south"]["card"],
	        sell["east"][3],
	        sell["south"],
	        status["south"]["player"]);
        }
        return  str;
}
string  treat_sold(string  sold,  int  cnt)
{
        string  str="";

        switch  (cnt)
        {
	case  4:  str  =  sold;break;
	case  3:  str  =  " "+sold+" ";break;
	case  2:  str  =  "  "+sold+"  ";break;
	case  1:  str  =  "   "+sold+"   ";break;
        }

        return  str;
}
string  sold_display(string  dir,  int  index,  int  flag)
{
        string  str="";

        str  +=  (SOLD[TABLE[dir]["sold"][index]][0]  ==  "m"  ?
	(CARDS[NCARD[TABLE[dir]["sold"][index]]]["status"]  !=  "played"?
	SCARD[TABLE[dir]["sold"][index]]
	        +(CCARD[TABLE[dir]["sold"][index]][0..1])  :  "○")+NOR  :
	(CARDS[NCARD[TABLE[dir]["sold"][index]]]["status"]  ==  "played"?
		GRN"□"NOR:GRN"■"NOR));
        if  (flag)  str  +=  " ";
        return  str;
}
string  read_rules()
{

        string  str="";

        str  +=  "如果您不会打拱猪,请用  help  pigrules  来查看。\n\n";
        str  +=  "具体打牌方法请用  help  pigcmds  来查看。\n\n";

        return  str;
}
/******************************************************************************/

⌨️ 快捷键说明

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