From c0abb6bd6cefa6a9199d22f54a20ca4ac63f6818 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Dec 08 2020 18:36:57 +0000 Subject: 15 --- diff --git a/15.c b/15.c new file mode 100644 index 0000000..e5ad9ea --- /dev/null +++ b/15.c @@ -0,0 +1,131 @@ + +#include +#include + + +#define CELLSIZE 128 + + +Group edges; +Group group; +Animation frame; +Sprite selected; +double dx, dy; + + +void generate() { + int snake[16]; + for(int i = 0; i < 16; ++i) + snake[i] = i; + + for(int i = 0; i < 128; ++i) { + int j = randomNumber(0, 15); + int k = randomNumber(0, 15); + int s = snake[j]; + snake[j] = snake[k]; + snake[k] = s; + } + + int count = 0; + for(int i = 0; i < 16; ++i) + for(int j = i+1; j < 16; ++j) + if (snake[i] && snake[j] && snake[i] < snake[j]) + ++count; + + if (count % 2) { + for(int i = 0; i < 15; ++i) { + if (snake[i] && snake[i+1]) { + int s = snake[i]; + snake[i] = snake[i+1]; + snake[i+1] = s; + break; + } + } + } + + for(int i = 0; i < 16; ++i) { + int y = i/4; + int x = i%4; + if (y%2) x = 3 - x; + if (snake[i]) + spriteSetXY(groupGet(group, snake[i] - 1), x + 0.5, y + 0.5); + } +} + + +void init() { + edges = createEdgesGroupEx(0, 0, 4, 4, 1, 100); + groupSetVisibleEach(edges, FALSE); + + frame = createAnimation("data/sprite/15/frame.png"); + + group = createGroup(); + for(int i = 0; i < 15; ++i) { + char filename[256] = {}; + sprintf(filename, "data/sprite/15/%d.png", i+1); + Sprite sprite = createSpriteEx(0, 0, 1, 1); + spriteSetAnimation(sprite, createAnimation(filename)); + spriteSetColliderRectangle(sprite, 0, 0, 0, 1, 1, 0.1); + groupAdd(group, sprite); + } + + generate(); +} + + +void draw() { + saveState(); + zoom(CELLSIZE); + + noStroke(); + rectTextured(frame, 0, 0, 6, 6); + + translate(1, 1); + + if (mouseDown("left")) { + double mx = transformedMouseX(); + double my = transformedMouseY(); + if (!selected) { + selected = groupSpriteByPoint(group, mx, my, TRUE); + if (selected) { + dx = spriteGetX(selected) - mx; + dy = spriteGetY(selected) - my; + } + } + + if (selected) { + double d = 0.1; + double x0 = spriteGetX(selected); + double y0 = spriteGetY(selected); + double x1 = mx + dx; + double y1 = my + dy; + if (x1 < x0 - d) x1 = x0 - d; + if (x1 > x0 + d) x1 = x0 + d; + if (y1 < y0 - d) y1 = y0 - d; + if (y1 > y0 + d) y1 = y0 + d; + spriteSetXY(selected, x1, y1); + } + } else { + selected = NULL; + } + + if (mouseWentDown("right") || keyWentDown("space")) + generate(); + + groupCollideBetween(group); + groupCollideGroup(edges, group); + drawSprites(); + + restoreState(); +} + + +int main() { + worldSetTitle("15"); + worldSetInit(&init); + worldSetDraw(&draw); + worldSetSize(6*CELLSIZE, 6*CELLSIZE); + worldSetVariableFrameRate(); + worldRun(); + return 0; +} diff --git a/data-src/sprite/15-frame.xcf b/data-src/sprite/15-frame.xcf new file mode 100644 index 0000000..7b23be4 Binary files /dev/null and b/data-src/sprite/15-frame.xcf differ diff --git a/data-src/sprite/15.xcf b/data-src/sprite/15.xcf new file mode 100644 index 0000000..8da04a9 Binary files /dev/null and b/data-src/sprite/15.xcf differ diff --git a/data/sprite/15/0.png b/data/sprite/15/0.png new file mode 100644 index 0000000..df425a6 Binary files /dev/null and b/data/sprite/15/0.png differ diff --git a/data/sprite/15/1.png b/data/sprite/15/1.png new file mode 100644 index 0000000..1c9be65 Binary files /dev/null and b/data/sprite/15/1.png differ diff --git a/data/sprite/15/10.png b/data/sprite/15/10.png new file mode 100644 index 0000000..c7c6ff1 Binary files /dev/null and b/data/sprite/15/10.png differ diff --git a/data/sprite/15/11.png b/data/sprite/15/11.png new file mode 100644 index 0000000..ec5cb5c Binary files /dev/null and b/data/sprite/15/11.png differ diff --git a/data/sprite/15/12.png b/data/sprite/15/12.png new file mode 100644 index 0000000..8643048 Binary files /dev/null and b/data/sprite/15/12.png differ diff --git a/data/sprite/15/13.png b/data/sprite/15/13.png new file mode 100644 index 0000000..76e8e8f Binary files /dev/null and b/data/sprite/15/13.png differ diff --git a/data/sprite/15/14.png b/data/sprite/15/14.png new file mode 100644 index 0000000..24bc074 Binary files /dev/null and b/data/sprite/15/14.png differ diff --git a/data/sprite/15/15.png b/data/sprite/15/15.png new file mode 100644 index 0000000..bfbc248 Binary files /dev/null and b/data/sprite/15/15.png differ diff --git a/data/sprite/15/2.png b/data/sprite/15/2.png new file mode 100644 index 0000000..9b0fac4 Binary files /dev/null and b/data/sprite/15/2.png differ diff --git a/data/sprite/15/3.png b/data/sprite/15/3.png new file mode 100644 index 0000000..9cf0c8f Binary files /dev/null and b/data/sprite/15/3.png differ diff --git a/data/sprite/15/4.png b/data/sprite/15/4.png new file mode 100644 index 0000000..abfafad Binary files /dev/null and b/data/sprite/15/4.png differ diff --git a/data/sprite/15/5.png b/data/sprite/15/5.png new file mode 100644 index 0000000..91650a4 Binary files /dev/null and b/data/sprite/15/5.png differ diff --git a/data/sprite/15/6.png b/data/sprite/15/6.png new file mode 100644 index 0000000..0bfe619 Binary files /dev/null and b/data/sprite/15/6.png differ diff --git a/data/sprite/15/7.png b/data/sprite/15/7.png new file mode 100644 index 0000000..ff10d57 Binary files /dev/null and b/data/sprite/15/7.png differ diff --git a/data/sprite/15/8.png b/data/sprite/15/8.png new file mode 100644 index 0000000..0218391 Binary files /dev/null and b/data/sprite/15/8.png differ diff --git a/data/sprite/15/9.png b/data/sprite/15/9.png new file mode 100644 index 0000000..42aff3e Binary files /dev/null and b/data/sprite/15/9.png differ diff --git a/data/sprite/15/frame.png b/data/sprite/15/frame.png new file mode 100644 index 0000000..72d5f8d Binary files /dev/null and b/data/sprite/15/frame.png differ