home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume13 / engarde / part01 / board.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  5KB  |  210 lines

  1. /*********************************************************************
  2.                                 Engarde
  3.                              File: board.c
  4.  
  5.   This file contains the routines for the data of the board, magnet
  6.   comparisons, and movement legality.
  7.  
  8.   Version 1:  1/9/92  (Bill James)
  9. *********************************************************************/
  10. #include <malloc.h>
  11. #include <stdio.h>
  12. #include <sys/types.h>
  13. #include <time.h>
  14. #include "board.h"
  15.  
  16. extern int H,W;
  17. char *SIGNSTRING[] = {"-","*","+"};
  18. BoardType *b;
  19.  
  20. /* 
  21.    Flips piece from black to white or vice versa 
  22. */
  23. void FlipPiece(p)
  24. PieceType *p;
  25. {
  26.    p->color = (p->color == PIECE_BLACK)? PIECE_WHITE:PIECE_BLACK;
  27. }
  28.  
  29.  
  30. /* 
  31.    Mallocs and initializes board entity items
  32. */
  33. void InitBoard(s, h, w) 
  34. SideType *s;
  35. int h,w;
  36. {
  37.     int i,j;
  38.     PieceType *pc;
  39.        b = (BoardType *) malloc (sizeof (BoardType));
  40.        b->magnets = (char **) malloc (sizeof(char*) * h);
  41.        b->pieces = (PieceType ***) malloc (sizeof(PieceType**) * h);
  42.        for (i = 0; i < h; i++) {
  43.           b->magnets[i] = (char *) malloc (w);
  44.           b->pieces[i] = (PieceType **) malloc (w * sizeof(PieceType*));
  45.           for (j = 0; j < w; j++) {
  46.               b->magnets[i][j] = 0;
  47.               b->pieces[i][j] = NULL;
  48.           }
  49.        }
  50.        for (i = 0; i < NPIECES; i++) {
  51.           pc = (PieceType *) malloc (sizeof(PieceType));
  52.           s[PIECE_ROUND].p[i] = pc;
  53.           s[PIECE_ROUND].p[i]->type = PIECE_ROUND;
  54.           s[PIECE_ROUND].p[i]->color = PIECE_ROUND;
  55.           pc = (PieceType *) malloc (sizeof(PieceType));
  56.           s[PIECE_SQUARE].p[i] = pc;
  57.           s[PIECE_SQUARE].p[i]->type = PIECE_SQUARE;
  58.           s[PIECE_SQUARE].p[i]->color = PIECE_SQUARE;
  59.        }
  60.        b->height = h;
  61.        b->width = w;
  62. }
  63.  
  64.  
  65. /*
  66.    Deletes board memory items
  67. */
  68. void KillBoard(s) 
  69. SideType s[2];
  70. {
  71.     int i,j;
  72.     for (i = 0 ; i < b->height; i++) {
  73.        if (s[0].p[i]) free(s[0].p[i]);
  74.        if (s[1].p[i]) free(s[1].p[i]);
  75.        for (j = 0; j < b->width; j++) {
  76.           if (b->pieces[i][j]) free(b->pieces[i][j]);
  77.        }
  78.        free((char *) b->magnets[i]);
  79.     }
  80.     free((char *) b->magnets);
  81.     free((char *) b->pieces);
  82. }
  83.  
  84.  
  85. #define GetPiece(b,h,w) (b)->pieces[(h)][(w)]
  86. #define GetPolarity(b,h,w) (b)->magnets[(h)][(w)]
  87. #define CKHW(b,h1,w1) (((h1) < (b)->height) && ((w1) < (b)->width))
  88.  
  89. /*
  90.    Move piece from h1,w1 to h2,w2
  91. */
  92. int MovePiece(h1, w1, h2, w2) 
  93. int h1,h2,w1,w2;
  94. {
  95.     if (!(CKHW(b,h1,w1))) return(1);
  96.     if (!(CKHW(b,h2,w2))) return(1);
  97.     if (b->pieces[h1][w1]) {
  98.        if (b->pieces[h2][w2]) return(1);
  99.        b->pieces[h2][w2] = b->pieces[h1][w1];
  100.        Magnetize(h2,w2);
  101.        b->pieces[h1][w1] = NULL;
  102.        return(0);
  103.     }
  104.     else return (1);
  105. }
  106.  
  107.  
  108. /*
  109.     Randomly shuffles board magnets
  110. */
  111. void BoardShuffle() 
  112. {
  113.     int i,j;
  114.     char k;
  115.     for ( i = 0; i < b->height; i++) 
  116.        for (j = 0; j < b->width; j++) {
  117.            k = (char) (random() % 2);
  118.            if (k) b->magnets[i][j] = 1;
  119.            else b->magnets[i][j] = -1;
  120.            k = (char) (random() % 10);
  121.            if (!k) b->magnets[i][j] = 0;
  122.            Magnetize(i,j);
  123.        }
  124. }
  125.  
  126.  
  127.  
  128. /*
  129.    Sets piece color to correct color for it's shape/position
  130. */
  131. void Magnetize(h, w) 
  132. int h,w;
  133. {
  134.    PieceType *p;
  135.    p = b->pieces[h][w];
  136.    if (!(b->magnets[h][w])) return;
  137.    if (p) {
  138.       if ((p->type == PIECE_ROUND) && (b->magnets[h][w] == POSITIVE))
  139.           p->color = PIECE_BLACK;
  140.       if ((p->type == PIECE_ROUND) && (b->magnets[h][w] == NEGATIVE))
  141.           p->color = PIECE_WHITE;
  142.       if ((p->type == PIECE_SQUARE) && (b->magnets[h][w] == POSITIVE))
  143.           p->color = PIECE_WHITE;
  144.       if ((p->type == PIECE_SQUARE) && (b->magnets[h][w] == NEGATIVE))
  145.           p->color = PIECE_BLACK;
  146.    }
  147. }
  148.  
  149.  
  150.  
  151. /*
  152.    Sums the colors of the set of four pieces (i,j),(i+dx,j+dy),
  153.    (i+2dx,j+2dy),(i+3dx,j+3dy), or returns -1 if any of the 
  154.    spaces have no piece.
  155. */
  156. int SumSet(i,j,dx,dy) 
  157. int i,j,dx,dy;
  158. {
  159. int s,l,m,r;
  160.   s = 0;
  161.   for (r = 0, l = i, m = j; ((r < 4) && (l < W) && (l >= 0)) &&
  162.                             ((m < H) && (m >= 0)); r++, l+=dx, m+=dy) {
  163.      if (!b->pieces[l][m]) return(-1);
  164.      s += b->pieces[l][m]->color;
  165.   }
  166.   if (((l >= W) || (l < 0) || (m >= H) || (m < 0)) && (r < 4)) return(-1);
  167.   return(s);
  168. }
  169.  
  170.  
  171. /*
  172.    Checks the board to find any set of 4 spaces in a row,column,diag
  173.    that are the same color.
  174. */
  175. int CheckWinner(i, j, dx, dy)
  176. int *i,*j,*dx,*dy;
  177. {
  178. int c,d,x,y,g;
  179. for (c = 0; c < W; c++) 
  180.    for (d = 0; d < H; d++) 
  181.       for (x = -1; x < 2; x++) {
  182.          for (y = -1; y < 2; y++) {
  183.             if ((!x) && (!y)) continue;
  184.             g = SumSet(c,d,x,y);
  185.             if (g == (4 * PIECE_BLACK)) {
  186.                 *dx = x; *dy = y; 
  187.                 *i = c; *j = d;
  188.         return(1);
  189.             }
  190.             if (g == (4 * PIECE_WHITE)) {
  191.                 *dx = x; *dy = y; 
  192.                 *i = c; *j = d;
  193.         return(1);
  194.             }
  195.          }
  196.       }
  197. return(0);
  198. }
  199.  
  200.  
  201. void Randomize()
  202. {
  203. time_t g;
  204. int *h;
  205.  
  206.   g = time();
  207.   h = (int *) &g;
  208.   srandom(*h);
  209. }
  210.