Adventure game written in C, somewhat obscure ...

Posted by Nick Gammon on Fri 16 Apr 2004 12:10 AM — 2 posts, 7,207 views.

Australia Forum Administrator #0
Here is an interesting example of coding an adventure game in C. It can be found on the International Obfuscated C Code Contest page at:

http://www.ioccc.org/index.html

The entire source code of the adventure is here:


#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define __ "Y\n : ! ,.?>"
#define D(f) ; } int f(int i) { return
#define E(a,b,c,d,e) b##d,c,e,a
#define e(a,b,c,d) a##b##c##d
#define B *p++ - ' ' || !p++
#define _(k) o(*#k - 64)
#define G(g,l,k,o,e,d,n,c,i,b,a,f,j,m,p) \
a#b#c#d#e#f#g#a#i#j#k#l#m#n#o e,i l##c,m##b; d g j n h(k 30:1); o p f}

			G(E(f ( 9) -s
				? -s + 'q'
				? f( 5 ) -s &&'d' -
			       s?U(  3 ) ||_(J)
				:A ( s- f( 5 ))
				:(c= 4 *
			      4):

	g(0)D(

		V)c <= 3 *4 + 3&&c && V(X ( i) ) ;
	}

	int , time ( 0)& , c - 15 || P

	(1

):0,
	& ( !!d	    ( 0 )
	  ||(a=! _(S)) ,b= 0 )||
	a
		?d(a  = 0)
			? _
(I):			w ( j =!W(j=_ (V ))) ,

				l(_
				    (Y+ s ) )
				  )e

	(
	main(){;
	    ;;;s , ra,
	 n, d), && C ( j +R( s-j+t( i- 1) )
		   )D( W)m[ c* 4| z( j ) ]
	    &&_( X )E (d	   ( 0
		       )&&  R( 6)/ 6
			   ? c= 17|_ ( T )
			   :01,||+
			       , v =i & 3 ^ 2
			       ,+j & 3&&W ( j)||y ( 10 )D (k) --
				   j ? k ( O[j]=R(15 ))
: 1 D
			 ( H )o ( 7+! !  i+3 )+

				  i?

    c=i /4 & 63,
    a= 1

:0)

    D ( f )( p =M ,q ( i),*p+86)
    D ( l) * f, B?

			   B ?B ?B? B ?B ?B
		 ?7 :B?B ?36: 59 * 89 *5 * 2 :B?6587
	     *77 :9 + 2:B ?B?B?9: 5 : 37 : B ? 5 +5:4:20:
			       B?B?B?32

		  :e( 4, 3 , 1 *4 * 59  * 1 , 7):B?
			       17: 34 : 19 :B ?
				      8 *2 :B ?
				      2:26: B?
				       B?B ?B ?

	82 *+ 576: B ?33 :22  :5 * 5:3 *4 :3:B ?B ?B? B ?6 +
	+ 17 : B?B?13:6 : 9 *2:B?15 : 7 *2 :

				 B ?
				 B ?
			    27:24: 31 : B?


		  B? +  29 :,
		  m [a^ 2  ] =T( 8 * 7) ;j= 3
		      ;
		    ;
	      Q, ;int
	       P ( int
		  i )

      {time_t(x )				=+ 0+
	time(0) ;                       j=E( u (i  ) : i D(R )e(r ,
      a ,n ,d) ()% i+1,                 ( e( l  , o,
      caltim , e ) (& x))     ->e(          tm_h , o, u  , r)
	;retur ,				i?_( W
):	_( U) D(Y)			  *p&&  *p<3 * 11 ?
	  ( ++ p ),				  n j= + 34  +( j< 6
							||j>19 ),Y (i)
: *p

    D ( F)	i == 9  ?1 :
	F(	(i+ 7)% ( 7 +  3) ) +!O[ i
   ]D(u)	*p &&* p -32? p ++)
    D (h  )	i ?*++*S=i%  ( 38)- 1,
    D ( A )!    n?i&&!g ( (0  ) ) ||K (  j=4| ! !i ) :  N(!i )D(
                Q)++j<

	       (s )  &&Q ( t( i)^i )
    D( U	)i>= 0 ?U( i- 1 )||~f (i+1 ) == ~  s
				      &&H (m[c* 4 |z(i)] )
:0;D


		( X) + b && b<, for (*S = M  ; *
p; ),

		gets ( L, + 98 , stdin ) ?
		   p= L, E (r( 0 ): 0 ,h( i /  38 ) : 0;D( C)!
		   ( m[j]+m [a= i] ) ?m[j[m]= i]=j:0;D (d) !
			  b+(*  O-
			   c)*
			     *  O; D (z )


					      -~- ~ -~i +
	v
		& 3 D(y)( putchar ) ( i)
    D ( q )	i& ,!(O[j = i]
		 || _ ( O))+a :0;
    D (w)O[	j] ==c && o

	(( !i ++ ? ! !_ (M

):

	0) +15)|| ++ j<9 &&w (
i)D	( r )*p?			*p -4?
					* p -6 ?
				     y(*p <9 + 2?__[
					    * p
]:			 * p+ 7 +79):o( j+1) : o (26+j),&q ( -!
		  * p ++ + i )D(x)i? a=x ( ( -- i)), ++ p )
	    D( t ) i,   | C((j=i*
       T(i-4 ))  +R
    (3 ) + 4 )
   D(J) !j                                --E( 0 D  ( K )!-!N, || i &,
                                                _( R ) :i* c== (O
   [ j ] )				&&n==f (j+   6  +    5   * 4)?O
    [j]=			   !i *    c-_   (    L)    :J(i )
    D ( N )			j=9, & d(0 )? j= 6 | ! i , J(i )D 
			( o)(*S = p , ++ S,p = M , r (q (i) ),-- S,  p = *S))
		    ( (l (_ (Q )),n =s,i ^5 ) ) ;, E(j ,
		sign ,  v ,ed ( b ) ;;
	      int   c =1 ,O[9])
            ;int(  s
)=
	 E (n ;char, 1 ,a,6 ,o ())*  Z[
	E(M [37 * 9 *3 ] ,0,L [ 99] ,3] , * *S=Z ) ;
	 E (*p=+1 ,char( m)[6 , co , 4 ],ol)
				  +,
	   V ( v=*O = k( j= 9 )) ;
	return ! c&& - ~ ~ - -! printf
	 ( ( "%d \n") , F (P ( 0) +6)            *50 + !  ! b*
	  ( +b - (int)time ( 0 )) )
;, (         b= 60 + time ( 0)+ 60 * 4)              ;, n =Y
              (u (s =Y (i) ) )

	:  (exit(                                      0)
	,i)D( g )x (  _(N) ^ 9)? !( a =0) : _  ( P )D (T)!  i|,
	(2); s=35; Q(3);

	s=59; Q(6);


	a=1;




    )



You are probably better off downloading it from the IOCC site, as formatting is, apparently, important.

The file is called jason.c, and can be compiled like this:


gcc jason.c -o jason


Then you execute it, and see the results ...


$ ./jason

you are in a maze of twisty little passages
caves lead:  left forward
you see
   a lamp
   a harp
> get lamp
done
> get harp
done
> f
you climb...
you are in a maze of twisty little passages
caves lead:  forward right back
> i
you have
   a lamp
   a harp
> f
you climb...
you are in a maze of twisty little passages
caves lead:  left forward right back
you see
   a chime
> get chime
done
> i
you have
   a lamp
   a harp
   a chime
> l
you climb...
you are in a maze of twisty little passages
caves lead:  left forward right back
you see
   a talisman
   a zither
> get talisman
done
> get zither
done
> i
you have
   a lamp
   a harp
   a chime
   a talisman
   a zither
> l
you climb...
you are in a maze of twisty little passages
caves lead:  left forward right back
> f
you climb...
you are in a maze of twisty little passages
caves lead:  left forward right back
>



However if you look at the source you will see none of the above messages. That is the interesting bit.

This particular entry is the "Jason" entry for the 2001 competition.

It was judged:


Best Of Show:

    Jason Orendorff
    5 Buchanan St.
    Nashua, NH 03060
    USA

    http://www.jorendorff.com/




Copyright © Landon Curt Noll, Simon Cooper, Peter Seebach and Leonid A. Broukhis, 2004.
All Rights Reserved.
Permission for personal, education or non-profit use is granted provided this copyright and notice are included in its entirety and remains unaltered. All other uses must receive prior permission in writing from the contest judges. (http://www.au.ioccc.org/judges.html)


Amended on Fri 16 Apr 2004 12:18 AM by Nick Gammon
Australia Forum Administrator #1
Update - I copied the source from the above message, pasted into vi under Cygwin, and compiled, and it worked OK. So, you can probably compile directly from the source above.