shaizi-room.c

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

C
706
字号
		if(current_limit  <  min_limit)
			return  notify_fail("你也太穷了吧?还是别坐庄了。赌注上限别少于"+chinese_number(min_limit)+"两黄金。\n");
		if(current_limit  >  max_limit)
			return  notify_fail("你也太富了吧?别超过"+chinese_number(max_limit)+"两黄金。\n");

		max_bet  =  100*current_limit;  //max_bet  in  silver.
		message_vision("$N手一挥大声叫道:开盘!现在开始下注!\n",  me);
		message_vision("$N顿了一下:赌注别超过"+chinese_number(current_limit)+"两黄金。\n",  me);

		total_bet  =  0;
		game_status  =  2;  //enter  the  bet  process.
		round++;  //we  increase  this  number  to  indicate  a  new  round  of  game.
		remove_call_out("check_finish");
		call_out("check_finish",  600,  round);  
		//a  game  must  be  finished  within  10  minutes.  
		return  1;
	}
	else
	{//not  the  time  to  开盘.
		return  notify_fail("现在还不能开盘。\n");
	}
}

void  check_start(int  previous_round)
{
	ask_for_zhuang  =  0;//so  after  this,  can  ask  again...

	if(previous_round  !=  round)  return;  //it  means  already  started.	

	//now  if  still  in  this  round.
	if(  game_status  ==  3)  return;  //game  in  processing,  can  do  nothing  here.

	tell_room(this_object(),  "庄家迟迟不开盘,只好换庄了。\n");
	zhuang_id  =  "no  zhuang";
	game_status  =  0;
	total_bet  =  0;
}

void  check_finish(int  previous_round)
{
	int  i;
	object  *inv  =  all_inventory(this_object());

	if(previous_round  !=  round)  return;  //it  means  already  finished.
	
	//now  if  still  in  this  round.
	if(  game_status  ==  3)  return;  //game  in  processing,  can  do  nothing  here.

	//here  we  need  cancel  the  game.
	//give  money  back  to  all  players  except  zhuang-jia,  cuz  this  is  his/her  fault.
	tell_room(this_object(),  "这一局迟迟未能完成,只好取消重来了。\n");
	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;
}

void  game_process()
{
	int  i,  j;
	object  *inv  =  all_inventory(this_object());
	
	j=0;
	for(i=0;  i<sizeof(inv);  i++)
	{
		if(  (int)inv[i]->query_temp("shaizi/bet_amount")  >  0  )
		{
			j++;
			call_out("show_shaizi",  j*4,  inv[i]);
		}
	}

	call_out("game_result",  (j+2)*4);	
}

