fix logic: don't add tiles if nothing moved
This commit is contained in:
parent
f25b57e018
commit
267678ed02
|
@ -28,13 +28,11 @@
|
||||||
free(ptr);\
|
free(ptr);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Define a sequence that should be executed each turn */
|
/* should be executed each turn */
|
||||||
#define TURN(x)\
|
#define TURN(x)\
|
||||||
do {\
|
gravitate(x) +\
|
||||||
gravitate(x);\
|
merge(x) +\
|
||||||
merge(x);\
|
gravitate(x)
|
||||||
gravitate(x);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* maximum length of any value in grid, for printing */
|
/* maximum length of any value in grid, for printing */
|
||||||
int MAXVAL;
|
int MAXVAL;
|
||||||
|
@ -59,8 +57,9 @@ int hs;
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
/* Merges adjacent squares of the same value together in a certain direction */
|
/* Merges adjacent squares of the same value together in a certain direction */
|
||||||
void merge(int d)
|
int merge(int d)
|
||||||
{
|
{
|
||||||
|
int moved = 0;
|
||||||
if (d == DL) {
|
if (d == DL) {
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = 0; i < SZ; i++) {
|
for (i = 0; i < SZ; i++) {
|
||||||
|
@ -70,6 +69,7 @@ void merge(int d)
|
||||||
sl += g[i][j];
|
sl += g[i][j];
|
||||||
s += g[i][j];
|
s += g[i][j];
|
||||||
g[i][j++ + 1] = 0;
|
g[i][j++ + 1] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ void merge(int d)
|
||||||
sl += g[j][i];
|
sl += g[j][i];
|
||||||
s += g[j][i];
|
s += g[j][i];
|
||||||
g[j++ + 1][i] = 0;
|
g[j++ + 1][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,6 +97,7 @@ void merge(int d)
|
||||||
sl += g[i][j];
|
sl += g[i][j];
|
||||||
s += g[i][j];
|
s += g[i][j];
|
||||||
g[i][j-- - 1] = 0;
|
g[i][j-- - 1] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,18 +111,21 @@ void merge(int d)
|
||||||
sl += g[j][i];
|
sl += g[j][i];
|
||||||
s += g[j][i];
|
s += g[j][i];
|
||||||
g[j-- - 1][i] = 0;
|
g[j-- - 1][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return moved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* move all values in the grid to the edge given by the direction pressed */
|
/* move all values in the grid to the edge given by the direction pressed */
|
||||||
/* would be nice to generalize this code a little so didn't need four loops */
|
/* would be nice to generalize this code a little so didn't need four loops */
|
||||||
/* if animations are wanted, then need to alter this so it moves each square one at a time */
|
/* if animations are wanted, then need to alter this so it moves each square one at a time */
|
||||||
void gravitate(int d)
|
int gravitate(int d)
|
||||||
{
|
{
|
||||||
|
int moved = 0;
|
||||||
if (d == DL) {
|
if (d == DL) {
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = 0; i < SZ; i++) {
|
for (i = 0; i < SZ; i++) {
|
||||||
|
@ -131,6 +136,7 @@ void gravitate(int d)
|
||||||
if (j + st < SZ) {
|
if (j + st < SZ) {
|
||||||
g[i][j] = g[i][j + st];
|
g[i][j] = g[i][j + st];
|
||||||
g[i][j + st] = 0;
|
g[i][j + st] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,6 +151,7 @@ void gravitate(int d)
|
||||||
if (j + st < SZ) {
|
if (j + st < SZ) {
|
||||||
g[j][i] = g[j + st][i];
|
g[j][i] = g[j + st][i];
|
||||||
g[j + st][i] = 0;
|
g[j + st][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -159,6 +166,7 @@ void gravitate(int d)
|
||||||
if (j - st >= 0) {
|
if (j - st >= 0) {
|
||||||
g[i][j] = g[i][j - st];
|
g[i][j] = g[i][j - st];
|
||||||
g[i][j - st] = 0;
|
g[i][j - st] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,10 +181,12 @@ void gravitate(int d)
|
||||||
if (j - st >= 0) {
|
if (j - st >= 0) {
|
||||||
g[j][i] = g[j - st][i];
|
g[j][i] = g[j - st][i];
|
||||||
g[j - st][i] = 0;
|
g[j - st][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return moved;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load hiscore */
|
/* load hiscore */
|
||||||
|
@ -355,10 +365,11 @@ int main(int argc, char **argv)
|
||||||
ITER(2, rand_block());
|
ITER(2, rand_block());
|
||||||
draw_grid(gamewin);
|
draw_grid(gamewin);
|
||||||
|
|
||||||
int key;
|
int key, moved;
|
||||||
while (1) {
|
while (1) {
|
||||||
/* will goto this if we didn't get a valid keypress */
|
/* will goto this if we didn't get a valid keypress */
|
||||||
retry:;
|
retry:;
|
||||||
|
moved = 0;
|
||||||
key = wgetch(gamewin);
|
key = wgetch(gamewin);
|
||||||
sl = 0;
|
sl = 0;
|
||||||
|
|
||||||
|
@ -367,22 +378,22 @@ int main(int argc, char **argv)
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'a':
|
case 'a':
|
||||||
case KEY_LEFT:
|
case KEY_LEFT:
|
||||||
TURN(DL);
|
moved = TURN(DL);
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
case 'd':
|
case 'd':
|
||||||
case KEY_RIGHT:
|
case KEY_RIGHT:
|
||||||
TURN(DR);
|
moved = TURN(DR);
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case 's':
|
case 's':
|
||||||
case KEY_DOWN:
|
case KEY_DOWN:
|
||||||
TURN(DD);
|
moved = TURN(DD);
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'w':
|
case 'w':
|
||||||
case KEY_UP:
|
case KEY_UP:
|
||||||
TURN(DU);
|
moved = TURN(DU);
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
FREE2D(g, SZ);
|
FREE2D(g, SZ);
|
||||||
|
@ -395,7 +406,9 @@ int main(int argc, char **argv)
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moved) {
|
||||||
ITER(n_blocks, rand_block());
|
ITER(n_blocks, rand_block());
|
||||||
draw_grid(gamewin);
|
draw_grid(gamewin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -33,11 +33,9 @@
|
||||||
|
|
||||||
/* Define a sequence that should be executed each turn */
|
/* Define a sequence that should be executed each turn */
|
||||||
#define TURN(x)\
|
#define TURN(x)\
|
||||||
do {\
|
gravitate(x) +\
|
||||||
gravitate(x);\
|
merge(x) +\
|
||||||
merge(x);\
|
gravitate(x)
|
||||||
gravitate(x);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* direction enumeration */
|
/* direction enumeration */
|
||||||
enum {DR, DU, DL, DD};
|
enum {DR, DU, DL, DD};
|
||||||
|
@ -59,8 +57,9 @@ int hs;
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
/* Merges adjacent squares of the same value together in a certain direction */
|
/* Merges adjacent squares of the same value together in a certain direction */
|
||||||
void merge(int d)
|
int merge(int d)
|
||||||
{
|
{
|
||||||
|
int moved = 0;
|
||||||
if (d == DL) {
|
if (d == DL) {
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = 0; i < SZ; i++) {
|
for (i = 0; i < SZ; i++) {
|
||||||
|
@ -70,6 +69,7 @@ void merge(int d)
|
||||||
sl += g[i][j];
|
sl += g[i][j];
|
||||||
s += g[i][j];
|
s += g[i][j];
|
||||||
g[i][j++ + 1] = 0;
|
g[i][j++ + 1] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ void merge(int d)
|
||||||
sl += g[j][i];
|
sl += g[j][i];
|
||||||
s += g[j][i];
|
s += g[j][i];
|
||||||
g[j++ + 1][i] = 0;
|
g[j++ + 1][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,6 +97,7 @@ void merge(int d)
|
||||||
sl += g[i][j];
|
sl += g[i][j];
|
||||||
s += g[i][j];
|
s += g[i][j];
|
||||||
g[i][j-- - 1] = 0;
|
g[i][j-- - 1] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,17 +111,20 @@ void merge(int d)
|
||||||
sl += g[j][i];
|
sl += g[j][i];
|
||||||
s += g[j][i];
|
s += g[j][i];
|
||||||
g[j-- - 1][i] = 0;
|
g[j-- - 1][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return moved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* move all values in the grid to the edge given by the direction pressed */
|
/* move all values in the grid to the edge given by the direction pressed */
|
||||||
/* would be nice to generalize this code a little so didn't need four loops */
|
/* would be nice to generalize this code a little so didn't need four loops */
|
||||||
void gravitate(int d)
|
int gravitate(int d)
|
||||||
{
|
{
|
||||||
|
int moved = 0;
|
||||||
if (d == DL) {
|
if (d == DL) {
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = 0; i < SZ; i++) {
|
for (i = 0; i < SZ; i++) {
|
||||||
|
@ -130,6 +135,7 @@ void gravitate(int d)
|
||||||
if (j + st < SZ) {
|
if (j + st < SZ) {
|
||||||
g[i][j] = g[i][j + st];
|
g[i][j] = g[i][j + st];
|
||||||
g[i][j + st] = 0;
|
g[i][j + st] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,6 +150,7 @@ void gravitate(int d)
|
||||||
if (j + st < SZ) {
|
if (j + st < SZ) {
|
||||||
g[j][i] = g[j + st][i];
|
g[j][i] = g[j + st][i];
|
||||||
g[j + st][i] = 0;
|
g[j + st][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,6 +165,7 @@ void gravitate(int d)
|
||||||
if (j - st >= 0) {
|
if (j - st >= 0) {
|
||||||
g[i][j] = g[i][j - st];
|
g[i][j] = g[i][j - st];
|
||||||
g[i][j - st] = 0;
|
g[i][j - st] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,10 +180,12 @@ void gravitate(int d)
|
||||||
if (j - st >= 0) {
|
if (j - st >= 0) {
|
||||||
g[j][i] = g[j - st][i];
|
g[j][i] = g[j - st][i];
|
||||||
g[j - st][i] = 0;
|
g[j - st][i] = 0;
|
||||||
|
moved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return moved;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* loads hiscore */
|
/* loads hiscore */
|
||||||
|
@ -328,11 +338,11 @@ int main(int argc, char **argv)
|
||||||
tattr.c_lflag &= ~(ICANON | ECHO);
|
tattr.c_lflag &= ~(ICANON | ECHO);
|
||||||
tcsetattr(STDOUT_FILENO, TCSANOW, &tattr);
|
tcsetattr(STDOUT_FILENO, TCSANOW, &tattr);
|
||||||
|
|
||||||
int key;
|
int key, moved;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
/* will goto this if we didn't get a valid keypress */
|
/* will goto this if we didn't get a valid keypress */
|
||||||
retry:;
|
retry:;
|
||||||
|
moved = 0;
|
||||||
key = getchar();
|
key = getchar();
|
||||||
sl = 0;
|
sl = 0;
|
||||||
|
|
||||||
|
@ -340,19 +350,19 @@ int main(int argc, char **argv)
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'a':
|
case 'a':
|
||||||
TURN(DL);
|
moved = TURN(DL);
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
case 'd':
|
case 'd':
|
||||||
TURN(DR);
|
moved = TURN(DR);
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case 's':
|
case 's':
|
||||||
TURN(DD);
|
moved = TURN(DD);
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'w':
|
case 'w':
|
||||||
TURN(DU);
|
moved = TURN(DU);
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
save_score();
|
save_score();
|
||||||
|
@ -361,7 +371,9 @@ int main(int argc, char **argv)
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moved) {
|
||||||
ITER(n_blocks, rand_block());
|
ITER(n_blocks, rand_block());
|
||||||
draw_grid();
|
draw_grid();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user