return h;
}
-board_t *_lookforforbidenposition (board_t *board, board_t *box, int i, char val)
+board_t *_idemposition (board_t *board, char val)
+{
+ int n = sqrti (board->length);
+
+ board_t *box = initboard (n);
+
+ int i, j;
+ for (i = 0; i < board->length; i++) {
+ for (j = 0; j < board->length; j++) {
+ if (getvalue (board, i, j) == val) {
+ *getcell (box, i % n, j % n) = '#';
+ }
+ }
+ }
+ return box;
+}
+
+int _isinbox (board_t *board, int i, int j, char val)
+{
+ int n = sqrti (board->length);
+
+ int k, l;
+ for (k = 0; k < n; k++) {
+ for (l = 0; l < n; l++) {
+ if (getvalue (board, n * i + k, n * j + l) == val) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+board_t *_forbidenposition (board_t *board, board_t *box, int i, char val)
{
int j;
int n = sqrti (board->length);
board_t *initplay (board_t *board, int nb_known_tiles)
{
- int k;
+ int t;
int n = sqrti (board->length);
- /* init boxes */
- board_t **vboxes = (board_t **) calloc (sizeof (board_t *), board->length);
- CHECKALLOC (vboxes);
- for (k = 0; k < board->length; k++) {
- vboxes[k] = initboard (n);
- }
+char *buffer = (char *) calloc (board->length * (8 + board->length) + 1, 1);
- /* k is value */
- for (k = 0; k < nb_known_tiles; k++) {
+ for (t = 0; t < nb_known_tiles; t++) {
+
+ /* k is value */
+ int k = rand () % board->length;
char val = _itoh (1 + k);
- board_t *vbox = vboxes[k];
+ board_t *box = _idemposition (board, val);
+
+_makecomments (buffer, box);
+printf ("box:\n%s", buffer);
/* i in position */
int i;
- for (i = 0; i < board->length; i++) {
- int j;
-
- /* look for forbiden position */
- board_t *box = _lookforforbidenposition (board, copyboard (vbox), i, val);
-
- /* count avaliable position */
- int pos = 0;
- for (j = 0; j < board->length; j++) {
- if (getvalue (box, j % n, j / n) == ' ') {
- pos++;
- }
+ do {
+ i = rand () % board->length;
+ } while (_isinbox (board, i % n, i / n, val));
+
+ /* look for forbiden position */
+ _forbidenposition (board, box, i, val);
+
+_makecomments (buffer, box);
+printf ("box:\n%s", buffer);
+
+ /* count avaliable position */
+ int j;
+ int pos = 0;
+ for (j = 0; j < board->length; j++) {
+ if (getvalue (box, j % n, j / n) == ' ') {
+ pos++;
}
+ }
+
+ /* random position */
+ if (pos > 0) {
+ pos = rand () % pos;
- /* random position */
- if (pos > 0) {
- pos = rand () % pos;
- }
for (j = 0; (j < board->length) && (pos >= 0); j++) {
if (getvalue (box, j % n, j / n) == ' ') {
if (pos == 0) {
*getcell (board, n * (i % n) + j % n, n * (i / n) + j / n) = val;
- *getcell (vbox, j % n, j / n) = '#';
}
pos--;
}
}
-
- char *buffer = (char *) calloc (board->length * (8 + board->length) + 1, 1);
- _makecomments (buffer, box);
- printf ("box:\n%s", buffer);
- _makecomments (buffer, board);
- printf ("board:\n%s", buffer);
- free (buffer);
-
- freeboard (box);
}
- }
+ _makecomments (buffer, board);
+ printf ("board:\n%s", buffer);
- for (k = 0; k < board->length; k++) {
- freeboard (vboxes[k]);
+ freeboard (box);
}
- free (vboxes);
+
+free (buffer);
return board;
}
char *version = "0.1";
int length = 3;
+int nb = 20;
int seed = 0;
int xoffset = 1;
int yoffset = 1;
int usage (int ret)
{
FILE *fd = ret ? stderr : stdout;
- fprintf (fd, "usage: %s [-h] [-l length] [-s seed] [-v level]\n", progname);
+ fprintf (fd, "usage: %s [-h] [-l length] [-n nb] [-s seed] [-v level]\n", progname);
fprintf (fd, " -h: help message\n");
fprintf (fd, " -l: box length (%d)\n", length);
+ fprintf (fd, " -n: nb known tiles (%d)\n", nb);
fprintf (fd, " -s: random seed (%d)\n", seed);
fprintf (fd, " -v: verbose level (%d)\n", verbose);
fprintf (fd, "%s version %s\n", progname, version);
}
length = atoi (arg);
break;
+ case 'n':
+ arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+ if (arg == NULL) {
+ VERBOSE (ERROR, fprintf (stderr, "%s: no nb of known tiles specified\n", progname));
+ return usage (1);
+ }
+ nb = atoi (arg);
+ break;
case 's':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
/* init board */
srand (seed);
board_t *board = initboard (length * length);
- initplay (board, length * length);
+ initplay (board, nb);
/* init curses */
initscr ();