void  show_shaizi(object  me)
{
	string  point_msg;
	string  *sha_msg  =  ({
		"瞪着一对红眼,大喝一声:杀!手中的两粒骰子往桌子上一摔!\n",
		"往手上吹了口气,两粒骰子轻轻一抛...\n",
		"微微一笑,两粒骰子往桌子上一滚...\n",
		"望空作了个揖:菩萨保佑!两粒骰子战战噤噤地桌上一投...\n",
		"拿着两粒骰子,抖足精神:娶老婆生孩子在此一举!\n",
		"衣袖一卷,大声叫道:看我的!\n",
		"咬牙切齿,两粒骰子往桌子上狠狠地一砸...\n",
		"满头大汗,自言自语道:六对,六对,该上我家了吧...\n",
		"潇洒地作了个四方揖:这把该我赢,看好了...\n",
		});

	string  *shaizi_msg  =  ({
"┌───┐\n"+
"│   │\n"+
"│   │\n"+
"│   │\n"+
"└───┘\n",  
"┌───┐\n"+
"│   │\n"+
"│ ● │\n"+
"│   │\n"+
"└───┘\n",  
"┌───┐\n"+
"│   │\n"+
"│● ●│\n"+
"│   │\n"+
"└───┘\n",  
"┌───┐\n"+
"│●  │\n"+
"│ ● │\n"+
"│  ●│\n"+
"└───┘\n",  
"┌───┐\n"+
"│● ●│\n"+
"│   │\n"+
"│● ●│\n"+
"└───┘\n",  
"┌───┐\n"+
"│● ●│\n"+
"│ ● │\n"+
"│● ●│\n"+
"└───┘\n",  
"┌───┐\n"+
"│● ●│\n"+
"│● ●│\n"+
"│● ●│\n"+
"└───┘\n",
		});

	if(environment(me)  ==  this_object()  ||  me->query_temp("shaizi/bet_amount")  >  0)
	{
		me->set_temp("shaizi/point1",  1+random(6));//first  shaizi.
		me->set_temp("shaizi/point2",  1+random(6));//second  shaizi.
		if(  me->query_temp("shaizi/point1")  ==  me->query_temp("shaizi/point2")  &&  me->query_temp("shaizi/point2")  !=  0  )
		{
			me->set_temp("shaizi/point",    100+me->query_temp("shaizi/point2"));
			point_msg  =  chinese_number(me->query_temp("shaizi/point2"))+"对";
		}
		else
		{
			me->set_temp("shaizi/point",    (me->query_temp("shaizi/point1")  +me->query_temp("shaizi/point2")  )%10);
			point_msg  =  chinese_number(me->query_temp("shaizi/point"))+"点";
			if(me->query_temp("shaizi/point")  ==  0)
				point_msg  =  "蹩十";
		}		

		tell_room  (this_object(),  me->query("name")+sha_msg[random(sizeof(sha_msg))]);
		tell_room  (this_object(),  shaizi_msg[(int)me->query_temp("shaizi/point1")]);
		tell_room  (this_object(),  shaizi_msg[(int)me->query_temp("shaizi/point2")]);
		tell_room  (this_object(),  "众人齐声叫道:"+point_msg+"!\n");
	}
	
}

void  game_result()
{
	object  zhuang;
	int  i,  zhuang_point;
	object  *inv  =  all_inventory(this_object());

	if(objectp(zhuang=present(zhuang_id,  this_object()))  &&  living(zhuang)  )
	{//if  the  zhuang-jia  is  here.
		tell_room(this_object(),  zhuang->query("name")+"大声宣布:结帐!\n");	
		zhuang_point  =  zhuang->query_temp("shaizi/point");
	}
	else  
	{
		tell_room(this_object(),  "庄家不知道跑到哪里去了。大家都赢了!\n");	
		zhuang_point  =  -1;
		zhuang_id  =  "no  zhuang";
	}	
	
	for(i=0;  i<sizeof(inv);  i++)
	{
		if(  (int)inv[i]->query_temp("shaizi/bet_amount")  >  0  &&    inv[i]->query("id")  !=  zhuang_id)
		{
			if(  (int)inv[i]->query_temp("shaizi/point")  >  zhuang_point  )
			{//this  player  won.
				tell_room(this_object(),  inv[i]->query("name")+"赢了"+chinese_number(inv[i]->query_temp("shaizi/bet_amount"))+"两银子。\n");
				total_bet  -=  2*inv[i]->query_temp("shaizi/bet_amount");
				if(total_bet  >=  0)
				{  
					pay_player(inv[i],  2*inv[i]->query_temp("shaizi/bet_amount"));
				}
				else
				{
					tell_room(this_object(),  "糟糕!有人在这里偷钱!"+inv[i]->query("name")+"赢的钱拿不到了。\n");
				}
			}
			else
			{//this  player  lost.
				tell_room(this_object(),  inv[i]->query("name")+"输了"+chinese_number(inv[i]->query_temp("shaizi/bet_amount"))+"两银子。\n");
			}
		}
	}

	//now  consider  the  zhuang-jia.
	if(zhuang  &&  total_bet  >  0)
	{
		tell_room(this_object(),  "剩下的"+chinese_number(total_bet)+"两银子都是庄家"+zhuang->query("name")+"的了。\n");
		pay_player(zhuang,  total_bet);
		total_bet  =  0;
	}

	//finally,  clear  everything  for  players.
	for(i=0;  i<sizeof(inv);  i++)
	{
		if(  inv[i]->query_temp("shaizi")  )  inv[i]->delete_temp("shaizi");
	}
	game_status  =  0;
	total_bet  =  0;
	remove_call_out("check_finish");
}

