DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦a8a90aa69⟧ TextFile

    Length: 10480 (0x28f0)
    Types: TextFile
    Names: »pyramid.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Pyramid/pyramid.c« 

TextFile

#include "pyramid.h"

/* Compilation parameters: */

#define  CELL_WIDTH     48
#define  BORDER 	40
 
 
#define TOTAL_WIDTH     BOARDSIZE*CELL_WIDTH+BORDER*2

/* Constants, typedefs, externals, globals, statics, macros. */

static short icon_image[] = {		       /* Main icon. */
/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
 */
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0001,0xC000,0x0000,0x0000,0x0007,0xF000,0x0000,
	0x03E0,0x0007,0xF000,0x0000,0x07F0,0x000F,0xF800,0x0000,
	0x0E38,0x000F,0xF800,0x0000,0x1C1C,0x000F,0xF800,0x0000,
	0x180C,0x0007,0xF000,0x0000,0x180C,0x0007,0xF000,0x0000,
	0x000C,0x0001,0xC000,0x0000,0x001C,0x0000,0x0000,0x0000,
	0x0038,0x0000,0x0000,0x0000,0x00F0,0x0000,0x0000,0x0000,
	0x01E0,0x01C0,0x01C0,0x0000,0x01C0,0x07F0,0x07F0,0x0000,
	0x01C0,0x07F0,0x07F0,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
	0x01C0,0x0FF8,0x0FF8,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
	0x0000,0x07F0,0x07F0,0x0000,0x0000,0x07F0,0x07F0,0x0000,
	0x01C0,0x01C0,0x01C0,0x0000,0x03E0,0x0000,0x0000,0x0000,
	0x03E0,0x0000,0x0000,0x0000,0x03E0,0x0000,0x0000,0x0000,
	0x01C1,0xC000,0x0001,0xC000,0x0007,0xF000,0x0007,0xF000,
	0x0007,0xF000,0x0007,0xF000,0x000F,0xF800,0x000F,0xF800,
	0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,
	0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,
	0x0001,0xC000,0x0001,0xC000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x01C0,0x0000,0x01C0,0x01C0,0x07F0,0x0000,0x07F0,0x07F0,
	0x07F0,0x0000,0x07F0,0x07F0,0x0FF8,0x0000,0x0FF8,0x0FF8,
	0x0FF8,0x0000,0x0FF8,0x0FF8,0x0FF8,0x0000,0x0FF8,0x0FF8,
	0x07F0,0x0000,0x07F0,0x07F0,0x07F0,0x0000,0x07F0,0x07F0,
	0x01C0,0x0000,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0001,0xC001,0xC001,0xC000,0x0007,0xF007,0xF007,0xF000,
	0x0007,0xF007,0xF007,0xF000,0x000F,0xF80F,0xF80F,0xF800,
	0x000F,0xF80F,0xF80F,0xF800,0x000F,0xF80F,0xF80F,0xF800,
	0x0007,0xF007,0xF007,0xF000,0x0007,0xF007,0xF007,0xF000,
	0x0001,0xC001,0xC001,0xC000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
} ;
DEFINE_ICON_FROM_IMAGE(pyramid_icon,icon_image) ;

static short piece_image[]  = {
/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
 */
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x0000,0x0000,
	0x0000,0x7FFF,0x0000,0x0000,0x0001,0xDDDD,0xC000,0x0000,
	0x0003,0xBBBB,0xB000,0x0000,0x000F,0xFFFF,0xF800,0x0000,
	0x003F,0xFFFF,0xFE00,0x0000,0x005F,0xFDDF,0xFD00,0x0000,
	0x00BF,0xFFBF,0xFF80,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
	0x01F7,0x7777,0x7FC0,0x0000,0x01FF,0xFFFF,0xFFC0,0x0000,
	0x03FF,0xFFFF,0xFFA0,0x0000,0x07FE,0xEFEE,0xEFF0,0x0000,
	0x07F7,0x7FFF,0x7FF0,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
	0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFF,0xEFF8,0x0000,
	0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DFF,0xDDDD,0xFFDC,0x0000,
	0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFF,0xFFFF,0xEFFC,0x0000,
	0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DDF,0xDDDD,0xFDDC,0x0000,
	0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFE,0xFFFF,0xEFFC,0x0000,
	0x1FF7,0xFFFF,0xFFFC,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
	0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFE,0xEFF8,0x0000,
	0x07F7,0x7FFF,0x7FF0,0x0000,0x05FF,0xFDDF,0xFFD0,0x0000,
	0x03FF,0xFFFF,0xFFA0,0x0000,0x03FE,0xEEEE,0xEFE0,0x0000,
	0x01FF,0xFFFF,0xFFC0,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
	0x00BF,0xFFBF,0xFF80,0x0000,0x007F,0xFFFF,0xFF00,0x0000,
	0x003F,0xFFFF,0xFE00,0x0000,0x000D,0xDDDD,0xD800,0x0000,
	0x0003,0xBBBB,0xB000,0x0000,0x0001,0xFFFF,0xC000,0x0000,
	0x0000,0x7FFF,0x0000,0x0000,0x0000,0x0DD8,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
} ;
mpr_static(piece_pr,64,64,1,piece_image) ;

