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 + -
显示快捷键?