mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Copy-to-clipboard facility for Fifteen, Sixteen and Twiddle.
[originally from svn r5725]
This commit is contained in:
41
fifteen.c
41
fifteen.c
@ -372,7 +372,44 @@ static void free_game(game_state *state)
|
|||||||
|
|
||||||
static char *game_text_format(game_state *state)
|
static char *game_text_format(game_state *state)
|
||||||
{
|
{
|
||||||
return NULL;
|
char *ret, *p, buf[80];
|
||||||
|
int x, y, col, maxlen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First work out how many characters we need to display each
|
||||||
|
* number.
|
||||||
|
*/
|
||||||
|
col = sprintf(buf, "%d", state->n-1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we know the exact total size of the grid we're going to
|
||||||
|
* produce: it's got h rows, each containing w lots of col, w-1
|
||||||
|
* spaces and a trailing newline.
|
||||||
|
*/
|
||||||
|
maxlen = state->h * state->w * (col+1);
|
||||||
|
|
||||||
|
ret = snewn(maxlen, char);
|
||||||
|
p = ret;
|
||||||
|
|
||||||
|
for (y = 0; y < state->h; y++) {
|
||||||
|
for (x = 0; x < state->w; x++) {
|
||||||
|
int v = state->tiles[state->w*y+x];
|
||||||
|
if (v == 0)
|
||||||
|
sprintf(buf, "%*s", col, "");
|
||||||
|
else
|
||||||
|
sprintf(buf, "%*d", col, v);
|
||||||
|
memcpy(p, buf, col);
|
||||||
|
p += col;
|
||||||
|
if (x+1 == state->w)
|
||||||
|
*p++ = '\n';
|
||||||
|
else
|
||||||
|
*p++ = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(p - ret == maxlen);
|
||||||
|
*p = '\0';
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static game_ui *new_ui(game_state *state)
|
static game_ui *new_ui(game_state *state)
|
||||||
@ -743,7 +780,7 @@ const struct game thegame = {
|
|||||||
new_game,
|
new_game,
|
||||||
dup_game,
|
dup_game,
|
||||||
free_game,
|
free_game,
|
||||||
FALSE, game_text_format,
|
TRUE, game_text_format,
|
||||||
new_ui,
|
new_ui,
|
||||||
free_ui,
|
free_ui,
|
||||||
make_move,
|
make_move,
|
||||||
|
38
sixteen.c
38
sixteen.c
@ -381,7 +381,41 @@ static void free_game(game_state *state)
|
|||||||
|
|
||||||
static char *game_text_format(game_state *state)
|
static char *game_text_format(game_state *state)
|
||||||
{
|
{
|
||||||
return NULL;
|
char *ret, *p, buf[80];
|
||||||
|
int x, y, col, maxlen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First work out how many characters we need to display each
|
||||||
|
* number.
|
||||||
|
*/
|
||||||
|
col = sprintf(buf, "%d", state->n);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we know the exact total size of the grid we're going to
|
||||||
|
* produce: it's got h rows, each containing w lots of col, w-1
|
||||||
|
* spaces and a trailing newline.
|
||||||
|
*/
|
||||||
|
maxlen = state->h * state->w * (col+1);
|
||||||
|
|
||||||
|
ret = snewn(maxlen, char);
|
||||||
|
p = ret;
|
||||||
|
|
||||||
|
for (y = 0; y < state->h; y++) {
|
||||||
|
for (x = 0; x < state->w; x++) {
|
||||||
|
int v = state->tiles[state->w*y+x];
|
||||||
|
sprintf(buf, "%*d", col, v);
|
||||||
|
memcpy(p, buf, col);
|
||||||
|
p += col;
|
||||||
|
if (x+1 == state->w)
|
||||||
|
*p++ = '\n';
|
||||||
|
else
|
||||||
|
*p++ = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(p - ret == maxlen);
|
||||||
|
*p = '\0';
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static game_ui *new_ui(game_state *state)
|
static game_ui *new_ui(game_state *state)
|
||||||
@ -793,7 +827,7 @@ const struct game thegame = {
|
|||||||
new_game,
|
new_game,
|
||||||
dup_game,
|
dup_game,
|
||||||
free_game,
|
free_game,
|
||||||
FALSE, game_text_format,
|
TRUE, game_text_format,
|
||||||
new_ui,
|
new_ui,
|
||||||
free_ui,
|
free_ui,
|
||||||
make_move,
|
make_move,
|
||||||
|
46
twiddle.c
46
twiddle.c
@ -454,7 +454,49 @@ static void free_game(game_state *state)
|
|||||||
|
|
||||||
static char *game_text_format(game_state *state)
|
static char *game_text_format(game_state *state)
|
||||||
{
|
{
|
||||||
return NULL;
|
char *ret, *p, buf[80];
|
||||||
|
int i, x, y, col, o, maxlen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First work out how many characters we need to display each
|
||||||
|
* number. We're pretty flexible on grid contents here, so we
|
||||||
|
* have to scan the entire grid.
|
||||||
|
*/
|
||||||
|
col = 0;
|
||||||
|
for (i = 0; i < state->w * state->h; i++) {
|
||||||
|
x = sprintf(buf, "%d", state->grid[i] / 4);
|
||||||
|
if (col < x) col = x;
|
||||||
|
}
|
||||||
|
o = (state->orientable ? 1 : 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we know the exact total size of the grid we're going to
|
||||||
|
* produce: it's got h rows, each containing w lots of col+o,
|
||||||
|
* w-1 spaces and a trailing newline.
|
||||||
|
*/
|
||||||
|
maxlen = state->h * state->w * (col+o+1);
|
||||||
|
|
||||||
|
ret = snewn(maxlen, char);
|
||||||
|
p = ret;
|
||||||
|
|
||||||
|
for (y = 0; y < state->h; y++) {
|
||||||
|
for (x = 0; x < state->w; x++) {
|
||||||
|
int v = state->grid[state->w*y+x];
|
||||||
|
sprintf(buf, "%*d", col, v/4);
|
||||||
|
memcpy(p, buf, col);
|
||||||
|
p += col;
|
||||||
|
if (o)
|
||||||
|
*p++ = "^<v>"[v & 3];
|
||||||
|
if (x+1 == state->w)
|
||||||
|
*p++ = '\n';
|
||||||
|
else
|
||||||
|
*p++ = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(p - ret == maxlen);
|
||||||
|
*p = '\0';
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static game_ui *new_ui(game_state *state)
|
static game_ui *new_ui(game_state *state)
|
||||||
@ -947,7 +989,7 @@ const struct game thegame = {
|
|||||||
new_game,
|
new_game,
|
||||||
dup_game,
|
dup_game,
|
||||||
free_game,
|
free_game,
|
||||||
FALSE, game_text_format,
|
TRUE, game_text_format,
|
||||||
new_ui,
|
new_ui,
|
||||||
free_ui,
|
free_ui,
|
||||||
make_move,
|
make_move,
|
||||||
|
Reference in New Issue
Block a user