作者laechan (小太保)
看板mud
標題Re: [wizs] 數字圖程式
時間Wed Oct 19 14:19:35 2011
// 數字圖產生程式
// 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)