作者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)