Placard

来看我的主页~,以后可能不维护BLOG了。

http://euclid.ik8.com

Category
Latest Entries
Latest Comments
Last Messages
Links
Information
Search
Other
Welcome to euclid blog!
  漂亮的画围墙算法
 

/*
  墙壁交叉 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;
}

[ 阅读全文 | 回复(0) | 引用通告 | 编辑

  Post  by  欧几里得 发表于 2006-1-12 20:47:00

发表评论:

    昵称:
    密码: (游客无须输入密码)
    主页:
    标题:
Power By euclid备忘录
Powered by Oblog.