duroom.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 687 行 · 第 1/2 页
C
687 行
//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 "east" : "/d/changan/yuefang", ])); set("objects", ([ //sizeof() == 1 "/d/changan/npc/gongsun" : 1, ])); //set("outdoors", "city"); set("no_fight", 1); set("no_magic", 1); set("no_clean_up", 0); 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"); 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");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?