/*
墙壁交叉 Tile 的处理. 类似于文本方式的制表符处理,
我们需要针对制表线的交叉输出正确的 ASCII 码.如果
采用多层条件判断是很愚蠢的方法. 最简洁的程序是将
拼接用的图素按一定的次序 (序号的 2 进制形式可以
反映周围的连接状态) 排列. 然后通过简单的公式计算
出正确的元素.
如下程序演示了这一算法, 其输出结果如下
┏━━┳━━━┳━┓
┃ ┃ ┃ ┃
┃ ┃ ┗━┫
┃ ┃ ┃
┃ ┏┻━┓ ┃
┃ ┃ ┃ ┃
┃ ┗━━╋━━━┫
┃ ┃ ┃
┃ ┃ ┃
┗━━━━┻━━━┛
程序没有注释, 但应当很容易理解. 如有问题, 可以联系
作者 cloudwu@263.net
Homepage: http://member.netease.com/~cloudwu
云风作于 1999 年 9 月 20 日
*/
#i nclude <stdio.h>
#define MAX 12
char wall[32]="·┃━┗┃┃┏┣━┛━┻┓┫┳╋";
char map[MAX][MAX]={
"............",
".oooooooooo.",
".o..o...o.o.",
".o..o...ooo.",
".o..o.....o.",
".o.oooo...o.",
".o.o..o...o.",
".o.oooooooo.",
".o....o...o.",
".o....o...o.",
".oooooooooo.",
"............"
};
int main()
{
int i,j,id;
for (i=1;i<MAX-1;i++) {
for (j=1;j<MAX-1;j++)
if (map[i][j]=='.') printf(" ");
else {
id=(map[i][j-1]=='o')<<3|(map[i+1][j]=='o')<<2|
(map[i][j+1]=='o')<<1|(map[i-1][j]=='o');
printf("%c%c",wall[id*2],wall[id*2+1]);
}
printf("\n");
}
return 0;
}