src/init.c
Functions
Name | |
---|---|
cell_t * | create_cell(int id)creates a cell of the board |
board_t * | create_clean_board()creates an empty board |
board_t * | start_config(board_t * b)puts balls on the board into a start configuration |
board_t * | start_config_2(board_t * b)puts balls on the board into another start configuration |
cell_t ** | create_table(board_t b)creates an array with all the cells of the board |
Functions Documentation
function create_cell
cell_t * create_cell(
int id
)
creates a cell of the board
function create_clean_board
board_t * create_clean_board()
creates an empty board
function start_config
board_t * start_config(
board_t * b
)
puts balls on the board into a start configuration
function start_config_2
board_t * start_config_2(
board_t * b
)
puts balls on the board into another start configuration
function create_table
cell_t ** create_table(
board_t b
)
creates an array with all the cells of the board
Source code
/* name : init.c
* authors : eloi petit, matheo thomas, domitille vale
* date : 18-06-24
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "init.h"
cell_t *create_cell(int id) {
cell_t *c = malloc(sizeof(cell_t));
c->state = EMPTY;
c->id=id;
c->selection=UNSELECT;
for (int i = 0; i < 6; i++) {
c->neighbor[i] = NULL;
}
return c;
}
board_t* create_clean_board() {
// initialisation of the board
board_t*ptb=(board_t*)malloc(sizeof(board_t));
cell_t *first_cell = create_cell(0);
ptb->cell = first_cell;
ptb->n_black = 0;
ptb->n_white = 0;
cell_t *cur_cell = ptb->cell;
int j = 0;
int c = 0;
int i=0;
// initialisation of the first cell, the one in the center.
int id = 0;
cur_cell->state = EMPTY;
for (i = 0; i < 6; i++) {
id++;
cur_cell->neighbor[i] = create_cell(id);
cur_cell->neighbor[i]->neighbor[(i + 3) % 6] = cur_cell;
}
// creation of other cells
for (i = 0; i < 6; i++) {
c = 0;
j = 0;
cur_cell = ptb->cell->neighbor[i];
while (c < 3) {
for (int n = 0; n < 6; n++) {
if (n != 3 && ((c != 0) || (c == 0 && n != 4))) {
if (n == 2) {
cur_cell->neighbor[(i + n) % 6] =
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 1) % 6];
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
} else if (n == 4 && i == 0) {
cur_cell->neighbor[(i + n) % 6] =
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 5) % 6];
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
} else {
if (n == 5 && i != 0) {
cur_cell->neighbor[(i + n) % 6] =
cur_cell->neighbor[(i + n + 5) % 6]->neighbor[i];
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
} else if (n == 4 && i != 0) {
cur_cell->neighbor[(i + n) % 6] =
cur_cell->neighbor[(i + n + 5) % 6]
->neighbor[(i + 5) % 6];
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
} else {
if (i == 5 && n == 1 && c == 0) {
cur_cell->neighbor[(i + n) % 6] =
ptb->cell->neighbor[0]->neighbor[5];
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
} else {
id++;
cur_cell->neighbor[(i + n) % 6] = create_cell(id);
cur_cell->neighbor[(i + n) % 6]->neighbor[(i + n + 3) % 6] =
cur_cell;
}
}
}
}
}
cur_cell = cur_cell->neighbor[i];
c += 1;
}
c = 0;
j = 2;
cur_cell->neighbor[i] = NULL;
cur_cell->neighbor[(i + 1) % 6] = NULL;
cur_cell->neighbor[(i + 5) % 6] = NULL;
cur_cell->neighbor[(i + 2) % 6] =
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 1) % 6];
cur_cell->neighbor[(i + 2) % 6]->neighbor[(i + 2 + 3) % 6] = cur_cell;
cur_cell->neighbor[(i + 4) % 6] =
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 5) % 6];
cur_cell->neighbor[(i + 4) % 6]->neighbor[(i + 4 + 3) % 6] = cur_cell;
while (c < 2) {
cur_cell = cur_cell->neighbor[(i + j) % 6];
cur_cell->neighbor[i] = NULL;
cur_cell->neighbor[(i + 1) % 6] = NULL;
if (c == 1 && i == 5) {
cur_cell->neighbor[(i + 2) % 6] =
ptb->cell->neighbor[0]->neighbor[0]->neighbor[0]->neighbor[5];
cur_cell->neighbor[(i + 2) % 6]->neighbor[(i + 2 + 3) % 6] =
cur_cell;
cur_cell->neighbor[(i + 3) % 6] =
ptb->cell->neighbor[0]->neighbor[0]->neighbor[5];
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 3 + 3) % 6] =
cur_cell;
cur_cell->neighbor[(i + 4) % 6] =
cur_cell->neighbor[(i + 5) % 6]->neighbor[(i + 3) % 6];
cur_cell->neighbor[(i + 4) % 6]->neighbor[(i + 4 + 3) % 6] =
cur_cell;
} else {
id ++;
cur_cell->neighbor[(i + 2) % 6] = create_cell(id);
cur_cell->neighbor[(i + 2) % 6]->neighbor[(i + 2 + 3) % 6] =
cur_cell;
if (c == 0) {
cur_cell->neighbor[(i + 3) % 6] =
cur_cell->neighbor[(i + 4) % 6]->neighbor[(i + 2) % 6];
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 3 + 3) % 6] =
cur_cell;
} else {
id++;
cur_cell->neighbor[(i + 3) % 6] = create_cell(id);
cur_cell->neighbor[(i + 3) % 6]->neighbor[(i + 3 + 3) % 6] =
cur_cell;
cur_cell->neighbor[(i + 4) % 6] =
cur_cell->neighbor[(i + 5) % 6]->neighbor[(i + 3) % 6];
cur_cell->neighbor[(i + 4) % 6]->neighbor[(i + 4 + 3) % 6] =
cur_cell;
}
}
c += 1;
}
c = 0;
j = 3;
cur_cell = cur_cell->neighbor[(i + j) % 6];
cur_cell->neighbor[(i + 1) % 6] =
cur_cell->neighbor[i]->neighbor[(i + 2) % 6];
cur_cell->neighbor[(i + 1) % 6]->neighbor[(i + 1 + 3) % 6] = cur_cell;
cur_cell->neighbor[(i + 5) % 6] =
cur_cell->neighbor[i]->neighbor[(i + 4) % 6];
cur_cell->neighbor[(i + 5) % 6]->neighbor[(i + 5 + 3) % 6] = cur_cell;
cur_cell->neighbor[(i + 4) % 6] = cur_cell->neighbor[(i + 5) % 6]
->neighbor[(i + 4) % 6]
->neighbor[(i + 2) % 6];
cur_cell->neighbor[(i + 4) % 6]->neighbor[(i + 4 + 3) % 6] = cur_cell;
j = 4;
cur_cell = cur_cell->neighbor[(i + j) % 6];
cur_cell->neighbor[i] =
cur_cell->neighbor[(i + 1) % 6]->neighbor[(i + 5) % 6];
cur_cell->neighbor[i]->neighbor[(i + 3) % 6] = cur_cell;
}
return ptb;
}
board_t* start_config(board_t* b) {
cell_t *cur_cell;
state_e colour = WHITE;
b->n_black = 14;
b->n_white = 14;
for (int n = 0; n < 4; n += 3) {
cur_cell = b->cell->neighbor[n]->neighbor[n]->neighbor[n]->neighbor[n];
for (int i = 0; i < 4; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 2) % 6];
}
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 3) % 6];
for (int i = 0; i < 5; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 5) % 6];
}
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 3) % 6]->neighbor[(n + 2) % 6];
for (int i = 0; i < 3; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 2) % 6];
}
colour = BLACK;
}
return b;
}
board_t* start_config_2(board_t* b) {
cell_t *cur_cell;
state_e colour = WHITE;
int i=0;
b->n_black = 14;
b->n_white = 14;
for (int n = 0; n < 4; n += 3) {
cur_cell = b->cell->neighbor[n]->neighbor[n]->neighbor[n]->neighbor[n];
for (i = 0; i < 4; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 2) % 6];
}
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 4) % 6];
for (i = 0; i < 3; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 5) % 6];
}
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 3) % 6];
for (i = 0; i < 2; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 2) % 6];
}
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 4) % 6];
for (i = 0; i < 2; i++) {
cur_cell->state = colour;
cur_cell = cur_cell->neighbor[(n + 5) % 6];
}
colour = BLACK;
}
return b;
}
cell_t ** create_table(board_t b) {
cell_t **table=(cell_t**)malloc(61 * sizeof(cell_t*));
cell_t* cur_cell;
int i=0;
cur_cell = b.cell->neighbor[0]->neighbor[0]->neighbor[0]->neighbor[0];
for (i = 0; i < 5; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[0]->neighbor[0]->neighbor[0]->neighbor[5];
for (i = 5; i < 11; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[0]->neighbor[0]->neighbor[5]->neighbor[5];
for (i = 11; i < 18; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[0]->neighbor[5]->neighbor[5]->neighbor[5];
for (i = 18; i < 26; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[5]->neighbor[5]->neighbor[5]->neighbor[5];
for (i = 26; i < 35; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[4]->neighbor[5]->neighbor[5]->neighbor[5];
for (i = 35; i < 43; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[4]->neighbor[4]->neighbor[5]->neighbor[5];
for (i = 43; i < 50; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[4]->neighbor[4]->neighbor[4]->neighbor[5];
for (i = 50; i < 56; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
cur_cell = b.cell->neighbor[4]->neighbor[4]->neighbor[4]->neighbor[4];
for (i = 56; i < 61; i++) {
table[i] = cur_cell;
cur_cell = cur_cell->neighbor[2];
}
return table;
}