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