static Frame base_frame ;       /* Assorted globals. */
static Panel panel ;
static Canvas canvas ;

static Panel_item new_game_but, quit_but, undo_but ;
Panel_item panel_mes ;
static Panel_item first_choice, difficulty_choice ;

static Cursor canvas_cursor ;

static Pixwin *canvas_pw ;

char board[8][5][5];
extern short table[32768];

static char line[40] ;

static void canvas_proc() ;       /* Proc definitions. */

static void new_game_proc(), quit_proc(), undo_proc() ;
static void first_proc(), difficulty_proc() ;

static void init_panel() ;
static void canvas_init() ;

#define INIT_DEPTH 7
int depth,tdepth=11,first,tfirst=0,nl,eofg;
int x1,x2,y1,y2;
long seed;

main(argc,argv)
int argc ;
char *argv[] ;

{
  (void) sprintf(line," Pyramid.  V1.0") ;
  base_frame = window_create(NULL,	  FRAME,
			     FRAME_ICON,    &pyramid_icon,
			     FRAME_LABEL,   line,
			     FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
			     WIN_ERROR_MSG, "Can't create window.",
			     FRAME_ARGS,    argc,argv,
			     0) ;

  panel = window_create(base_frame,   PANEL,
			WIN_WIDTH,    TOTAL_WIDTH+1,
			PANEL_LAYOUT, PANEL_HORIZONTAL,
			0) ;

  init_panel() ;
  window_fit_height(panel) ;

  canvas = window_create(base_frame,	     CANVAS,
			 WIN_X,		  0,
			 WIN_BELOW,	      panel,
			 WIN_CONSUME_KBD_EVENT,  WIN_NO_EVENTS,
			 WIN_EVENT_PROC,	 canvas_proc,
			 WIN_HEIGHT,	     TOTAL_WIDTH+1,
			 WIN_WIDTH,	      TOTAL_WIDTH+1,
			 WIN_IGNORE_PICK_EVENTS, KBD_REQUEST, WIN_ASCII_EVENTS, 0,
#ifdef notdef
			 CANVAS_FAST_MONO, TRUE,
#endif
			 0) ;

  window_fit(base_frame) ;
  canvas_pw = (Pixwin *) window_get(canvas,CANVAS_PIXWIN) ;

  canvas_cursor = window_get(canvas,WIN_CURSOR) ;

  time(&seed);
  srandom(seed);
  initboard() ;

  canvas_init() ;
  window_main_loop(base_frame) ;
  exit(0) ;
}


initboard()    /* Initialise the pyramid board. */

{
  int i,j ;

  eofg=0;
  x1=x2=y1=y2= -1;
  FOR_BOARD(i,j) board[0][i][j] = BLACK ;
  depth=tdepth,first=tfirst;nl=0;
  if(first) move();
}


static void init_panel()

{
  new_game_but = panel_create_item(panel,PANEL_BUTTON,
		   PANEL_NOTIFY_PROC,new_game_proc,
		   PANEL_LABEL_IMAGE,
		     panel_button_image(panel,"new game",8,(struct pixfont *) 0),
		   0) ;

  quit_but = panel_create_item(panel,PANEL_BUTTON,
	       PANEL_NOTIFY_PROC,quit_proc,
	       PANEL_LABEL_IMAGE,
		 panel_button_image(panel,"quit",6,(struct pixfont *) 0),
	       0) ;

  undo_but = panel_create_item(panel,PANEL_BUTTON,
		  PANEL_NOTIFY_PROC,undo_proc,
		  PANEL_LABEL_IMAGE,
		    panel_button_image(panel,"undo",6,(struct pixfont *) 0),
		  0) ;

 first_choice  = panel_create_item(panel,PANEL_CYCLE,
			PANEL_NOTIFY_PROC,first_proc,
			PANEL_LABEL_BOLD,TRUE,
			PANEL_LABEL_STRING,"Start: ",
			PANEL_VALUE,0,
			PANEL_SHOW_MENU,TRUE,
			PANEL_CHOICE_STRINGS,"You","Computer",0,
			PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
			0) ;

  difficulty_choice = panel_create_item(panel,PANEL_CYCLE,
			PANEL_NOTIFY_PROC,difficulty_proc,
			PANEL_LABEL_BOLD,TRUE,
			PANEL_LABEL_STRING,"Difficulty: ",
			PANEL_VALUE,2,
			PANEL_SHOW_MENU,TRUE,
			PANEL_CHOICE_STRINGS,"1","2","3","4","5",0,
			PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
			0) ;

  panel_mes = panel_create_item(panel,PANEL_MESSAGE,
		PANEL_LABEL_STRING,"To move, use your left mouse button",
		0) ;
}


