Anonymous user
Morpion solitaire: Difference between revisions
→{{header|C}}: reinterpreted rules when one position can complete multiple lines
m (link to rules) |
(→{{header|C}}: reinterpreted rules when one position can complete multiple lines) |
||
Line 29:
/* option: how long a line is. Options probably should have been made into
int line_len = 5;
/* option: whether two lines are allowed to be in the same direction and
int disjoint =
int **board = 0, width, height;
Line 49:
s_dir_nw_se = 1 << 4,
s_newly_added = 1 << 5,
s_current = 1 << 6,
};
Line 107 ⟶ 108:
int i, j;
for_i for_j mvprintw(i + 1, j * 2,
(board[i][j] &
: (board[i][j] &
refresh();
}
Line 130 ⟶ 132:
{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 */
{
int m, k, s, dx, dy, xx, yy, dir;
▲ if (board[y][x] & s_occupied) return 0;
▲ board[y][x] |= s_occupied;
for (m = 0; m < 4; m++) { /* 4 directions */
Line 162 ⟶ 163:
if (k != line_len) continue;
/* position ok;
if (test_only) return 1;▼
if (! irand(++rec->seq))
rec->m = m, rec->s = s, rec->x = x, rec->y = y;
for (k = 0; k < line_len; k++) {▼
xx = x + dx * (k + s);▼
yy = y + dy * (k + s);▼
board[yy][xx] |= s_newly_added;▼
if (k >= disjoint || k < line_len - disjoint)▼
board[yy][xx] |= dir;▼
}
}
}
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);
}
}
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);
▲ * being selected */
/* didn't find any move, game over */
add_piece(
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;
}
|