ソースを上げるスレッド

43暇なのでもう一つ作った
#include <curses.h>
#include <sys/time.h>
#include <time.h>
char *e="zzzqASAVANoAVASANoAarANuANoANuANrAaoANrANuANoANuANrANoASAPARAPARAPASA"
"NoANrANoANznANoANrANoASANoARANoARANoASANvANuBoBuANuGnANoMEoANoFuANoBsBsBoANuI"
"NDnLnENHuANoBznBoANuGnANoMEoANnGuANoBznBoANvASAPARANoAVASANoANrANuANoANuANrAN"
"oAaNANoAPARANCRAPANoAOAarANoANoANznANoBoANrAOAPANoARANoARANoASANoANzoANoANzoA"
"NoAZPAPAZPANzzzq",f[42*22+1],fk[42*22],*p[]={"(V","(D","(<","(=","h)","l)",
">)","=)"},*m[]={"%%","%%","@@","><"},t[]={' ','.','*','#'},d[]={-42,1,42,-1},
em[4],ed[4];int kn=0,k[99],kk[9999],kl[9999],kr[9999],ps=16*42+20,dr=1,ct=0,dt=
0,dd[]={'k','l','j','h'},v=0,ts=0,ep[]={10*42+20,10*42+20,10*42+20,10*42+20};
int nn(int c){return c==' '||c=='.'||c=='*';}int nw(int z){return nn(f[z])&&nn(
f[z+1]);}int ck(int p){int a=f[p],b=f[p+1];if(a=='#'||b=='#')return 3;if(a=='*'
||b=='*')return 2;if(a=='.'||b=='.')return 1;return 0;}int kc(int a, int b){int
d=(a/42==b/42)?((a%42)>(b%42))*2-1:(a>b)*84-42;for(;b!=a;b+=d)if(!nw(b))return
0;return 1;}void emv(int e){int i,j,z;if((i=fk[ep[e]])!=0){i--;switch(em[e]){
case 1:j=ep[e];if(e==3||(e==2&&abs((j%42)-(ps%42))+abs(j/42-ps/42)>30))goto ky;
if(j/42==ps/42&&kc(j,ps))ed[e]=((j%42)>(ps%42))?3:1;else if(j%42==ps%42&&kc(j,
ps))ed[e]=((j/42)>(ps/42))?0:2;else{j=d[(e&1)?(dr+2)%4:dr];for(z=ps;!fk[z];z+=j
);j=fk[z]-1;if (j>=0)ed[e]=kk[i*kn+j];}break;case 0:ky:j=ed[e];do{ed[e]=(rand()
/10)%4;}while(ed[e]==j||ck(ep[e]+d[ed[e]])>2);j=ep[e];if(j%42==ps%42||j/42==ps/
42)em[e]=1;break;case 2:j=d[(dr+2)%4];for(z=ps;!fk[z];z+=j);j=fk[z]-1;if (j>=0)
j=kk[i*kn+j];for(i=0;i<3;i++)if(ck(ep[e]+d[(i+j+1)%4])<3)break;ed[e]=(i+j+1)%4;
break;case 3:ed[e]=kk[i*kn+fk[10*42+20]-1];if(ep[e]==10*42+20)em[e]=0;break;}if
(em[e]<2&&((rand()/10)%20)==0)em[e]^=1;}i=ct;if(em[e]==2){if(i&1)return;else i
/=2;}if(em[e]==3)i=1;if(ed[e]&1||i&1){if(ck(ep[e]+d[ed[e]])<3)ep[e]+=d[ed[e]];
else ed[e]=(ed[e]+2)%4;}}void ev(int e){move(ep[e]/42,ep[e]%42);printw("%s",m[
em[e]]);}void kb(){int i=0;for(;i<22*44;i++)if (nw(i)&&nw(i-2)+nw(i+2)&&nw(i+42
)+nw(i-42)){k[kn++]=i;fk[i]=kn;}}int kd(){int i=0,j;for(;i<kn;i++)for(j=0;j<kn;
j++){if(k[i]/42==k[j]/42&&kc(k[i],k[j])){kl[i*kn+j]=abs((k[i]%42)-(k[j]%42));kk
[i*kn+j]=((k[i]%42)>(k[j]%42))?3:1;}if(k[i]%42==k[j]%42&&kc(k[i],k[j])){kl[i*kn
+j]=abs((k[i]-k[j])/42)*2;kk[i*kn+j]=((k[i]/42)>(k[j]/42))?0:2;}}}void wf(){int
i,x,y;for(i=0;i<kn*kn;i++)kr[i]=i/kn;for(y=0;y<kn;y++)for(x=0;x<kn;x++)if(kl[x*
kn+y])for(i=0;i<kn;i++)if(kl[y*kn+i])if(!kl[x*kn+i]||(kl[x*kn+y]+kl[y*kn+i])<kl
[x*kn+i]){kl[x*kn+i]=kl[x*kn+y]+kl[y*kn+i];kr[x*kn+i]=kr[y*kn+i];}for(y=0;y<kn;
y++)for(x=0;x<kn;x++){int n=kr[y*kn+x],m=x;for(;n!=y;n=kr[y*kn+n])m=n;kk[y*kn+x
]=kk[y*kn+m];}}void de(){int j=0;while(*e){int i,a=(*e<'a')?*e-'A':*e-'a'+26;i=
a%13;a/=13;for(i++;i;i--){f[j++]=t[a];if(a==1)ts++;}e++;}}void vw(){move(0,0);
printw("%s",f);}void st(int z){f[ps]=z?p[dr*2+(ct&1)][0]:' ';f[ps+1]=z?p[dr*2+(
ct&1)][1]:' ';}
44つづき:01/12/29 00:29 ID:???
void main(){int i,w,f=fileno(stdin),c,k=0;fd_set fdset,rfdset;
struct timeval tv;srand(time(NULL));FD_ZERO(&fdset);FD_SET(f,&fdset);tv.tv_sec=
0;tv.tv_usec=200000;initscr();stdscr=newwin(22,42,0,0);noecho();cbreak();de();
kb();kd();wf();while(1){ct++;rfdset=fdset;if(select(f+1,&rfdset,NULL,NULL,&tv)>
0){k=getch();if(k=='q')exit(0);}for(i=0;i<4;i++)if(k==dd[i]&&ck(ps+d[i])<3)dr=i
;c=ck(ps+d[dr]);if(dt>=ts){move(10,16);printw("GAME CLEAR");refresh();exit(0);}
if(c<3&&(dr&1||ct&1)){ps+=d[dr];if(c==1)dt++;if(c==2){for(i=0;i<4;i++)if(em[i]
!=3){ed[i]=(ed[i]+2)%4;em[i]=2;}v=60;}}if(v&&--v==1){for(i=0;i<4;i++)if(em[i]<3
)em[i]=0;v=0;}if(ps==10*42+40)ps=10*42;else if(ps==10*42)ps=10*42+40;for(i=0;i<
4;i++)if(abs(ps-ep[i])<2){if(em[i]==2)em[i]=3;if(em[i]<2){move(10,16);printw(
"GAME OVER");refresh();exit(0);}}emv(0);emv(1);emv(2);emv(3);st(1);vw();ev(0);
ev(1);ev(2);ev(3);move(0,0);refresh();st(0);}}
今度はパックマン。
コンパイルの方法は>>34と同じ。Windowsでは試してないけどぷよぷよ同様いけると思う。
操作方法はviキーバインド('h'~'l'で操作)。

一応各モンスターには性格付けしてる。
ドット全部食べてもクリアにならないことがあるけど許すように。

ふぅ。