/*ARGSUSED*/
static void
quit_proc(item,event)
Panel_item item ;
Event *event ;

{
  window_done(base_frame) ;
}


static void
undo_proc()

{
  if(eofg)return;
  if(nl==0) return;
  nl--;canvas_init();
}

/*ARGSUSED*/
static void
difficulty_proc(item,value,event)
Panel_item item ;
int value ;
Event *event ;

{
  tdepth = value*2 + INIT_DEPTH ;
}

/*ARGSUSED*/
static void
first_proc(item,value,event)
Panel_item item ;
int value ;
Event *event ;

{
  tfirst = value ;
}

static void
canvas_init()

{
  int i,j;

  pw_writebackground(canvas_pw,0,0,TOTAL_WIDTH+1,TOTAL_WIDTH+1,RSRC) ;
  FOR_BOARD(i,j) if(board[nl][i][j]>0)pw_write(canvas_pw,(int) ((j+2-i/2.0)*CELL_WIDTH+BORDER), i*CELL_WIDTH+BORDER,CELL_WIDTH,CELL_WIDTH,RSRC,&piece_pr,0,0);
  FOR_BOARD(i,j) board[nl+1][i][j]=board[nl][i][j];

}

/*ARGSUSED*/
static void
canvas_proc(win,event,arg)
Canvas  win ;
Event *event ;
caddr_t arg ;

{
  int x,y,i ;

  if(eofg)return;
  y=(event_y(event)-BORDER)/CELL_WIDTH;
  x=((event_x(event)-BORDER)/((float) CELL_WIDTH)-2+y/2.0);
  switch (event_id(event))
    {
      case LOC_MOVE       :
      case LOC_DRAG       :
      case LOC_TRAJECTORY :
        if(x1== -1&&y1== -1) break;
        if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
        if(legal(x,y)>0)
          {x2=x;y2=y;pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);}
        else x2=y2= -1;
	break ;

      case LOC_WINENTER   :
      case LOC_WINEXIT    :
      case LOC_RGNENTER   :
      case LOC_RGNEXIT    :
      case WIN_STOP       : 
	break ;

      case MS_LEFT	:
	cursor_set(canvas_cursor,CURSOR_SHOW_CURSOR,TRUE,0) ;
	window_set(canvas,WIN_CURSOR,canvas_cursor,0) ;
	if (event_is_down(event)) { if (legal(x,y)) x1=x;y1=y; }
	else
	  { 
            if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
            if(!legal(x,y)){x1=x2=y1=y2= -1;break;}
            nl++;
            if(x1==x)
            for(i=MIN(y,y1);i<=MAX(y,y1);i++)board[nl][i][x]=0;
            else if(y1==y)
            for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][y][i]=0;
            else 
            for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][MIN(y,y1)+i-MIN(x,x1)][i]=0;
            canvas_init();
            x1=x2=y1=y2= -1;
            sleep(2);
            move();
            canvas_init();
            if(!eofg)panel_msg("It's your turn.") ;
	  }    
	break ;
    }
}

static void
new_game_proc()

{
  initboard() ;
  canvas_init() ;
  panel_msg("It's your turn.") ;
}

legal(x,y)
int x,y;
{  int i,test;
   if(x1== -1 && y1== -1) return(board[nl][y][x]>0);
   test=1;
   if(x1==x)
   for(i=MIN(y,y1);i<=MAX(y,y1);i++)test&=(board[nl][i][x]>0);
   else if(y1==y)
   for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][y][i]>0);
   else if ((x1-x) != (y1-y)) test=0; else
   for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][MIN(y,y1)+i-MIN(x,x1)][i]>0);
   return(test);
}