Hogy-Bear icon

movlib.c

Hogy-Bear | PRO | 04/09/18 01:20:20 PM UTC | 0 ⭐ | 180 👁️ | Never ⏰ | []
C |

7.16 KB

|

None

|

0 👍

/

0 👎

#include <stdlib.h>
#include <stdio.h>
 
#include "disksAndPlayers.h"
#include "movelib.h"
 
void flipDisks(int to_flip, disk cur_disk, disk board[SIZE][SIZE], int *cur_score, int *opp_score){
  int i, j, x, y;
  disk temp;
  disk arr[SIZE];
  //run rows
  for (i = 0; i < 8; i++) {
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, board[i], 8, cur_score, opp_score);
    }else{
      flipDisksBlack(cur_disk, board, board[i], 8, cur_score, opp_score);
    }
  }
 
  // run columns
  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      arr[j] = board[j][i];
    }
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, arr, 8, cur_score, opp_score);
    } else {
      flipDisksBlack(cur_disk, board, arr, 8, cur_score, opp_score);
    }
  }
 
  //run diagonals
  int num_in_arr;
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = 0, y = i;
    temp = board[x][y];
    while (y < 8){
      arr[num_in_arr] = temp;
      x++;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }else{
      flipDisksBlack(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }
  }
 
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = i, y = 0;
    temp = board[x][y];
    while (x < 8){
      arr[num_in_arr] = temp;
      x++;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }else{
      flipDisksBlack(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }
  }
 
  for (i = 2; i < 7; i++) {
    num_in_arr = 0;
    x = i, y = 0;
    temp = board[x][y];
    while (x >= 0){
      arr[num_in_arr] = temp;
      x--;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }else{
      flipDisksBlack(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }
  }
 
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = i, y = 7;
    temp = board[x][y];
    while (x < 8){
      arr[num_in_arr] = temp;
      x++;
      y--;
      num_in_arr++;
      temp = board[x][y];
    }
    if (to_flip == 0) {
      flipDisksWhite(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }else{
      flipDisksBlack(cur_disk, board, arr, num_in_arr, cur_score, opp_score);
    }
  }
 
  y = 0;
  for (i = 0; i < 8; i++){
    x = i;
    arr[i] = board[x][y];
    y++;
  }
  if (to_flip == 0) {
    flipDisksWhite(cur_disk, board, arr, 8, cur_score, opp_score);
  }else{
    flipDisksBlack(cur_disk, board, arr, 8, cur_score, opp_score);
  }
 
  y = 7;
  for (i = 0; i < 8; i++){
    x = i;
    arr[i] = board[y][i];
    y--;
  }
  if (to_flip == 0) {
    flipDisksWhite(cur_disk, board, arr, 8, cur_score, opp_score);
  }else{
    flipDisksBlack(cur_disk, board, arr, 8, cur_score, opp_score);
  }
 
}
 
int findAllPos(disk board [SIZE][SIZE], player cur, position *pos_arr) {
  int moves_found = 0;
  int i, j, x, y;
  disk temp;
  disk arr[SIZE];
  //run rows
  for (i = 0; i < 8; i++) {
    moves_found += searchPositions(board[i], 8, cur, pos_arr, moves_found);
  }
 
  // run columns
  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      arr[j] = board[j][i];
    }
    moves_found += searchPositions(arr, 8, cur, pos_arr, moves_found);
  }
 
  //run diagonals
  int num_in_arr;
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = 0, y = i;
    temp = board[x][y];
    while (y < 8){
      arr[num_in_arr] = temp;
      x++;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    moves_found += searchPositions(arr, num_in_arr, cur, pos_arr, moves_found);
  }
 
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = i, y = 0;
    temp = board[x][y];
    while (x < 8){
      arr[num_in_arr] = temp;
      x++;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    moves_found += searchPositions(arr, num_in_arr, cur, pos_arr, moves_found);
  }
 
  for (i = 2; i < 7; i++) {
    num_in_arr = 0;
    x = i, y = 0;
    temp = board[x][y];
    while (x >= 0){
      arr[num_in_arr] = temp;
      x--;
      y++;
      num_in_arr++;
      temp = board[x][y];
    }
    moves_found += searchPositions(arr, num_in_arr, cur, pos_arr, moves_found);
  }
 
  for (i = 1; i < 6; i++) {
    num_in_arr = 0;
    x = i, y = 7;
    temp = board[x][y];
    while (x < 8){
      arr[num_in_arr] = temp;
      x++;
      y--;
      num_in_arr++;
      temp = board[x][y];
    }
    moves_found += searchPositions(arr, num_in_arr, cur, pos_arr, moves_found);
  }
 
  y = 0;
  for (i = 0; i < 8; i++){
    x = i;
    arr[i] = board[x][y];
    y++;
  }
  moves_found += searchPositions(arr, 8, cur, pos_arr, moves_found);
 
  y = 7;
  for (i = 0; i < 8; i++){
    x = i;
    arr[i] = board[y][i];
    y--;
  }
  moves_found += searchPositions(arr, 8, cur, pos_arr, moves_found);
 
 
  return moves_found;
}
 
int searchPositions(disk arr[], int disk_arr_len, player check, position *pos_arr, int pos_arr_len) {
  unsigned int i;
  int moves_found = 0;
  for (i = 0; i < disk_arr_len; i++) {
    if (arr[i].type == check.type) {
      moves_found += searchLeft(arr, i, check, pos_arr, pos_arr_len);
      moves_found += searchRight(arr, disk_arr_len, i, check, pos_arr, pos_arr_len+moves_found);
    }
  }
  return moves_found;
}
 
int searchLeft(disk arr[], int cur, player check, position *pos_arr, int pos_arr_len) {
  disk temp1, temp2;
  int i, moves_found = 0, cur_amt_mvs = pos_arr_len;
  //loop through array going down or 'left'
  for (i = cur; i > 0; i--) {
    temp1 = arr[i - 1];
    temp2 = arr[i];
 
 
    //check if directly next is the same
    if (temp1.type == check.type) {
      break;
    }
 
    //check if the current is blank and the last one was white
    if (temp1.type == NONE) {
      if (temp2.type != NONE && temp2.type != check.type) {
        if (addToValidPos(pos_arr, temp1.pos ,cur_amt_mvs) == 1) {
          moves_found++;
          cur_amt_mvs++;
        }
      }
    }
 
  }
  return moves_found;
}
 
int searchRight(disk arr[], int disk_arr_len, int cur, player check, position *pos_arr, int pos_arr_len) {
  disk temp1, temp2;
  int i, moves_found = 0, cur_amt_mvs = pos_arr_len;
 
  for (i = cur; i < disk_arr_len-1; i++) {
    temp1 = arr[i + 1];
    temp2 = arr[i];
 
    if (temp1.type == check.type) {
      break;
    }
 
    if (temp1.type == NONE) {
      if (temp2.type != NONE && temp2.type != check.type){
        if (addToValidPos(pos_arr, temp1.pos ,cur_amt_mvs) == 1) {
          moves_found++;
          cur_amt_mvs++;
        }
      }
 
    }
 
  }
  return moves_found;
}
 
int addToValidPos(position *arr, position put_in, int len){
  int i, isIn = 0;
  for (i = 0; i < len; i++) {
    if (arr[i].row == put_in.row && arr[i].col == put_in.col) {
      isIn++;
    }
  }
  if (isIn == 0) {
    arr = (position *) realloc(arr, len+1);
    arr[len] = put_in;
    return 1;
  }
  return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