📄 pai.c
字号:
if(pai[i+1]==id) { // move all next for(j=i+1;j<s;j++) pai[j]=pai[j+1]; pai[s]=-1; pai[0]--; return id; } } return -1;}int pick_out2(string from, int id){ int i,j,s; string* p; mixed* pai; pai = get_pais(from); if(pai==0) return -1; s = pai[0]; for(i=0;i<s;i++) { if(i+1==id) { id = pai[i+1]; // move all next for(j=i+1;j<s;j++) pai[j]=pai[j+1]; pai[s]=-1; pai[0]--; return id; } } return -1;}int pick_in(string to, int card){ int s; mixed* pai; pai = get_pais(to); if(pai==0) return 0; s = pai[0]; s++; if(s>54) return 0; pai[s]=card; pai[0]++; return 1;}mixed* get_pais(string id) // 获取指定ID的牌{ string str; if(id == DESK) return allpai; if(id == DESK2) return expai; if(sscanf(id,"%s hand",str)==1) { if(get_player(str)) return pai_hand[str]; } if(sscanf(id,"%s out",str)==1) { if(get_player(str)) return pai_out[str]; } if(sscanf(id,"%s save",str)==1) { if(get_player(str)) return pai_save[str]; } if(sscanf(id,"%s hide",str)==1) { if(get_player(str)) return pai_hide[str]; } return 0;}object get_player(string id){ if(stringp(player[id])) return find_player(id); return 0;}int is_playing(object ob){ int i; string id; id = ob->query("id"); if(stringp(player[id])) return 1; return 0;}string id_to_name(string id){ object ob; string str; if(id == DESK) return "牌盒"; if(id == DESK2) return "副牌盒"; if(sscanf(id,"%s hand",str)==1) { ob = get_player(str); if(ob) return ob->name()+"手上"; } if(sscanf(id,"%s out",str)==1) { ob = get_player(str); if(ob) return ob->name()+"面前"; } if(sscanf(id,"%s save",str)==1) { ob = get_player(str); if(ob) return ob->name()+"身边"; } if(sscanf(id,"%s hide",str)==1) { ob = get_player(str); if(ob) return ob->name()+"隐藏"; } return "???";}int sizeof_pai(mixed* p){ return p==0?0:p[0];}int valid_show(object who,string which){ // 设置观看权限 0 - hide 1 - show string id,temp; if(!has_start) return 1; if(sscanf(which,"%s %s",id,temp)==2) { if(who->query("id")==id) return 1; if(temp == "out") return 1; if(temp == "save") return 1; } return 0;}string view_pai(object who,string which){ mixed* pai; int show_all,i,j; string s,p; pai = get_pais(which); if(pai==0) return 0; if(sizeof_pai(pai)==0) return "没有牌。"; if(valid_show(who,which)) { s = ""; for(i=0;i<pai[0];i++) { p = id_to_pai(pai[i+1]); s+= p +" "; } return s; } else return sizeof_pai(pai)+"张牌";}int do_nextone(string arg){ object ob; string id; if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(who_play==0) return notify_fail("现在是谁出牌啊?\n"); id = who_play; ob = get_player(id); if(ob==0) return notify_fail("没有设置好顺序。请参阅帮助。\n"); if(this_player()->query("id")!=id) msg(this_player()->name()+"对"+ob->name()+"说道:到你了。\n"); else msg(this_player()->name()+"对自己说道:到我啦!\n"); return 1;}int do_shunxu(string arg){ int i; string* p; string who; if(arg==0) return notify_fail("没有指定的人?\n"); p = explode(arg,"->"); who = ""; for(i=0;i<sizeof(p);i++) { if(get_player(p[i])) { if(who =="") who = p[i]; else { msg(who+"->"+p[i]+"\n"); player[who]=p[i]; who = p[i]; } } else return notify_fail(p[i]+"没有加入牌局啊!\n"); } return 1;}int do_removej(string arg){ if(!is_playing(this_player())) return notify_fail("你都不玩啊!\n"); do_movepai("JB from desk to desk2"); do_movepai("JS from desk to desk2"); return 1;}int do_pass(string arg){ string old,str; string* key; mixed* inv; int i,temp; if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(who_play!=this_player()->query("id")) return notify_fail("还没有到你啊!\n"); if(!arg) arg = "PASS!!"; msg(this_player()->name()+"说道:"+arg+"\n"); old = who_play; who_play = player[who_play]; if(mode == "21") { key = keys(player); for(i=0;i<sizeof(key);i++) if(player[key[i]]==old) player[key[i]] = player[old]; player[old] = ""; if(player[who_play] == "") { msg("大家都不要了。\n"); finish_21(); return 1; } } do_nextone(""); return 1;}int do_now(string arg){ if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(!arg) return notify_fail("格式:now who\n"); if(get_player(arg)) who_play = arg; do_nextone(""); return 1;}int do_end(string arg){ mixed* pai; string* p; int i; object ob; if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(!has_start) return notify_fail("游戏还没有开始啊!\n"); if(mode == "21") return 1; if(mode == "8") { pai = get_pais(this_player()->query("id")+" hand"); if(!pai||sizeof_pai(pai)!=0) return notify_fail("还没有摆完啊!\n"); msg(this_player()->name()+"说道:摆完牌了!!\n"); if(player[this_player()->query("id")]!="F") { player[this_player()->query("id")]="F"; player_counter ++; } if(player_counter==sizeof(player)) { // show all p = keys(player); for(i=0;i<sizeof(p);i++) do_movepai("1+1+1+1+1+1+1+1 from "+p[i]+" hide to "+p[i]+" out"); } } else { msg(this_player()->name()+"说道:出完牌了!!\n"); who_play = "完了"; } return 1;}string id_to_pai(int id){ int i,j; if(id <0) return HIR"???"NOR; if(id == 52) return HIY"小鬼"NOR + "JS"; if(id>=53) return HIY"大鬼"NOR + "JB"; i = id/13; j = id-i*13; return suit_str[i] + suit_char[i] + rank_str[j];}int pai_to_id(string id){ int ic1=-1,ic2=-1; string c1,c2; c1 = id[0..0]; c2 = id[1..sizeof(id)-1]; if(c1=="J")return c2=="S"?52:53; if(c1==suit_char[0]) ic1=0; if(c1==suit_char[1]) ic1=1; if(c1==suit_char[2]) ic1=2; if(c1==suit_char[3]) ic1=3; if(ic1==-1)return -1; if(sscanf(c2,"%d",ic2)!=1) { if(c2 == "J") ic2 = 11; if(c2 == "Q") ic2 = 12; if(c2 == "K") ic2 = 13; if(c2 == "A") ic2 = 14; if(ic2==-1) return -2; } ic2 -=2; return ic1*13+ic2; }void msg(string msg){ tell_room(environment(this_object()),msg,0);}void auto_order(){ int i; string* key; string order; key = keys(player); order = ""; for(i=0;i<sizeof(key);i++) order+= key[i]+"->"; order+=key[0]; do_shunxu(order); msg("如果顺序不合适请使用order命令重新设置。\n");}int do_setmode(string arg){ int vmode = 0,i; mixed* inv; if(!arg) return notify_fail("setmode [模式] 请参照帮助。\n"); if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(!has_start) return notify_fail("游戏还没有开始啊。\n"); if(mode) { if(mode=="21"&&arg=="auto") { mode2 = "auto"; msg("进入自动模式。\n"); return 1; } if(arg=="man"&&mode=="21") { mode2 = 0; msg("进入手动模式。\n"); return 1; } return notify_fail("已经进入了模式,请使用reset pai重置。\n"); } mode = arg; if(mode=="8") { vmode = 1; msg(HIR"进入8张模式。\n"NOR); has_start = 0; do_removej(""); has_start = 1; } if(mode=="21") { vmode = 1; msg(HIR"进入21点模式。\n"NOR); has_start = 0; do_removej(""); has_start = 1; auto_order(); save_player_data(); } if(mode == "d2") { vmode = 1; msg(HIR"进入锄大2模式。\n"NOR); has_start = 0; do_removej(""); has_start = 1; auto_order(); } if(!vmode) { mode = 0; return notify_fail("现在不支持该模式\n"); } return 1;}int do_showc(string arg){ string r; mixed *idx; int i; idx = keys(counter); r = "计数表(Scoreboard)\n-----------------\nID 分数\n-----------------\n"; for(i=0;i<sizeof(idx);i++) r = sprintf("%s%-14s%10d\n", r,idx[i],counter[idx[i]]); r += "-----------------\n"; tell_room(environment(this_player()),r,0); return 1;}void press_counter(string id,int num){ counter[id]=counter[id]+num;}int do_press(string arg){ string id; int n; if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(sscanf(arg,"%s %d",id,n)!=2) return notify_fail("格式:press id number。如:press catyboy 10\n"); press_counter(id,n); do_showc(""); return 1;}int do_removec(string arg){ string id; if(!is_playing(this_player())) return notify_fail("你都不玩牌啊!\n"); if(!arg||sscanf(arg,"%s",id)!=1) return notify_fail("格式:removec id\n"); map_delete(counter,id); do_showc(""); return 1;}int do_paipai2(string arg){ int i; if(!is_playing(this_player())) return notify_fail("你都不玩啊!\n"); if(!has_start) return notify_fail("游戏还没有开始。\n"); if(mode == "8") do_paipai("8"); return 1;}int do_daopai(string arg){ int i; if(!is_playing(this_player())) return notify_fail("你都不玩,开始什么啊!\n"); if(!has_start) return notify_fail("游戏还没有开始。\n"); do_movepai("1 from desk to desk /h"); return 1;}mapping t(){ return player;}mapping t2(){ return player_data;}int pai_number(int pai){ if(pai==52) return 15; if(pai==53) return 16; return pai-pai/13*13+2;}int pai_color(int pai){ if(pai>=52) return 5; return pai/13+1;}void save_player_data(){ string* inv; int i; inv = keys(player); for(i=0;i<sizeof(inv);i++) player_data[inv[i]] = player[inv[i]];}void restore_player_data(){ int i; string* key; key = keys(player_data); for(i=0;i<sizeof(key);i++) player[key[i]] = player_data[key[i]];}int sort_21(string str1, string str2){ int c1,c2; string temp; sscanf(str1,"%s:%d",temp,c1); sscanf(str2,"%s:%d",temp,c2); if(c1==c2) return 0; if(c1>21&&c2>21) return (c1<c2)?-1:1; if(c1>21) c1 = -1; if(c2>21) c2 = -1; return (c1>c2)?-1:1;}void finish_21(){ string* key; mixed* inv2; mixed* inv; string str,r,id; int i,maxn,fen,k,lpoint; key = keys(player); inv2 = allocate(sizeof(player)); for(i=0;i<sizeof(key);i++) { str = key[i]; inv2[i] = str + ":" + c21(get_pais(str+" out")); } inv = sort_array(inv2,"sort_21",this_object()); lpoint = -1; r = "结果\n-----------------\nID 点数 得分\n-----------------\n"; for(i=0;i<sizeof(inv);i++) { sscanf(inv[i],"%s:%d",id,k); if(k != lpoint) { fen = sizeof(inv) - i - 1; lpoint = k; } if(i==0)maxn=k; if(k==maxn)r+=HIY; if(k>21) { r+=HIR; fen = 0; } r = sprintf("%s%-14s%5d%12d\n", r,id,k,fen); r+=NOR; if(mode2 == "auto") { press_counter(id,fen); } } r += "-----------------\n"; msg(r); who_play = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -