home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume3 / pyramid / part04 / pyramid.c next >
C/C++ Source or Header  |  1987-12-19  |  10KB  |  363 lines

  1. #include "pyramid.h"
  2.  
  3. /* Compilation parameters: */
  4.  
  5. #define  CELL_WIDTH     48
  6. #define  BORDER     40
  7.  
  8.  
  9. #define TOTAL_WIDTH     BOARDSIZE*CELL_WIDTH+BORDER*2
  10.  
  11. /* Constants, typedefs, externals, globals, statics, macros. */
  12.  
  13. static short icon_image[] = {               /* Main icon. */
  14. /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  15.  */
  16.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  17.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  18.     0x0000,0x0001,0xC000,0x0000,0x0000,0x0007,0xF000,0x0000,
  19.     0x03E0,0x0007,0xF000,0x0000,0x07F0,0x000F,0xF800,0x0000,
  20.     0x0E38,0x000F,0xF800,0x0000,0x1C1C,0x000F,0xF800,0x0000,
  21.     0x180C,0x0007,0xF000,0x0000,0x180C,0x0007,0xF000,0x0000,
  22.     0x000C,0x0001,0xC000,0x0000,0x001C,0x0000,0x0000,0x0000,
  23.     0x0038,0x0000,0x0000,0x0000,0x00F0,0x0000,0x0000,0x0000,
  24.     0x01E0,0x01C0,0x01C0,0x0000,0x01C0,0x07F0,0x07F0,0x0000,
  25.     0x01C0,0x07F0,0x07F0,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
  26.     0x01C0,0x0FF8,0x0FF8,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
  27.     0x0000,0x07F0,0x07F0,0x0000,0x0000,0x07F0,0x07F0,0x0000,
  28.     0x01C0,0x01C0,0x01C0,0x0000,0x03E0,0x0000,0x0000,0x0000,
  29.     0x03E0,0x0000,0x0000,0x0000,0x03E0,0x0000,0x0000,0x0000,
  30.     0x01C1,0xC000,0x0001,0xC000,0x0007,0xF000,0x0007,0xF000,
  31.     0x0007,0xF000,0x0007,0xF000,0x000F,0xF800,0x000F,0xF800,
  32.     0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,
  33.     0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,
  34.     0x0001,0xC000,0x0001,0xC000,0x0000,0x0000,0x0000,0x0000,
  35.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  36.     0x01C0,0x0000,0x01C0,0x01C0,0x07F0,0x0000,0x07F0,0x07F0,
  37.     0x07F0,0x0000,0x07F0,0x07F0,0x0FF8,0x0000,0x0FF8,0x0FF8,
  38.     0x0FF8,0x0000,0x0FF8,0x0FF8,0x0FF8,0x0000,0x0FF8,0x0FF8,
  39.     0x07F0,0x0000,0x07F0,0x07F0,0x07F0,0x0000,0x07F0,0x07F0,
  40.     0x01C0,0x0000,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,
  41.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  42.     0x0001,0xC001,0xC001,0xC000,0x0007,0xF007,0xF007,0xF000,
  43.     0x0007,0xF007,0xF007,0xF000,0x000F,0xF80F,0xF80F,0xF800,
  44.     0x000F,0xF80F,0xF80F,0xF800,0x000F,0xF80F,0xF80F,0xF800,
  45.     0x0007,0xF007,0xF007,0xF000,0x0007,0xF007,0xF007,0xF000,
  46.     0x0001,0xC001,0xC001,0xC000,0x0000,0x0000,0x0000,0x0000,
  47.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  48. } ;
  49. DEFINE_ICON_FROM_IMAGE(pyramid_icon,icon_image) ;
  50.  
  51. static short piece_image[]  = {
  52. /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  53.  */
  54.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  55.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x0000,0x0000,
  56.     0x0000,0x7FFF,0x0000,0x0000,0x0001,0xDDDD,0xC000,0x0000,
  57.     0x0003,0xBBBB,0xB000,0x0000,0x000F,0xFFFF,0xF800,0x0000,
  58.     0x003F,0xFFFF,0xFE00,0x0000,0x005F,0xFDDF,0xFD00,0x0000,
  59.     0x00BF,0xFFBF,0xFF80,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
  60.     0x01F7,0x7777,0x7FC0,0x0000,0x01FF,0xFFFF,0xFFC0,0x0000,
  61.     0x03FF,0xFFFF,0xFFA0,0x0000,0x07FE,0xEFEE,0xEFF0,0x0000,
  62.     0x07F7,0x7FFF,0x7FF0,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
  63.     0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFF,0xEFF8,0x0000,
  64.     0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DFF,0xDDDD,0xFFDC,0x0000,
  65.     0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFF,0xFFFF,0xEFFC,0x0000,
  66.     0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DDF,0xDDDD,0xFDDC,0x0000,
  67.     0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFE,0xFFFF,0xEFFC,0x0000,
  68.     0x1FF7,0xFFFF,0xFFFC,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
  69.     0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFE,0xEFF8,0x0000,
  70.     0x07F7,0x7FFF,0x7FF0,0x0000,0x05FF,0xFDDF,0xFFD0,0x0000,
  71.     0x03FF,0xFFFF,0xFFA0,0x0000,0x03FE,0xEEEE,0xEFE0,0x0000,
  72.     0x01FF,0xFFFF,0xFFC0,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
  73.     0x00BF,0xFFBF,0xFF80,0x0000,0x007F,0xFFFF,0xFF00,0x0000,
  74.     0x003F,0xFFFF,0xFE00,0x0000,0x000D,0xDDDD,0xD800,0x0000,
  75.     0x0003,0xBBBB,0xB000,0x0000,0x0001,0xFFFF,0xC000,0x0000,
  76.     0x0000,0x7FFF,0x0000,0x0000,0x0000,0x0DD8,0x0000,0x0000,
  77.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  78.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  79.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  80.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  81.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  82.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  83.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  84.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  85.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  86. } ;
  87. mpr_static(piece_pr,64,64,1,piece_image) ;
  88.  
  89. static Frame base_frame ;       /* Assorted globals. */
  90. static Panel panel ;
  91. static Canvas canvas ;
  92.  
  93. static Panel_item new_game_but, quit_but, undo_but ;
  94. Panel_item panel_mes ;
  95. static Panel_item first_choice, difficulty_choice ;
  96.  
  97. static Cursor canvas_cursor ;
  98.  
  99. static Pixwin *canvas_pw ;
  100.  
  101. char board[8][5][5];
  102. extern short table[32768];
  103.  
  104. static char line[40] ;
  105.  
  106. static void canvas_proc() ;       /* Proc definitions. */
  107.  
  108. static void new_game_proc(), quit_proc(), undo_proc() ;
  109. static void first_proc(), difficulty_proc() ;
  110.  
  111. static void init_panel() ;
  112. static void canvas_init() ;
  113.  
  114. #define INIT_DEPTH 7
  115. int depth,tdepth=11,first,tfirst=0,nl,eofg;
  116. int x1,x2,y1,y2;
  117. long seed;
  118.  
  119. main(argc,argv)
  120. int argc ;
  121. char *argv[] ;
  122.  
  123. {
  124.   (void) sprintf(line," Pyramid.  V1.0") ;
  125.   base_frame = window_create(NULL,      FRAME,
  126.                  FRAME_ICON,    &pyramid_icon,
  127.                  FRAME_LABEL,   line,
  128.                  FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
  129.                  WIN_ERROR_MSG, "Can't create window.",
  130.                  FRAME_ARGS,    argc,argv,
  131.                  0) ;
  132.  
  133.   panel = window_create(base_frame,   PANEL,
  134.             WIN_WIDTH,    TOTAL_WIDTH+1,
  135.             PANEL_LAYOUT, PANEL_HORIZONTAL,
  136.             0) ;
  137.  
  138.   init_panel() ;
  139.   window_fit_height(panel) ;
  140.  
  141.   canvas = window_create(base_frame,         CANVAS,
  142.              WIN_X,          0,
  143.              WIN_BELOW,          panel,
  144.              WIN_CONSUME_KBD_EVENT,  WIN_NO_EVENTS,
  145.              WIN_EVENT_PROC,     canvas_proc,
  146.              WIN_HEIGHT,         TOTAL_WIDTH+1,
  147.              WIN_WIDTH,          TOTAL_WIDTH+1,
  148.              WIN_IGNORE_PICK_EVENTS, KBD_REQUEST, WIN_ASCII_EVENTS, 0,
  149. #ifdef 0
  150.              CANVAS_FAST_MONO, TRUE,
  151. #endif
  152.              0) ;
  153.  
  154.   window_fit(base_frame) ;
  155.   canvas_pw = (Pixwin *) window_get(canvas,CANVAS_PIXWIN) ;
  156.  
  157.   canvas_cursor = window_get(canvas,WIN_CURSOR) ;
  158.  
  159.   time(&seed);
  160.   srandom(seed);
  161.   initboard() ;
  162.  
  163.   canvas_init() ;
  164.   window_main_loop(base_frame) ;
  165.   exit(0) ;
  166. }
  167.  
  168.  
  169. initboard()    /* Initialise the pyramid board. */
  170.  
  171. {
  172.   int i,j ;
  173.  
  174.   eofg=0;
  175.   x1=x2=y1=y2= -1;
  176.   FOR_BOARD(i,j) board[0][i][j] = BLACK ;
  177.   depth=tdepth,first=tfirst;nl=0;
  178.   if(first) move();
  179. }
  180.  
  181.  
  182. static void init_panel()
  183.  
  184. {
  185.   new_game_but = panel_create_item(panel,PANEL_BUTTON,
  186.            PANEL_NOTIFY_PROC,new_game_proc,
  187.            PANEL_LABEL_IMAGE,
  188.              panel_button_image(panel,"new game",8,(struct pixfont *) 0),
  189.            0) ;
  190.  
  191.   quit_but = panel_create_item(panel,PANEL_BUTTON,
  192.            PANEL_NOTIFY_PROC,quit_proc,
  193.            PANEL_LABEL_IMAGE,
  194.          panel_button_image(panel,"quit",6,(struct pixfont *) 0),
  195.            0) ;
  196.  
  197.   undo_but = panel_create_item(panel,PANEL_BUTTON,
  198.           PANEL_NOTIFY_PROC,undo_proc,
  199.           PANEL_LABEL_IMAGE,
  200.             panel_button_image(panel,"undo",6,(struct pixfont *) 0),
  201.           0) ;
  202.  
  203.  first_choice  = panel_create_item(panel,PANEL_CYCLE,
  204.             PANEL_NOTIFY_PROC,first_proc,
  205.             PANEL_LABEL_BOLD,TRUE,
  206.             PANEL_LABEL_STRING,"Start: ",
  207.             PANEL_VALUE,0,
  208.             PANEL_SHOW_MENU,TRUE,
  209.             PANEL_CHOICE_STRINGS,"You","Computer",0,
  210.             PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
  211.             0) ;
  212.  
  213.   difficulty_choice = panel_create_item(panel,PANEL_CYCLE,
  214.             PANEL_NOTIFY_PROC,difficulty_proc,
  215.             PANEL_LABEL_BOLD,TRUE,
  216.             PANEL_LABEL_STRING,"Difficulty: ",
  217.             PANEL_VALUE,2,
  218.             PANEL_SHOW_MENU,TRUE,
  219.             PANEL_CHOICE_STRINGS,"1","2","3","4","5",0,
  220.             PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
  221.             0) ;
  222.  
  223.   panel_mes = panel_create_item(panel,PANEL_MESSAGE,
  224.         PANEL_LABEL_STRING,"To move, use your left mouse button",
  225.         0) ;
  226. }
  227.  
  228.  
  229. /*ARGSUSED*/
  230. static void
  231. quit_proc(item,event)
  232. Panel_item item ;
  233. Event *event ;
  234.  
  235. {
  236.   window_done(base_frame) ;
  237. }
  238.  
  239.  
  240. static void
  241. undo_proc()
  242.  
  243. {
  244.   if(eofg)return;
  245.   if(nl==0) return;
  246.   nl--;canvas_init();
  247. }
  248.  
  249. /*ARGSUSED*/
  250. static void
  251. difficulty_proc(item,value,event)
  252. Panel_item item ;
  253. int value ;
  254. Event *event ;
  255.  
  256. {
  257.   tdepth = value*2 + INIT_DEPTH ;
  258. }
  259.  
  260. /*ARGSUSED*/
  261. static void
  262. first_proc(item,value,event)
  263. Panel_item item ;
  264. int value ;
  265. Event *event ;
  266.  
  267. {
  268.   tfirst = value ;
  269. }
  270.  
  271. static void
  272. canvas_init()
  273.  
  274. {
  275.   int i,j;
  276.  
  277.   pw_writebackground(canvas_pw,0,0,TOTAL_WIDTH+1,TOTAL_WIDTH+1,RSRC) ;
  278.   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);
  279.   FOR_BOARD(i,j) board[nl+1][i][j]=board[nl][i][j];
  280.  
  281. }
  282.  
  283. /*ARGSUSED*/
  284. static void
  285. canvas_proc(win,event,arg)
  286. Canvas  win ;
  287. Event *event ;
  288. caddr_t arg ;
  289.  
  290. {
  291.   int x,y,i ;
  292.  
  293.   if(eofg)return;
  294.   y=(event_y(event)-BORDER)/CELL_WIDTH;
  295.   x=((event_x(event)-BORDER)/((float) CELL_WIDTH)-2+y/2.0);
  296.   switch (event_id(event))
  297.     {
  298.       case LOC_MOVE       :
  299.       case LOC_DRAG       :
  300.       case LOC_TRAJECTORY :
  301.         if(x1== -1&&y1== -1) break;
  302.         if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
  303.         if(legal(x,y)>0)
  304.           {x2=x;y2=y;pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);}
  305.         else x2=y2= -1;
  306.     break ;
  307.  
  308.       case LOC_WINENTER   :
  309.       case LOC_WINEXIT    :
  310.       case LOC_RGNENTER   :
  311.       case LOC_RGNEXIT    :
  312.       case WIN_STOP       : 
  313.     break ;
  314.  
  315.       case MS_LEFT    :
  316.     cursor_set(canvas_cursor,CURSOR_SHOW_CURSOR,TRUE,0) ;
  317.     window_set(canvas,WIN_CURSOR,canvas_cursor,0) ;
  318.     if (event_is_down(event)) { if (legal(x,y)) x1=x;y1=y; }
  319.     else
  320.       { 
  321.             if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
  322.             if(!legal(x,y)){x1=x2=y1=y2= -1;break;}
  323.             nl++;
  324.             if(x1==x)
  325.             for(i=MIN(y,y1);i<=MAX(y,y1);i++)board[nl][i][x]=0;
  326.             else if(y1==y)
  327.             for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][y][i]=0;
  328.             else 
  329.             for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][MIN(y,y1)+i-MIN(x,x1)][i]=0;
  330.             canvas_init();
  331.             x1=x2=y1=y2= -1;
  332.             sleep(2);
  333.             move();
  334.             canvas_init();
  335.             if(!eofg)panel_msg("It's your turn.") ;
  336.       }    
  337.     break ;
  338.     }
  339. }
  340.  
  341. static void
  342. new_game_proc()
  343.  
  344. {
  345.   initboard() ;
  346.   canvas_init() ;
  347.   panel_msg("It's your turn.") ;
  348. }
  349.  
  350. legal(x,y)
  351. int x,y;
  352. {  int i,test;
  353.    if(x1== -1 && y1== -1) return(board[nl][y][x]>0);
  354.    test=1;
  355.    if(x1==x)
  356.    for(i=MIN(y,y1);i<=MAX(y,y1);i++)test&=(board[nl][i][x]>0);
  357.    else if(y1==y)
  358.    for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][y][i]>0);
  359.    else if ((x1-x) != (y1-y)) test=0; else
  360.    for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][MIN(y,y1)+i-MIN(x,x1)][i]>0);
  361.    return(test);
  362. }
  363.