|
@@ -1,5 +1,3 @@
|
|
|
-#define _XOPEN_SOURCE_EXTENDED
|
|
|
-
|
|
|
#include <locale.h>
|
|
|
#include <ncurses.h>
|
|
|
#include <stdio.h>
|
|
@@ -21,14 +19,16 @@ static void (*rotateFunction)(void);
|
|
|
static uint32_t seed = 0;
|
|
|
|
|
|
static void initRandom(void) {
|
|
|
- struct timespec time;
|
|
|
- timespec_get(&time, TIME_UTC);
|
|
|
- seed = (uint32_t)time.tv_nsec;
|
|
|
+ while(seed == 0) {
|
|
|
+ struct timespec time;
|
|
|
+ timespec_get(&time, TIME_UTC);
|
|
|
+ seed = (uint32_t)time.tv_nsec;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int nextRandom(int max) {
|
|
|
- seed = seed * 27697u + 13711u;
|
|
|
- int32_t random = ((int32_t)(seed >> 1)) % max;
|
|
|
+ seed = seed * 0x915f77f5 + 1;
|
|
|
+ int32_t random = ((int32_t)(seed >> 16)) % max;
|
|
|
return random;
|
|
|
}
|
|
|
|
|
@@ -46,22 +46,41 @@ static void initGamefield(int w, int h) {
|
|
|
}
|
|
|
|
|
|
static void printGamefield(void) {
|
|
|
+ clear();
|
|
|
static const char* MAP[] = {"\u2592", "\u2593", " "};
|
|
|
static const char* wall = "\u2588";
|
|
|
|
|
|
- for(int x = 0; x < width * 2 + 4; x++) {
|
|
|
- mvaddstr(0, x, wall);
|
|
|
- mvaddstr(height + 1, x, wall);
|
|
|
+ int maxX = 0;
|
|
|
+ int maxY = 0;
|
|
|
+ getmaxyx(stdscr, maxY, maxX);
|
|
|
+ int factorX = maxX / (width + 2);
|
|
|
+ int factorY = maxY / (height + 2);
|
|
|
+ while(factorY > 1 && factorY * 2 > factorX) {
|
|
|
+ factorY--;
|
|
|
+ }
|
|
|
+ factorX = factorY * 2;
|
|
|
+
|
|
|
+ for(int x = 0; x < (width + 2) * factorX; x++) {
|
|
|
+ for(int y = 0; y < factorY; y++) {
|
|
|
+ mvaddstr(y, x, wall);
|
|
|
+ mvaddstr(y + (height + 1) * factorY, x, wall);
|
|
|
+ }
|
|
|
}
|
|
|
for(int y = 0; y < height; y++) {
|
|
|
- mvaddstr(y + 1, 0, wall);
|
|
|
- addstr(wall);
|
|
|
- for(int x = 0; x < width; x++) {
|
|
|
- addstr(MAP[fields[y][x]]);
|
|
|
- addstr(MAP[fields[y][x]]);
|
|
|
+ for(int wy = y * factorY; wy < (y + 1) * factorY; wy++) {
|
|
|
+ mvaddstr(wy + factorY, 0, wall);
|
|
|
+ for(int x = 1; x < factorX; x++) {
|
|
|
+ addstr(wall);
|
|
|
+ }
|
|
|
+ for(int x = 0; x < width; x++) {
|
|
|
+ for(int w = 0; w < factorX; w++) {
|
|
|
+ addstr(MAP[fields[y][x]]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int x = 0; x < factorX; x++) {
|
|
|
+ addstr(wall);
|
|
|
+ }
|
|
|
}
|
|
|
- addstr(wall);
|
|
|
- addstr(wall);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -141,7 +160,9 @@ static void rotate(void) {
|
|
|
static void spawnObject(int x, int y) {
|
|
|
objectX = x;
|
|
|
objectY = y;
|
|
|
- switch(nextRandom(7)) {
|
|
|
+ int u = nextRandom(8);
|
|
|
+ objects[u]++;
|
|
|
+ switch(u) {
|
|
|
// .X.
|
|
|
// XXX
|
|
|
// ...
|
|
@@ -184,25 +205,10 @@ static void spawnObject(int x, int y) {
|
|
|
movingObject[7] = y + 2;
|
|
|
rotateFunction = rotate33;
|
|
|
break;
|
|
|
- // .X..
|
|
|
- // .X..
|
|
|
- // .X..
|
|
|
- // .X..
|
|
|
- case 3:
|
|
|
- movingObject[0] = x + 0;
|
|
|
- movingObject[1] = y + 0;
|
|
|
- movingObject[2] = x + 0;
|
|
|
- movingObject[3] = y + 1;
|
|
|
- movingObject[4] = x + 0;
|
|
|
- movingObject[5] = y + 2;
|
|
|
- movingObject[6] = x + 0;
|
|
|
- movingObject[7] = y + 3;
|
|
|
- rotateFunction = rotate41;
|
|
|
- break;
|
|
|
// X..
|
|
|
// XX.
|
|
|
// .X.
|
|
|
- case 4:
|
|
|
+ case 3:
|
|
|
movingObject[0] = x + 0;
|
|
|
movingObject[1] = y + 0;
|
|
|
movingObject[2] = x + 0;
|
|
@@ -216,7 +222,7 @@ static void spawnObject(int x, int y) {
|
|
|
// .X.
|
|
|
// XX.
|
|
|
// X..
|
|
|
- case 5:
|
|
|
+ case 4:
|
|
|
movingObject[0] = x + 1;
|
|
|
movingObject[1] = y + 0;
|
|
|
movingObject[2] = x + 0;
|
|
@@ -229,7 +235,7 @@ static void spawnObject(int x, int y) {
|
|
|
break;
|
|
|
// XX
|
|
|
// XX
|
|
|
- case 6:
|
|
|
+ case 5:
|
|
|
movingObject[0] = x + 0;
|
|
|
movingObject[1] = y + 0;
|
|
|
movingObject[2] = x + 1;
|
|
@@ -240,6 +246,22 @@ static void spawnObject(int x, int y) {
|
|
|
movingObject[7] = y + 1;
|
|
|
rotateFunction = rotate22;
|
|
|
break;
|
|
|
+ // .X..
|
|
|
+ // .X..
|
|
|
+ // .X..
|
|
|
+ // .X..
|
|
|
+ case 6:
|
|
|
+ case 7:
|
|
|
+ movingObject[0] = x + 0;
|
|
|
+ movingObject[1] = y + 0;
|
|
|
+ movingObject[2] = x + 0;
|
|
|
+ movingObject[3] = y + 1;
|
|
|
+ movingObject[4] = x + 0;
|
|
|
+ movingObject[5] = y + 2;
|
|
|
+ movingObject[6] = x + 0;
|
|
|
+ movingObject[7] = y + 3;
|
|
|
+ rotateFunction = rotate41;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
for(int i = 0; i < 8; i += 2) {
|