duroom.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 687 行 · 第 1/2 页
C
687 行
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 + -
显示快捷键?