mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-23 03:52:45 -05:00
Port of Simon Tatham's Puzzle Collection
Original revision: 5123b1bf68777ffa86e651f178046b26a87cf2d9 MIT Licensed. Some games still crash and others are unplayable due to issues with controls. Still need a "real" polygon filling algorithm. Currently builds one plugin per puzzle (about 40 in total, around 100K each on ARM), but can easily be made to build a single monolithic overlay (800K or so on ARM). The following games are at least partially broken for various reasons, and have been disabled on this commit: Cube: failed assertion with "Icosahedron" setting Keen: input issues Mines: weird stuff happens on target Palisade: input issues Solo: input issues, occasional crash on target Towers: input issues Undead: input issues Unequal: input and drawing issues (concave polys) Untangle: input issues Features left to do: - In-game help system - Figure out the weird bugs Change-Id: I7c69b6860ab115f973c8d76799502e9bb3d52368
This commit is contained in:
parent
3ee79724f6
commit
1a6a8b52f7
289 changed files with 147273 additions and 0 deletions
110
apps/plugins/puzzles/combi.c
Normal file
110
apps/plugins/puzzles/combi.c
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
#include "rbassert.h"
|
||||
#include <string.h>
|
||||
|
||||
#include "puzzles.h"
|
||||
|
||||
/* horrific and doesn't check overflow. */
|
||||
static long factx(long x, long y)
|
||||
{
|
||||
long acc = 1, i;
|
||||
|
||||
for (i = y; i <= x; i++)
|
||||
acc *= i;
|
||||
return acc;
|
||||
}
|
||||
|
||||
void reset_combi(combi_ctx *combi)
|
||||
{
|
||||
int i;
|
||||
combi->nleft = combi->total;
|
||||
for (i = 0; i < combi->r; i++)
|
||||
combi->a[i] = i;
|
||||
}
|
||||
|
||||
combi_ctx *new_combi(int r, int n)
|
||||
{
|
||||
long nfr, nrf;
|
||||
combi_ctx *combi;
|
||||
|
||||
assert(r <= n);
|
||||
assert(n >= 1);
|
||||
|
||||
combi = snew(combi_ctx);
|
||||
memset(combi, 0, sizeof(combi_ctx));
|
||||
combi->r = r;
|
||||
combi->n = n;
|
||||
|
||||
combi->a = snewn(r, int);
|
||||
memset(combi->a, 0, r * sizeof(int));
|
||||
|
||||
nfr = factx(n, r+1);
|
||||
nrf = factx(n-r, 1);
|
||||
combi->total = (int)(nfr / nrf);
|
||||
|
||||
reset_combi(combi);
|
||||
return combi;
|
||||
}
|
||||
|
||||
/* returns NULL when we're done otherwise returns input. */
|
||||
combi_ctx *next_combi(combi_ctx *combi)
|
||||
{
|
||||
int i = combi->r - 1, j;
|
||||
|
||||
if (combi->nleft == combi->total)
|
||||
goto done;
|
||||
else if (combi->nleft <= 0)
|
||||
return NULL;
|
||||
|
||||
while (combi->a[i] == combi->n - combi->r + i)
|
||||
i--;
|
||||
combi->a[i] += 1;
|
||||
for (j = i+1; j < combi->r; j++)
|
||||
combi->a[j] = combi->a[i] + j - i;
|
||||
|
||||
done:
|
||||
combi->nleft--;
|
||||
return combi;
|
||||
}
|
||||
|
||||
void free_combi(combi_ctx *combi)
|
||||
{
|
||||
sfree(combi->a);
|
||||
sfree(combi);
|
||||
}
|
||||
|
||||
/* compile this with:
|
||||
* gcc -o combi.exe -DSTANDALONE_COMBI_TEST combi.c malloc.c
|
||||
*/
|
||||
#ifdef STANDALONE_COMBI_TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void fatal(char *fmt, ...)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
combi_ctx *c;
|
||||
int i, r, n;
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: combi R N\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r = atoi(argv[1]); n = atoi(argv[2]);
|
||||
c = new_combi(r, n);
|
||||
printf("combi %d of %d, %d elements.\n", c->r, c->n, c->total);
|
||||
|
||||
while (next_combi(c)) {
|
||||
for (i = 0; i < c->r; i++) {
|
||||
printf("%d ", c->a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
free_combi(c);
|
||||
}
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue