📄 piggy2.c
字号:
string display_suit(string dir, string suit){ 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -