[LONG] Checkers mini game (part 1)

From: Shane P. Lee (tacodog21@yahoo.com)
Date: 03/31/01


Okay, I'm gonna break down and go to the list with this problem.
I sure hope some of you can help me with this.
I am basing a mini game of checkers on PJD's chess patch and have
run into a few small problems.
I'm going to paste some of the code in here, so those of you that
aren't interested/inclined to read it may delete this message now.

Here's my current structs:
/* Move type struct */
struct move_p_type {
  int row1;
  int row2;
  int row3;
  int col1;
  int col2;
  int col3;
};

/* Board data struct */
struct c_obj_data {
  struct c_obj_data *next;

  int player;
  int my_board_num;
  long board[N_ROWS][N_COLS];
  int win; /* game over? */
  long player1; /* red PC */
  long player2; /* black PC */
};


And here are my current defines:
/* Number of rows and collumns */
#define N_ROWS        8
#define N_COLS        8

/* Piece values */
#define CLOSED (1 << 0)
#define L_RED (1 << 1)
#define L_BLK (1 << 2)
#define K_RED (1 << 3)
#define K_BLK (1 << 4)
#define OPEN (1 << 5)

/* Define player-color values */
#define PC_RED (1 << 5)
#define PC_BLACK (1 << 6)

/* Ermm, okay.... */
#define MYPIECE           (board->board[move->row1][move->col1])
#define MYTARGET          (board->board[move->row2][move->col2])

And here is the function I am having problems with:
#define N_W              1
#define N_E              2
#define S_W              3
#define S_E              4

/* Okies, kings path first */
int diagonal_kpath(struct move_p_type *move, struct c_obj_data *board)
{
  int temp1,temp2;
  int dir;

  /* check if it's actually diagonal */
  if(abs(move->row1 - move->row2) != abs(move->col1 - move->col2)) {
    return TRUE;
  }

  if(move->row1 < move->row2) {         /* sudlich */
    if(move->col1 > move->col2) {
      dir=S_W;
    } else {
      dir=S_E;
    }
  } else {      /* nordlich */
    if(move->col1 > move->col2) {
      dir=N_W;
    } else {
      dir=N_E;
    }
  }

        /* okay, we know direction so we know which way to iterate */
  temp1=move->row1;
  temp2=move->col1;

        /* wish there was a nice way to do this, but this works..
                iterate it to the next space.. then follow the loop-
        return true if current space is the end point.
        else, return false if current space is occupied,
        else, iterate to next space and continue.       */

    if(dir == S_W) {
      temp1++;
      temp2--;
    } else if(dir == S_E) {
      temp1++;
      temp2++;
    } else if(dir == N_W) {
      temp1--;
      temp2--;
    } else {
      temp1--;
      temp2++;
    }
  while(temp1 != move->row2 && temp2 != move->col2) {
    if(board->board[temp1][temp2] != OPEN) {
      return FALSE;
    }
    if(dir == S_W) {
      temp1++;
      temp2--;
    } else if(dir == S_E) {
      temp1++;
      temp2++;
    } else if(dir == N_W) {
      temp1--;
      temp2--;
    } else {
      temp1--;
      temp2++;
    }
  }
  if(temp1 == move->row2 && temp2 == move->col2) {
    return FALSE;
  }
  return TRUE;
}


-This message is continued in part 2-

__________________________________________________
Do You Yahoo!?
Get email at your own domain with Yahoo! Mail.
http://personal.mail.yahoo.com/?.refer=text

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/04/01 PST