Bonjour , je cherche qlqun à m'aider s'il vous plait sur le jeu du morpion solitaire (qui consiste à alligner 5 croix)
voici le code:
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
/* option: how long a line is. Options probably should have been made into
commandline args, if I were not lazy. Also, if line_len is set to 3,
the game may keep going indefinitely: best use auto mode. */
int line_len = 5;
/* option: whether two lines are allowed to be in the same direction and
connected end to end. Note: two lines crossing are always ok. */
int disjoint = 0;
int **board = 0, width, height;
#define for_i for(i = 0; i < height; i++)
#define for_j for(j = 0; j < width; j++)
enum {
s_blank = 0,
s_occupied = 1 << 0,
s_dir_ns = 1 << 1,
s_dir_ew = 1 << 2,
s_dir_ne_sw = 1 << 3,
s_dir_nw_se = 1 << 4,
s_newly_added = 1 << 5,
s_current = 1 << 6,
};
int irand(int n)
{
int r, rand_max = RAND_MAX - (RAND_MAX % n);
while ((r = rand()) >= rand_max);
return r / (rand_max / n);
}
int alloc_board(int w, int h)
{
int i;
int buf = calloc(1, sizeof(int *) * h + sizeof(int) * h * w);
buf[0] = (int*)(buf + h);
for (i = 1; i < h; i++)
buf[i] = buf[i - 1] + w;
return buf;
}
/* -1: expand low index end; 1: exten high index end */
void expand_board(int dw, int dh)
{
int i, j;
int nw = width + !!dw, nh = height + !!dh;
/* garanteed to fragment heap: not realloc because copying elements
* is a bit tricky */
int **nbuf = alloc_board(nw, nh);
dw = -(dw < 0), dh = -(dh < 0);
for (i = 0; i < nh; i++) {
if (i + dh < 0 || i + dh >= height) continue;
for (j = 0; j < nw; j++) {
if (j + dw < 0 || j + dw >= width) continue;
nbuf[i][j] = board[i + dh][j + dw];
}
}
free(board);
board = nbuf;
width = nw;
height = nh;
}
void array_set(int **buf, int v, int x0, int y0, int x1, int y1)
{
int i, j;
for (i = y0; i <= y1; i++)
for (j = x0; j <= x1; j++)
buf[i][j] = v;
}
void show_board()
{
int i, j;
for_i for_j mvprintw(i + 1, j * 2,
(board[i][j] & s_current) ? "X "
: (board[i][j] & s_newly_added) ? "O "
: (board[i][j] & s_occupied) ? "+ " : " ");
refresh();
}
void init_board()
{
width = height = 3 * (line_len - 1);
board = alloc_board(width, height);
array_set(board, s_occupied, line_len - 1, 1, 2 * line_len - 3, height - 2);
array_set(board, s_occupied, 1, line_len - 1, width - 2, 2 * line_len - 3);
array_set(board, s_blank, line_len, 2, 2 * line_len - 4, height - 3);
array_set(board, s_blank, 2, line_len, width - 3, 2 * line_len - 4);
}
int ofs[4][3] = {
{0, 1, s_dir_ns},
{1, 0, s_dir_ew},
{1, -1, s_dir_ne_sw},
{1, 1, s_dir_nw_se}
};
typedef struct { int m, s, seq, x, y; } move_t;
/* test if a point can complete a line, or take that point */
void test_postion(int y, int x, move_t * rec)
{
int m, k, s, dx, dy, xx, yy, dir;
if (board[y][x] & s_occupied) return;
for (m = 0; m < 4; m++) { /* 4 directions */
dx = ofs[m][0];
dy = ofs[m][1];
dir = ofs[m][2];
for (s = 1 - line_len; s <= 0; s++) { /* offset line */
for (k = 0; k < line_len; k++) {
if (s + k == 0) continue;
xx = x + dx * (s + k);
yy = y + dy * (s + k);
if (xx < 0 || xx >= width || yy < 0 || yy >= height)
break;
/* no piece at position */
if (!(board[yy][xx] & s_occupied)) break;
/* this direction taken */
if ((board[yy][xx] & dir)) break;
}
if (k != line_len) continue;
/* position ok; irand() to even each option's chance of
being picked */
if (! irand(++rec->seq))
rec->m = m, rec->s = s, rec->x = x, rec->y = y;
}
}
}
void add_piece(move_t *rec) {
int dx = ofs[rec->m][0];
int dy = ofs[rec->m][1];
int dir= ofs[rec->m][2];
int xx, yy, k;
board[rec->y][rec->x] |= (s_current | s_occupied);
for (k = 0; k < line_len; k++) {
xx = rec->x + dx * (k + rec->s);
yy = rec->y + dy * (k + rec->s);
board[yy][xx] |= s_newly_added;
if (k >= disjoint || k < line_len - disjoint)
board[yy][xx] |= dir;
}
}
int next_move()
{
int i, j;
move_t rec;
rec.seq = 0;
/* wipe last iteration's new line markers */
for_i for_j board[i][j] &= ~(s_newly_added | s_current);
/* randomly pick one of next legal moves */
for_i for_j test_postion(i, j, &rec);
/* didn't find any move, game over */
if (!rec.seq) return 0;
add_piece(&rec);
rec.x = (rec.x == width - 1) ? 1 : rec.x ? 0 : -1;
rec.y = (rec.y == height - 1) ? 1 : rec.y ? 0 : -1;
if (rec.x || rec.y) expand_board(rec.x, rec.y);
return 1;
}
int main()
{
int ch = 0;
int move = 0;
int wait_key = 1;
init_board();
srand(time(0));
initscr();
noecho();
cbreak();
do {
mvprintw(0, 0, "Move %d", move++);
show_board();
if (!next_move()) {
next_move();
show_board();
break;
}
if (!wait_key) usleep(100000);
if ((ch = getch()) == ' ') {
wait_key = !wait_key;
if (wait_key) timeout(-1);
else timeout(0);
}
} while (ch != 'q');
timeout(-1);
nocbreak();
echo();
endwin();
return 0;
}
Merci d'avance! :)