精華區beta mud 關於我們 聯絡資訊
// 數字圖產生程式 // Laechan@Sanc 2011/10/19 /* 這個程式提供了基本的三種字圖大小,分別是 5x5 、 7x6 、 7x7 三種(可自行新增新的圖) */ // 字圖要用什麼符號去畫 #define NUM_SIGN "*" // 底下的定義代表六位數的意思 #define MIN_NUM 100000 #define MAX_NUM 999999 // 起始位置 #define START_POS 2 // 定義數字之間的最大高度差 #define HEIGHT_DIFF 2 // 定義每個數字所佔的約略寬度, 以及數字之間的約略間距, 則 // 數字圖最大長度 = START_POS + 數字數 x NUM_WIDTH + (數字數-1) x NUM_SPACE // 數字圖最大高度 = 1 + HEIGHT_DEFF + NUM_HEIGHT #define NUM_WIDTH 7 #define NUM_HEIGHT 7 // 定義 7x7 是因為我們所使用的字圖裡最大是 7x7 #define NUM_SPACE 2 // 定義數字之間的約略密集度 // 這個數字請介於 1 ~ 最小字圖寬度/2 之間 #define INTENSITY 1 // 定義雜訊量所佔的比率 // 這個值 = MAX(殘缺+雜訊 所佔的比率) #define NOISE 2 string trans_pic(int n,int l,mixed pos,mixed tmps); // 數字圖的樣式 static mixed pics= ({ // 第一組字圖: 5x5 ({ ({1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1}), ({0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0}), ({1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1}), ({1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1}), ({1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1}), ({1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1}), ({1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1}), ({1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}), ({1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1}), ({1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1}), }), // 第二組字圖: 7列x6 ({ ({1,1,1,1,1,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1}), ({0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0}), ({1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 1,1,1,1,1,1, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,1}), ({1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 1,1,1,1,1,1}), ({1,0,0,0,0,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1}), ({1,1,1,1,1,1, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 1,1,1,1,1,1}), ({1,1,1,1,1,1, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1}), ({1,1,1,1,1,1, 1,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1}), ({1,1,1,1,1,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1}), ({1,1,1,1,1,1, 1,0,0,0,0,1, 1,0,0,0,0,1, 1,1,1,1,1,1, 0,0,0,0,0,1, 0,0,0,0,0,1, 0,0,0,0,0,1}), }), ({ // 第三組字圖: 7x7 ({1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1}), ({0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0}), ({1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 1,1,1,1,1,1,1, 1,0,0,0,0,0,0, 1,0,0,0,0,0,0, 1,1,1,1,1,1,1}), ({1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 1,1,1,1,1,1,1}), ({1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1}), ({1,1,1,1,1,1,1, 1,0,0,0,0,0,0, 1,0,0,0,0,0,0, 1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 1,1,1,1,1,1,1}), ({1,1,1,1,1,1,1, 1,0,0,0,0,0,0, 1,0,0,0,0,0,0, 1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1}), ({1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1}), ({1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1}), ({1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1, 0,0,0,0,0,0,1}), }), }); // 宣告每一組的數字圖大小 ({ 所佔列數 , 字圖寬度 }) static mixed pics_size=({ ({5,5}), ({7,6}), ({7,7}), }); int cmd_runnum(string str,object me) { int x,y,n,i,j,l; mixed tmps=({}),pos=({}); // 取得數字 n=MIN_NUM+random(1+MAX_NUM-MIN_NUM); // 將此數字設在玩家的 temp data 區 // 這裡可依各 mud 的需求自行決定要怎麼儲存該值 me->set_temp("answer_number",n); // 取得位數 l=strlen(""+n); // 先決定每個數字的起始位置座標 // pos=({ ({第一組座標}), ({第二組座標}), ... }); x=START_POS; y=0; for(i=0;i<l;i++) { // 第 i+1 個數字的最初起始位置 x=x+NUM_SPACE-random(INTENSITY); y=random(1+HEIGHT_DIFF); pos+=({ ({x,y}) }); // 將 x 往前推進 x=x+NUM_WIDTH; } y=NUM_HEIGHT+HEIGHT_DIFF; // 這時 x = 數字圖的長度, y = 數字圖的行數 // 產生數字圖陣列 for(i=0;i<y;i++) { tmps+=({ ({}) }); for(j=0;j<x;j++) tmps[i]+=({" "}); } // 進行數字圖轉換 str=trans_pic(n,l,pos,tmps); // 秀出數字圖 write(str+"答案是:"+n+"\n"); return 1; } string trans_pic(int n,int l,mixed pos,mixed tmps) { int i,j,x,y,i1,i2,ni,r,p; mixed num=({}); string sn=""+n; // 第一步, 將數字填進 pics 裡頭 for(i=0;i<l;i++) { // 讀出數字 ni=atoi(sn[i..i]); // 讀出第一個數字的字圖陣列 r=random(sizeof(pics)); num=pics[r][ni]; // 讀出起始位置 x=pos[i][0]; y=pos[i][1]; for(i2=y;i2<y+pics_size[r][0];i2++) { for(i1=x;i1<x+pics_size[r][1];i1++) { p=(i2-y)*(int)pics_size[r][1]+i1-x; if((string)tmps[i2][i1]==" " && pics[r][ni][p]==1) tmps[i2][i1]=NUM_SIGN; } } } sn=""; j=sizeof(tmps); // 雜訊處理 i=sizeof(tmps[0]); ni=(i*j*NOISE)/100; while(ni-->0) { // 隨機挑選位置置入雜訊 x=random(i); y=random(j); tmps[y][x]==NUM_SIGN ? tmps[y][x]=" " : tmps[y][x]=NUM_SIGN; } switch(random(2)) { // 模式1. 正列 case 0: for(i=0;i<j;i++) sn+=implode(tmps[i],"")+"\n"; break; // 模式2. 反列 case 1: for(i=j-1;i>=0;i--) { i2=sizeof(tmps[i]); for(i1=i2-1;i1>=0;i1--) sn+=tmps[i][i1]; sn+="\n"; } break; } return sn; } // end -- ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 編輯: laechan 來自: 117.19.74.101 (10/19 14:32)