domingo, 8 de agosto de 2010

Um jogo de Tetris em 1467 caracteres

Olá a todos.

Também como curiosidade deixo-vos hoje um jogo de Tetris bastante primitivo, mas praticável e com apenas 19 linhas de código ou 1467 caracteres (não os contei mas assim afirma o autor).

O autor deste código é John Tromp (em colaboração com Freek Wiedijk) e ganhou o titulo de melhor jogo ( num concurso de código C ofuscado ? se não estou em erro...) em 1989.

O código é o seguinte:



long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}


Copie e cole o código num ficheiro de texto e guarde o ficheiro com o nome tetris.c

Para compilar execute no terminal:

gcc tetris.c -o tetris

Para executar:

./tetris

Teclas:

Esquerda  - j
Girar        - k
Direita      - l
Cair peça  - Barra de espaço
Pausa       - p
Sair          - q

O jogo inclui características como: velocidade de jogo em aumento constante, possibilidade de poder escolher a velocidade a que começa o jogo, as teclas de controle podem ser redefinidas, o ecrã de jogo fica "limpo" enquanto está em pausa, tabelas de pontuações, etc.

Para configurar alguns aspectos como redefinir as teclas, por exemplo, existe documentação na página do autor.

Página do autor: http://homepages.cwi.nl/~tromp/

Os meus cumprimentos.

6 comentários:

  1. Ola a todos......
    pergunto este jogo rodou no teu computador ou a intensão era postar o código e nada mais?

    Quando compilo apresenta varios problemas. Tem algo a me dizer.......

    ResponderEliminar
    Respostas
    1. Olá amigo.

      Certo é que na altura que publiquei isto o jogo funcionava.

      E é que já lá vão 6 anos desde que fiz esta entrada, e o autor do código fez o mesmo em 1989.

      Desde então, muitas coisas mudaram, da mesma maneira que, de certeza que você se puser um jogo de windows 2000 ou windows 98 no actual windows 10 ele não vai funcionar.

      A página do autor mudou, agora pode encontrar o código em: https://tromp.github.io/tetris.html

      E pode encontrar uma versão diferente por exemplo em:
      https://github.com/marklap/tetris

      De qualquer maneira tenha em conta o que lhe disse mais acima.
      Obrigado pelo seu comentário.

      Eliminar
  2. Grato a resposta... você acredita que só após postar quê fui ver a data? Agora entendi porque não funcionou,compilei no Linux e o jogo é para Windos .....

    ResponderEliminar
  3. Grato a resposta... você acredita que só após postar quê fui ver a data? Agora entendi porque não funcionou,compilei no Linux e o jogo é para Windos .....

    ResponderEliminar
  4. arf... compilei no linux também. não funciona. o Texto precisa enfatizar que é para Windows

    ResponderEliminar

É favor manter a boa educação nos comentários. Qualquer comentário ofensivo, racista, desprestigioso, apenas com objectivo de inundar o blogue ou comentários de publicidade não solicitada serão eliminados. Serão aceites comentários em Português, Espanhol e Inglês. Comentarios en Portugues, Español y Ingles seran aceptados. Comments in Portuguese, Spanish and English will be accepted.