⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pai.c

📁 C实现的MUD,对大家基本入门网络游戏很有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -