shaizi-room.c

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

C
706
字号
/*  <SecCrypt CPL V3R05>  */
 
//standroom.c  used  by  weiqi...others  may  hate  this  format:D
//shaizi-room.c...weiqi,  98/01/17
//allow  坐庄,下注等。

inherit  ROOM;

int  round  =  0;  //this  indicates  how  many  games  processed.
int  ask_for_zhuang  =  0;

int  game_status  =  0;
//=0,  no  game  yet.
//=1,  zhuang-jia  determined.
//=2,  zhuang-jia  typed  "start",  begin  bet  process.
//=3,  bet  finished...zhuang-jia  used  "bet  ***"  to  put  on  money,  now  game  processing.
//return  to  0,  game  finished.
//if  zhuang-jia  retire,  return  to  0.

string  zhuang_id  =  "no  zhuang";  //zhuang-jia's  id.

int  total_bet  =  0;//total  money  on  table,  in  unit  of  silver.

int  max_bet  ;  //max  bet  each  round,  determined  by  zhuang-jia.  

void  pay_player(object  me,  int  total);
int  pay_out(object  me,  int  total);
int  check_silver(object  me);
void  game_process();
void  show_shaizi(object  me);
void  game_result();
void  check_finish(int  previous_round);
void  check_start(int  previous_round);

void  create  ()
{
	set  ("short",  "骰子房");
	set  ("long",  @LONG
屋中间摆着一张看起来相当结实的大长条桌(table),四周围了
十几把靠背木椅。北面墙上有一块牌子(paizi)。
LONG);

	set("item_desc",  (["paizi"  :  "

赌骰子规则:
每一轮有个庄家,输赢只跟庄家比。两粒骰子,成对为大。十点最小。
开赌顺序:
一,确定庄家(用zz或zuozhuang坐庄,retire或rz,  rangzhuang让庄)。
二,庄家宣布开盘(start  <赌注上限>)。
三,玩家下注(bet或xz,  xiazhu)。
四,庄家下注(bet或xz,  xiazhu),至少要押别的玩家的总和。
五,庄家下注就开赌了。

注意事项:
一,赌中不要离开赌场,否则一切损失概不负责。
二,坐庄时要先拿出五两金子的保证金,让庄时退还。非正常丢庄(如
  中途离开等)保证金自动失去。
三,每一轮从庄家宣布开盘起十分钟之内必须完成,否则取消重来。
  非庄家所下之注可被退回,而庄家则可能会有损失。
四,如果庄家迟迟不宣布开盘,玩家可用坐庄(zz)指令要求换庄。
  要求换庄后两分钟内庄家比须宣布开盘,否则丢庄。
五,在下注过程中可用取消(cancel)指令。庄家用此指令则宣布此局无效,
  大家将赌注取回,庄家非正常丢庄。非庄家用此指令则表示退出此
  局,赌注可取回。
		\n"  ]));
	//for  look  something.

	set("exits",  
	([  //sizeof()  ==  4
		//"south"  :  __DIR__"xiaomuwu",
		//"north"  :  __DIR__"chufang",
		//"west"  :  __DIR__"duchang2",
		"east"  :  __DIR__"clubpoem",
		//"up"  :  __DIR__"***",
		//"down"  :  __DIR__"***",
	]));
	
	set("objects",  
	([  //sizeof()  ==  1
		__DIR__"npc/gongsun"  :  1,
	]));


	//set("outdoors",  "city");
	set("no_fight",  1);
	set("no_magic",  1);
	set("no_get",  1);
	set("no_drop1",  1);
	set("no_clean_up",  1);

	set("no_caishen",  1);

	setup();
}

void  init()
{
	object  me;

	add_action("do_bet",  "bet");
	add_action("do_bet",  "xiazhu");
	add_action("do_bet",  "xz");

	add_action("do_zuozhuang",  "zuozhuang");
	add_action("do_zuozhuang",  "zz");

	add_action("do_retire",  "retire");
	add_action("do_retire",  "rangzhuang");
	add_action("do_retire",  "rz");

	add_action("do_start",  "start");
	add_action("do_start",  "kaipan");
	add_action("do_start",  "kp");
	
	add_action("do_cancel",  "cancel");

	add_action("do_look",  "look");

	//all  ppls  enter  this  room,  "shaizi/***"  got  deleted.
	me=this_player();
	if(  me->query_temp("shaizi")  )
	{
		me->delete_temp("shaizi");
	}
}

int  do_bet(string  arg)
{
	object  me;
	int  amount;
	string  money;
	object  ob;
	int  this_bet;  //in  unit  of  silver.

	me=this_player();

	if(!arg || sscanf(arg,"%d %s",  amount,  money)  !=  2)
		return  notify_fail("请使用:bet(或xiazhu, xz) <数目> <货币>\n");

	//check  valid  money  first.
	ob  =  present  (money+"_money",  me);
	if(!  ob)  return  notify_fail("你身上没有这种钱。\n");
	if(amount  <  1)  return  notify_fail("想行骗?\n");
	if(amount  >  ob->query_amount())  return  notify_fail("你没这么多钱。\n");
	if(money=="coin")  return  notify_fail("铜板?还是到大街上去赌吧。\n");

	if(zhuang_id  !=  me->query("id"))
	{//I  am  not  zhuang-jia.
		if(game_status  !=  2)
			return  notify_fail("还没到下注的时候,听庄家吩咐。\n");

		//now  let's  bet.
		this_bet  =  amount*ob->query("base_value")/100;
		if(  (this_bet  +  (int)me->query_temp("shaizi/bet_amount"))  >  max_bet  )
			return  notify_fail("庄家太穷了,赌不起。换庄家吧。\n");

		total_bet  +=  this_bet;
	
		me->set_temp("shaizi/bet_amount",  this_bet  +  (int)me->query_temp("shaizi/bet_amount"));
		message_vision  (sprintf("$N拿出%s%s%s,押在桌子上。\n",
			chinese_number(amount),
			ob->query("base_unit"),
			ob->query("name")),
			me);

		if  (amount  ==  ob->query_amount())  destruct  (ob);
		else  ob->add_amount(-amount);
	}
	else
	{//I  am  zhuang-jia.
		if(game_status  !=  2)
			return  notify_fail("你现在头脑不清醒,还是别坐庄了。\n");
		if(total_bet  ==  0)
			return  notify_fail("还没人下注呢。等大家都下完了你再下吧。\n");

		//now  let's  bet.
		this_bet  =  amount*ob->query("base_value")/100;
		if(this_bet  <  total_bet)
			return  notify_fail("这一轮共下注"+total_bet+"两银子,庄家所押不能少于这个数目。\n");		

		total_bet  +=  this_bet;	
		me->set_temp("shaizi/bet_amount",  this_bet  +  (int)me->query_temp("shaizi/bet_amount"));
		message_vision  (sprintf("$N拿出%s%s%s,押在桌子上。\n",
			chinese_number(amount),
			ob->query("base_unit"),
			ob->query("name")),
			me);

		if  (amount  ==  ob->query_amount())  destruct  (ob);
		else  ob->add_amount(-amount);

		message_vision("$N手一压:好!现在开掷,大家一个一个来。\n",  me);
		game_status  =  3;
				
		call_out("game_process",  1);	
	}	
	return  1;
}

int  do_cancel()
{
	//this  can  only  happen  in  bet  process.
	//for  zhuang-jia,  he  does  not  want  continue  and  lost  his  zhuang_deposit  and  
	//others  get  money  back.  
	//for  non_zhuang  players,  he  simply  gets  his  money  back.
	object  me;
	int  i;
	object  *inv  =  all_inventory(this_object());
	me  =  this_player();

	if(game_status  !=  2)  return  notify_fail("现在没有什么需要取消的。\n");  

	if(  me->query_temp("shaizi_cancel_count")  >  5  )
		return  notify_fail("你最近反悔的次数太多了,赌信已经太差。\n");  

	if(  me->query("id")  ==  zhuang_id  )
	{//I  am  zhuang-jia.
		message_vision("$N起身说道:这一把我赌不下去了,你们把钱拿回去另找人坐庄吧!\n",  me);		
		zhuang_id  =  "no  zhuang";
		me->delete_temp("shaizi");

		me->set_temp("shaizi_cancel_count",  1+me->query_temp("shaizi_cancel_count"));

		//give  ppls  money  back.
		for(i=0;  i<sizeof(inv);  i++)
		{
			if(  inv[i]->query_temp("shaizi/bet_amount")  >  0  &&  inv[i]->query("id")  !=  zhuang_id  )
			{
				total_bet  -=    inv[i]->query_temp("shaizi/bet_amount");
				if(total_bet  >=  0)
				{
					pay_player(inv[i],  inv[i]->query_temp("shaizi/bet_amount"));
					message_vision("$N起身把放在桌子上的赌注拿了回来。\n",  inv[i]);
				}
				else
				{
					message_vision("糟糕!有人在这里偷钱!$N的钱没了。\n",  inv[i]);
				}
			}
			if(  inv[i]->query_temp("shaizi")  )  inv[i]->delete_temp("shaizi");
		}
		zhuang_id  =  "no  zhuang";
		game_status  =  0;
		total_bet  =  0;
		remove_call_out("check_finish");
	}
	else
	{//if  I  am  not  zhuang-jia.
		if(  me->query_temp("shaizi/bet_amount")  <=  0  )  
			return  notify_fail("你又没下注,在这里起什么哄?\n");  
			
		total_bet  -=    me->query_temp("shaizi/bet_amount");
		if(  total_bet  >=0  )
		{		
			message_vision("$N起身把放在桌子上的赌注拿了回来。\n",  me);
			pay_player(me,  me->query_temp("shaizi/bet_amount"));
			me->delete_temp("shaizi");
			me->set_temp("shaizi_cancel_count",  1+me->query_temp("shaizi_cancel_count"));
		}
		else
		{
			message_vision("糟糕!有人在这里偷钱!$N的钱没了。\n",  me);
		}
	}
	return  1;
}

int  do_zuozhuang()
{
	object  me,  zhuang;

	int  zhuang_deposit  =  500;  //5  gold.

	me=this_player();

	if  (zhuang_id  ==  me->query("id"))
	{
		return  notify_fail("你已经是庄家了。\n");
	}
	
	if(game_status  ==  1  ||  game_status  ==  0  )
	{//only  in  this  two  case  can  换庄
		if(objectp(zhuang=present(zhuang_id,  this_object()))  )
		{//if  the  previous  zhuang-jia  is  here.
			//if  the  zhuang-jia  does  not  "start"...cancel  his  zhuang.
			if(ask_for_zhuang  ==  0)
			{
				ask_for_zhuang  =  1;
				call_out("check_start",  120,  round);
				tell_room(this_object(),  me->query("name")+"也想坐庄。如果庄家两分钟内不能开盘(start),就得让庄了。\n");
			}  
			return  notify_fail("已经有庄家了,叫"+zhuang->query("name")+"("+zhuang->query("id")+")让庄吧。\n");	
		}
		else
		{
			if(  !pay_out(me,  zhuang_deposit)  )
				return  notify_fail("你没有足够的钱交坐庄保证金。\n");

			me->set_temp("shaizi_zhuang_deposit",  500);
			//note  this  parameter  is  not  in  "shaizi"  array.
		
			message_vision("$N拿出一锭金子往桌上一拍,在庄家的位子上坐了下来。\n",  me);
			zhuang_id  =  (string)me->query("id");
			game_status  =  1;  //zhuang-jia  changed.
			return  1;
		}
	}
	else
		return  notify_fail("现在还不能换庄。\n");
}

int  do_retire()
{
	object  me;

	me=this_player();

	if(zhuang_id  !=  me->query("id"))
		return  notify_fail("你又不是庄家,让什么让?\n");

	if(game_status  ==  1  ||  game_status  ==  0  )
	{
		message_vision("$N站起来嚷道:这个霉庄我可不坐了!说罢顺手将桌上的保证金揣在怀里。\n",  me);
		zhuang_id  =  "no  zhuang";
		game_status  =  0;
		pay_player(me,  me->query_temp("shaizi_zhuang_deposit"));
		me->delete_temp("shaizi_zhuang_deposit");
		return  1;
	}
	else
	{//not  the  time  to  让庄.
		return  notify_fail("想逃?好歹得赌完这一把。\n");
	}
}

int  do_start(string  arg)
{
	int  max_limit  =  1000;  //1000  gold.
	int  min_limit  =  10;  //10  gold.
	int  current_limit;

	object  me;

	me=this_player();

	if(zhuang_id  !=  me->query("id"))
		return  notify_fail("只有庄家才能开盘。\n");

	if(game_status  ==  1  ||  game_status  ==  0  )
	{
		if(!  arg  ||  sscanf  (arg,"%d",  current_limit)  !=  1)
			return  notify_fail("请使用:start  <赌注上限,单位:黄金>\n");

⌨️ 快捷键说明

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