关于knocker的“草书”程序
程序代码:
#include <stdio.h> #define U n+g #define J m+f #define G gotoxy #define C printf #define A rand int k ,f,g ,q;int p,m=0, n=1,d=0 ,e=0,a =2,b=5,c =5,t=1 ,M[22][76 ]={-1 ,4};L(){ return a % 2?(f= 0,g=a /2?-1:1):(g=0,f=a/2 ?1:- 1),(! M[J][U]||M[J][U]==10||M[J][U] ==-1 );}K( ){M [J][U]==-1&&E(),M[J][U]!=10?F( m,n):(t=0),M[J][U]=( a+2)%4+1;}D(){a-0||((J>=0&&L() )?(K(),m=J):(a=A()%2 ?3:1)) ,a-2||(( J<22&&L())?(K(),m=J): (a=A( )%2?1: 3)),a -1||( (U< 76&&L ( ))?(K (),n= U):(a =A() %2?0 :2)) ,a- 3||(( U>=0&& L() )?(K (),n= U): (a=A ()%2? 2:0 ));} F(x,y ){M [x] [y] %2?(p =0, q=M [x][ y]/2?1 :-1 ):(q =0,p= M[x] [y] /3?- 1:1),M[x+ q][ y+p]==-1?(M[x+q][y+ p]= 0,b=x +q,c=y+p,M[ x] [y]=-1):F(x+q,y+p); } R(){int x,y;x=A ()%22,y=A()%76,M[x ][y]==0?(M[ x][y ]=10, G(y+1 ,x+2) ,C ("X") ):R() ;}P (){G( c+1,b +2), C(" " ),G(n +1,m+ 2),C( "O"),G(e+1,d+2) ,C("o" ) ;}E(){G(10,10), C("The" "g" "ame is over!"), getch( ), exit(); }main (){R();while(1){ while (bioskey(1) ==0)d=m, e=n,D(),P(),t ==0&& (R(),t = 1),delay ( 4500);k= bioskey(0)>> 8,k -75||(a=3),k-77||(a=1),k-72 ||(a=0) , k-80||(a=2) ;}}这是knocker写的贪食蛇的程序,不但达到了编程的目的,且用一个“蛇”字表达,很有意思。
所以想请教下,写程序的时候应该不可能是自己一个格子一个格子排出来的“蛇”字。那样的话“要伤多少脑细胞啊!”
所以应该可以编写一个可以排列出“蛇”字的函数,然后调用。
我说下我认为的方法:先写出贪食蛇的代码,然后把整个程序的代码都当做字符串,再调用“蛇”排列函数输出,然后把重新排列的程序copy出来就可以了。
那么,我们可不可以编写一个各种“字样”的排列函数呢?函数形参有2个,一个是“字样”,一个是程序代码;
比如“贪食蛇”程序的实参就是“蛇”和“贪食蛇程序代码”。
又比如,我对“字样排列函数”输入“推”字和“推箱子程序代码(字符串)”,最后输出一个类似上述的贪食蛇代码。
how to do?
(ps.需要处理的问题有点多,有兴趣的可以当做练习,大家一起探讨,O(∩_∩)O哈哈~)
#include <stdio.h>
void main()
{
int i;
char a[5][13]={" 0ooo ",
"ooo0 ( )",
"( ) ) / ",
" \\ ( (_/ ",
" \\_) "};
for(i=0;i<5;i++)
puts(a[i]);
getch();
}