void  pay_player(object  me,  int  total)
{
	object  pay_cash,  pay_gold,  pay_silver;

	if(total/1000  >  0)
	{
		pay_cash  =  new("/clone/money/1000-cash");
		pay_cash->set_amount  (total/1000);
		total  -=  1000*pay_cash->query_amount();

		pay_cash->move(me);
	}

	if(total/100  >  0)
	{
		pay_gold  =  new("/clone/money/gold");
		pay_gold->set_amount(total/100);
		total  -=  100*pay_gold->query_amount();

		pay_gold->move(me);
	}

	pay_silver  =  new("/clone/money/silver");
	pay_silver->set_amount(total);
	if(total  >  0)
	{
		pay_silver  =  new("/clone/money/silver");
		pay_silver->set_amount(total);
		total  -=  pay_silver->query_amount();

		pay_silver->move(me);
	}
}

int  pay_out(object  me,  int  total)
{//player  pay  money  out,  in  unit  of  silver.
  //if  sucessful  return  1,  else  return  0.
  //what  I  did  here  is  check  all  the  money  in  silver  the  player  has,
  //then  destroy  all  his  cash,  gold,  silver...then  pay  him  back  the  difference.
	
	int  diff;
	object  cash,  gold,  silver;

	diff  =  check_silver(me)  -  total;	
	if(  diff  <  0  )  return  0;  
	//the  player  does  not  have  enough  money.

	//now  destroy  this  players  cash,  gold  and  silver.
	cash  =  present("1000-cash_money",  me);
	gold  =  present("gold_money",  me);
	silver  =  present("silver_money",  me);
	if(  cash  )  destruct(cash);
	if(  gold  )  destruct(gold);
	if(silver)  destruct(silver);

	//now  pay  his  back  the  difference.	
	if(  diff  >  0  )  pay_player(me,  diff);

	return  1;		
}

int  check_silver(object  me)
{//this  function  check  the  money  in  silver  a  player  has,
	object  cash,  gold,  silver;
	int  total_silver;
	
	cash  =  present("1000-cash_money",  me);
	gold  =  present("gold_money",  me);
	silver  =  present("silver_money",  me);
	total_silver  =  0;
	if(  cash  )  total_silver  +=  1000*(cash->query_amount());
	if(  gold  )  total_silver  +=  100*(gold->query_amount());
	if(silver)  total_silver  +=  (silver->query_amount());	

	return  total_silver;
}


int  do_look(string  arg)
{
	object  zhuang;
	object  *inv  =  all_inventory(this_object());
	int  i;
	object  me  =  this_player();

	if(arg  ==  "table")
	{
		if(total_bet  >  0)
		{
			write("现在的赌注总共是"+total_bet+"两银子。\n");
			for(i=0;  i<sizeof(inv);  i++)
			{
				if(  inv[i]->query_temp("shaizi/bet_amount")  >  0  )
					write(inv[i]->query("name")+":"+inv[i]->query_temp("shaizi/bet_amount")+"两。\n");
			}

		}
		else  write("现在还没有人下注。\n");

		if(zhuang_id  ==  "no  zhuang")
			write("目前还没有庄家。\n");
		else
		{
			if(objectp(zhuang=present(zhuang_id,  this_object()))  &&  living(zhuang)  )
			{//if  the  zhuang-jia  is  here.
				write("目前的庄家是"+zhuang->query("name")+"("+zhuang->query("id")+")。\n");	
			}
			else  
			{
				write("庄家不知道跑到哪里去了。\n");
				zhuang_id  =  "no  zhuang";
			}		
		}
		return  1;
	}
	return  0;	
}





⌨️ 快捷键说明

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