📄 fxq.c
字号:
// fxq.c 飞行棋// Make by 猫部猫(Catyboy)#include <ansi.h>inherit ITEM;int has_start;mixed wake_point; // 出机点数int cur_player; // 当前的玩家IDint cur_se; // 当前色子数目mixed *cur_qi; // 当前移动的棋子mixed shadow_qi; // 当前移动的棋子的影子int has_jump; // 曾经跳跃过mixed player; // 2 or 4个玩家 [{ id,id,id,id }]#define QI_SLEEP 0#define QI_WAIT 1#define QI_WALK 2#define QI_END 3#define QI_BACK 4#define QI_MOVE 10#define QI_FLAG 0#define QI_X 1#define QI_Y 2#define QI_PLAYER 3#define QI_ID 4#define QI_MAX 5mixed qizi; // 棋子 // ({棋子状态,棋子位置X,棋子位置Y,player,qi_id})mixed player_start = // 玩家的起点({ ({14,10}),({4,14}),({0,4}),({10,0})});mixed player_ready = // 玩家的出机位置({ ({ ({14,12}),({13,12}),({12,12}),({11,12}) }), ({ ({2,14}),({2,13}),({2,12}),({2,11}) }), ({ ({0,2}),({1,2}),({2,2}),({3,2}) }), ({ ({12,0}),({12,1}),({12,2}),({12,3}) }),});mixed super_hit = // 超级跳跃的攻击点({ ({3,7}),({7,3}),({11,7}),({7,11})});mixed qi_view = // 玩家的棋子的外观({ ({"1","2","3","4"}), // 其他人看的棋子 ({"A","B","C","D"}), // 当前活动的棋子});mixed clr =({ "",HIR,HIY,HIB,HIG});mixed bkclr =({ "",HBRED,HBMAG,HBBLU,HBGRN});#define P_LEFT 1 // 路径#define P_RIGHT 2#define P_UP 4#define P_DOWN 8#define B_NORMAL 0#define B_GATE 1 // 完成的道门#define B_ROAD 2 // 完成的道#define B_SJUMP 3 // 超级跳跃#define B_END 4 // 结束#define B_STOP 5 // 停机场#define B_READY 6 // 出机场#define BD_COLOR 0#define BD_PATH 1#define BD_FLAG 2#define BD_PLAYER 3#define BD_QI 4mixed board = // ({属性,路径,标志,玩家号,棋子号})({({ ({3,0,5,0,0 }),({3,0,5,0,0 }), 0 , 0 ,({1,2,0,0,0 }),({2,2,0,0,0 }),({3,2,0,0,0 }),({4,2,1,0,0 }),({1,2,0,0,0 }),({2,2,0,0,0 }),({3,8,0,0,0 }), 0 ,({4,0,6,0,0 }),({4,0,5,0,0 }),({4,0,5,0,0 }),}),({ ({3,0,5,0,0 }),({3,0,5,0,0 }), 0 , 0 ,({4,4,0,0,0 }), 0 , 0 ,({4,8,2,0,0 }), 0 , 0 ,({4,8,0,0,0 }), 0 ,({4,0,6,0,0 }),({4,0,5,0,0 }),({4,0,5,0,0 }),}),({ ({3,0,6,0,0 }),({3,0,6,0,0 }),({3,0,6,0,0 }),({3,0,6,0,0 }),({3,4,0,0,0 }), 0 , 0 ,({4,8,2,0,0 }), 0 , 0 ,({1,8,0,0,0 }), 0 ,({4,0,6,0,0 }), 0 , 0 ,}),({ 0 , 0 , 0 , 0 ,({2,4,3,0,0 }), 0 , 0 ,({4,8,2,0,0 }), 0 , 0 ,({2,10,0,0,0}), 0 ,({4,0,6,0,0 }), 0 , 0 ,}),({ ({2,2,0,0,0 }),({3,2,0,0,0 }),({4,2,0,0,0 }),({1,6,0,0,0 }), 0 , 0 , 0 ,({4,8,2,0,0 }), 0 , 0 , 0 ,({3,2,3,0,0 }),({4,2,0,0,0 }),({1,2,0,0,0 }),({2,8,0,0,0 }),}),({ ({1,4,0,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({4,8,2,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({3,8,0,0,0 }),}),({ ({4,4,0,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({4,8,4,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({4,8,0,0,0 }),}),({ ({3,4,1,0,0 }),({2,2,2,0,0 }),({2,2,2,0,0 }),({2,2,2,0,0 }),({2,2,2,0,0 }),({2,2,2,0,0 }),({2,2,4,0,0 }), 0 ,({1,1,4,0,0 }),({1,1,2,0,0 }),({1,1,2,0,0 }),({1,1,2,0,0 }),({1,1,2,0,0 }),({1,1,2,0,0 }),({1,8,1,0,0 }),}),({ ({2,4,0,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({2,4,4,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({2,8,0,0,0 }),}),({ ({1,4,0,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({2,4,2,0,0 }), 0 , 0 , 0 , 0 , 0 , 0 ,({3,8,0,0,0 }),}),({ ({4,4,0,0,0 }),({3,1,0,0,0 }),({2,1,0,0,0 }),({1,1,3,0,0 }), 0 , 0 , 0 ,({2,4,2,0,0 }), 0 , 0 , 0 ,({3,9,0,0,0 }),({2,1,0,0,0 }),({1,1,0,0,0 }),({4,1,0,0,0 }),}),({ 0 , 0 ,({2,0,6,0,0 }), 0 ,({4,5,0,0,0 }), 0 , 0 ,({2,4,2,0,0 }), 0 , 0 ,({4,8,3,0,0 }), 0 , 0 , 0 , 0 ,}),({ 0 , 0 ,({2,0,6,0,0 }), 0 ,({3,4,0,0,0 }), 0 , 0 ,({2,4,2,0,0 }), 0 , 0 ,({1,8,0,0,0 }),({1,0,6,0,0 }),({1,0,6,0,0 }),({1,0,6,0,0 }),({1,0,6,0,0 }),}),({ ({2,0,5,0,0 }),({2,0,5,0,0 }),({2,0,6,0,0 }), 0 ,({2,4,0,0,0 }), 0 , 0 ,({2,4,2,0,0 }), 0 , 0 ,({2,8,0,0,0 }), 0 , 0 ,({1,0,5,0,0 }),({1,0,5,0,0 }),}),({ ({2,0,5,0,0 }),({2,0,5,0,0 }),({2,0,6,0,0 }), 0 ,({1,4,0,0,0 }),({4,1,0,0,0 }),({3,1,0,0,0 }),({2,1,1,0,0 }),({1,1,0,0,0 }),({4,1,0,0,0 }),({3,1,0,0,0 }), 0 , 0 ,({1,0,5,0,0 }),({1,0,5,0,0 }),}),});mixed board_view = // 棋盘视图 红黄蓝绿({ ({ HBWHT HIB "●" NOR,HBWHT HIB "●" NOR," "," " ,HIR "●" NOR,HIY "●" NOR,HIB "●" NOR,HIG "◆" NOR,HIR "●" NOR,HIY "●" NOR,HIB "●" NOR, "←"," ",HBWHT HIG "●" NOR,HBWHT HIG "●" NOR, }), ({ HBWHT HIB "●" NOR,HBWHT HIB "●" NOR," "," " ,HIG "●" NOR, " " , " " ,HIG "●" NOR, " " , " " ,HIG "●" NOR, " "," ",HBWHT HIG "●" NOR,HBWHT HIG "●" NOR, }), ({ " " , " " , " " , " " ,HIB "●" NOR, " " , " " ,HIG "●" NOR, " " , " " ,HIR "●" NOR, " " , " " , " " , " " , }), ({ "↓" , " " , " " , " " ,HIY "★" NOR,HIY "→" NOR,HIY "→" NOR,HIG "●" NOR,HIY "→" NOR,HIY "→" NOR,HIY "●" NOR, " " , " " , " " , " " , }), ({ HIY "●" NOR,HIB "●" NOR,HIG "●" NOR,HIR "●" NOR, " " , " " , " " ,HIG "●" NOR, " " , " " , " " ,HIB "★" NOR,HIG "●" NOR,HIR "●" NOR,HIY "●" NOR, }), ({ HIR "●" NOR, " " , " " ,HIR "↑" NOR, " " , " " , " " ,HIG "●" NOR, " " , " " , " " ,HIB "↓" NOR, " " , " " ,HIB "●" NOR, }), ({ HIG "●" NOR, " " , " " ,HIR "↑" NOR, " " , " " , " " ,HIG "◎" NOR, " " , " " , " " ,HIB "↓" NOR, " " , " " ,HIG "●" NOR, }), ({ HIB "◆" NOR,HIB "●" NOR,HIB "●" NOR,HIB "●" NOR,HIB "●" NOR,HIB "●" NOR,HIB "◎" NOR,HIC "※" NOR,HIR "◎" NOR,HIR "●" NOR,HIR "●" NOR,HIR "●" NOR,HIR "●" NOR,HIR "●" NOR,HIR "◆" NOR, }), ({ HIY "●" NOR, " " , " " ,HIR "↑" NOR, " " , " " , " " ,HIY "◎" NOR, " " , " " , " " ,HIB "↓" NOR, " " , " " ,HIY "●" NOR, }), ({ HIR "●" NOR, " " , " " ,HIR "↑" NOR, " " , " " , " " ,HIY "●" NOR, " " , " " , " " ,HIB "↓" NOR, " " , " " ,HIB "●" NOR, }), ({ HIG "●" NOR,HIB "●" NOR,HIY "●" NOR,HIR "★" NOR, " " , " " , " " ,HIY "●" NOR, " " , " " , " " ,HIB "●" NOR,HIY "●" NOR,HIR "●" NOR,HIG "●" NOR, }), ({ " " , " " , " " , " " ,HIG "●" NOR,HIG "←" NOR,HIG "←" NOR,HIY "●" NOR,HIG "←" NOR,HIG "←" NOR,HIG "★" NOR, " " , " " , " " , "↑" , }), ({ " " , " " , " " , " " ,HIB "●" NOR, " " , " " ,HIY "●" NOR, " " , " " ,HIR "●" NOR, " " , " " , " " , " " , }), ({ HBWHT HIY "●" NOR,HBWHT HIY "●" NOR," "," " ,HIY "●" NOR, " " , " " ,HIY "●" NOR, " " , " " ,HIY "●" NOR, " " ," ",HBWHT HIR "●" NOR,HBWHT HIR "●" NOR, }), ({ HBWHT HIY "●" NOR,HBWHT HIY "●" NOR," ","→" ,HIR "●" NOR,HIG "●" NOR,HIB "●" NOR,HIY "◆" NOR,HIR "●" NOR,HIG "●" NOR,HIB "●" NOR, " " ," ",HBWHT HIR "●" NOR,HBWHT HIR "●" NOR, }),});mixed toss_text = ({ ({"","","","",""}), ({ "┏━━━┐", "│ │", "│ ● │", "│ │", "┖━━━┛", }), ({ "┏━━━┐", "│ ● │", "│ │", "│ ● │", "┖━━━┛", }), ({ "┏━━━┐", "│● │", "│ ● │", "│ ●│", "┖━━━┛", }), ({ "┏━━━┐", "│● ●│", "│ │", "│● ●│", "┖━━━┛", }), ({ "┏━━━┐", "│● ●│", "│ ● │", "│● ●│", "┖━━━┛", }), ({ "┏━━━┐", "│● ●│", "│● ●│", "│● ●│", "┖━━━┛", })});int return_base(int pl_num,int qi_num){ int x,y; x = (pl_num==3 || pl_num==2)?0:13; y = (pl_num==1 || pl_num==2)?13:0; x = (qi_num==1 || qi_num==3)?x:x+1; y = (qi_num==1 || qi_num==2)?y:y+1; qizi[pl_num-1][qi_num-1][QI_FLAG] = QI_SLEEP; qizi[pl_num-1][qi_num-1][QI_X] = x; qizi[pl_num-1][qi_num-1][QI_Y] = y; board[y][x][BD_PLAYER] = pl_num; board[y][x][BD_QI] = qi_num; return 1;}int reset_game(int all){ int i,j; string* idx; object ob; if(all)has_start = 0; cur_player = 0; if(all)player = ({0,0,0,0}); if(all)wake_point = ({6}); qizi = allocate(4); // 4副棋子 for(i=0;i<4;i++) { qizi[i] = allocate(4); // 4个棋子/1副 for(j=0;j<4;j++) qizi[i][j] = ({0,0,0,i+1,j+1}); // 5个状态/1个棋子 } for(i=0;i<15;i++) { for(j=0;j<15;j++) if(board[i][j]) { board[i][j][BD_PLAYER] = 0; board[i][j][BD_QI] = 0; } } for(i=0;i<4;i++) { for(j=0;j<4;j++) return_base(i+1,j+1); }}void msg(object me,object who,string msg){ if(me) message_vision(msg,me,who); else tell_room(environment(this_object()),msg,0);}object get_player(string id){ object ob; if(!id)return 0; ob= find_player(id); if( !ob || environment(ob) != environment(this_object()) ) return 0; return ob;}string player_id(int num){ return player[num];}int player_number(string id){ int i; for(i=0;i<sizeof(player);i++) if(player[i] == id) return i+1; return 0;}object get_cur_player(){ return get_player(player_id(cur_player-1));}string player_info(int id){ object ob; if(id<=4 && id>0) { if(player[id-1]) { ob = get_player(player[id-1]); return sprintf("%s%d"NOR" %s",clr[id],id,ob?ob->query("name")+"("+ob->query("id")+")":"???"); } } else { if(cur_player && ob = get_cur_player()) { if(cur_se) return sprintf("%s%d"NOR" %s [%d]",clr[cur_player],cur_player,ob->query("name")+"("+ob->query("id")+")",cur_se); else return sprintf("%s%d"NOR" %s",clr[cur_player],cur_player,ob->query("name")+"("+ob->query("id")+")"); } } return "";}int is_playing(object ob){ string id; id = ob->query("id"); return player_number(id);}mixed qi2ge(mixed qi){ int x,y; if(!qi)return 0; x = qi[QI_X]; y = qi[QI_Y]; return board[y][x];}mixed ge2qi(mixed ge){ int pl,q; if(!ge)return 0; pl = ge[BD_PLAYER]; q = ge[BD_QI]; if(pl&&q) return qizi[pl-1][q-1]; return 0;}object qi2player(mixed* qi){ object ob; string id; id = player_id(qi[QI_PLAYER]-1); if(!id)return 0; ob= find_player(id); if( !ob || environment(ob) != environment(this_object()) ) return 0; return ob;}void shadow_it(mixed* qi){ int i; shadow_qi = allocate(QI_MAX); for(i=0;i<QI_MAX;i++) shadow_qi[i] = qi[i];}// 开始构造物体void create(){ set_name("飞行棋", ({ "fei xing qi","qi","fxq"}) ); set_weight(10000000); if( clonep() ) set_default_object(__FILE__); else { set("unit", "副"); set("long", "这是一副飞行棋,使用方法请使用(helpqi)命令。\n"); set("value", 1); set("no_get", 1); set("material", "paper"); } reset_game(1); setup();}string build_qi(object who){ string id,t,r,cell; int num,q; int x,y; mixed* ln; mixed* ge; mixed* qi; if(who) id = who->query("id"); r = ""; for(y=0;y<sizeof(board_view);y++) { ln = board_view[y]; for(x=0;x<sizeof(ln);x++) { ge = board[y][x]; qi = 0; if(ge) { if(cur_qi) { if(cur_qi[QI_X] == x && cur_qi[QI_Y] == y) qi = cur_qi; else if(shadow_qi[QI_X] == x && shadow_qi[QI_Y] == y) qi = shadow_qi; else qi = ge2qi(ge); } else qi = ge2qi(ge); if( qi && num = qi[QI_PLAYER]) { q = qi[QI_ID]; if(qi==shadow_qi) t = "S"; else if(player[num-1]==id && cur_player==num) // 自己的棋子 t = clr[num]+qi_view[1][q-1]; else t = clr[num]+qi_view[0][num-1]; switch(qi[0]) { case QI_END: cell = sprintf("%s%s" NOR,clr[num],"〓"); break; case QI_WAIT: if(qi != shadow_qi) { cell = sprintf("%s" NOR,t); break; } case QI_WALK: case QI_BACK: if(qi == cur_qi || qi == shadow_qi) { cell = sprintf(BLINK "%s%s" NOR,bkclr[ge[BD_COLOR]],t); break; } case QI_SLEEP: default: cell = sprintf("%s%s" NOR,bkclr[ge[BD_COLOR]],t); break; } } else cell = ln[x]; } else cell = ln[x]; r += cell; } if(y<4) r+=" " + player_info(y+1); if(y==7) r+=" " + player_info(0); r+="\n"; } return r;}void init(){ add_action("do_help","helpqi"); // 帮助 add_action("do_reset","reset"); // 重置游戏 add_action("do_start","start"); // 重新开始 add_action("do_join","join"); // 加入游戏 add_action("do_toss","toss"); // 摇色子 add_action("do_view","view"); // 查看情况 add_action("do_move","move"); // 移动 add_action("do_next","next"); // 催促}void show_se(int se){ msg(0,0,implode(toss_text[se],"\n")+"\n");}int do_next(string arg){ object ob; object me; me = this_player(); if(me) { if(!is_playing(me)) return notify_fail("你都不玩啊!\n"); if(!has_start) return notify_fail("还没有开始了。\n"); if(!cur_player) return notify_fail("????\n"); ob = get_cur_player(); if(ob==0) return msg(0,0,"有玩家缺场了,请重新开始游戏(reset qi)。\n"); if(me!=ob) msg(me,ob,"$N对$n说道:到你了。\n"); else msg(me,0,"$N对自己说道:到我啦!\n"); } else { ob = get_cur_player(); msg(0,ob,"到$n了。\n"); } return 1;}void next_one(){ int i,j; int cp; cp = 0; if(cur_se==6) cp = cur_player; else cp = cur_player<4?cur_player+1:1; cur_se = 0; cur_qi = 0; shadow_qi = 0; has_jump = 0; j = 0; for(j=0;j<4;j++) { for(i=0;i<4;i++) { if(qizi[cp-1][i][QI_FLAG] != QI_END) { if(cp == cur_player) msg(get_cur_player(),0,"$N投到六点,奖励一次。\n"); else { cur_player = cp; do_next(""); } return; } } cp = cp<4?cp+1:1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -