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 + -
显示快捷键?