perl版の倉庫番は
>>120 で出ているけど、今度は C で倉庫番。
#include <stdio.h>
char*strchr(const char*,int),*d="?@` A",*c=" .+*#@",m[768],*p,*q=m,*r,a,j,l;int
i;t(char*x){return strchr(c,*x)-c;}main(){FILE*e=fopen("map","r");for(;i<768;)j
=getc(e),j==10?i|=31:0,m[i++]=j;for(;q<m+768;)r=c+t(q),!r||!*q?r=c:0,r==c+5?p=q
:0,l+=r==c+2,*q++=*r;for(;;l?0:exit(0),i=getchar()-104,i<0|i>4?0:(j=d[i]-64,q=p
+j,r=q+j,t(q)&4?0:(t(q)&2?t(r)>1?0:(l+=(t(q)&1)-t(r),*q=c[t(q)-2],*r=43-t(r)):1
)?*p=c[a],a=t(q),*q=64,p=q:0))for(q=m,i=0;i<792;)putchar(i++%33?*q++:10);}
・ASCIIコード依存な上sizeof(int)>=sizeof(char *)じゃないと動かない…。
・マップはファイル "map" から読み込む(最大31x24)。
・@が自分、+が荷物、.がマーカー、*がマーカー上の荷物、#は壁。
それ以外は道。
・hjkl + 改行で移動(vi or rogue風)。
サンプルの map ファイル。
x#######
##....x#
###...+###
#xx+#+x+x#
#x++xx#+x#
#xxxx#xxx#
####x@x###
xxx#####