mirror of
https://github.com/radareorg/radare2.git
synced 2024-11-30 16:40:57 +00:00
160fc95e66
* Use (void) instead of () in function signatures * Add test to avoid further contributions to commit the same mistake
196 lines
4.1 KiB
C
196 lines
4.1 KiB
C
/* radare2 - LGPL - Copyright 2008-2020 - pancake */
|
|
|
|
#include <r_cons.h>
|
|
|
|
static ut8 twok_buf[4][4];
|
|
static int score = 0;
|
|
static int moves = 0;
|
|
|
|
static void twok_init(void) {
|
|
int i, j;
|
|
score = 0;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
twok_buf[i][j] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void twok_add(void) {
|
|
int i, j;
|
|
while (true) {
|
|
i = r_num_rand (4);
|
|
j = r_num_rand (4);
|
|
if (!twok_buf[i][j]) {
|
|
twok_buf[i][j] = 1 + (r_num_rand (10) == 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static bool twok_fin(void) {
|
|
int i, j;
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
if (!twok_buf[i][j]) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = 0; j < 3; j++) {
|
|
if (twok_buf[i][j] == twok_buf[i][j + 1]) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 3; i++) {
|
|
for (j = 0; j < 4; j++) {
|
|
if (twok_buf[i][j] == twok_buf[i + 1][j]) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void twok_move(int u, int v) {
|
|
int i, j, k;
|
|
int nKI = 0, nKJ = 0, nIK = 0, nJK = 0;
|
|
int moved = 0;
|
|
for (k = 0; k < 4; k++) {
|
|
for (i = 0; i < 4; i++) {
|
|
for (j = i + 1; j < 4 && !twok_buf[nKJ = u ? k : v ? j : 3 - j][nJK = !u ? k : v ? j : 3 - j]; j++) {
|
|
;
|
|
}
|
|
if (j == 4) {
|
|
continue;
|
|
}
|
|
nKI = u? k: v? i: 3 - i;
|
|
nIK = !u? k: v? i: 3 - i;
|
|
if (!twok_buf[nKI][nIK]) {
|
|
twok_buf[nKI][nIK] = twok_buf[nKJ][nJK];
|
|
twok_buf[nKJ][nJK] = 0;
|
|
--i;
|
|
moved = 1;
|
|
} else if (twok_buf[nKI][nIK] == twok_buf[nKJ][nJK]) {
|
|
score += 1 << ++twok_buf[nKI][nIK];
|
|
twok_buf[nKJ][nJK] = 0;
|
|
moved = 1;
|
|
}
|
|
}
|
|
}
|
|
if (moved) {
|
|
twok_add ();
|
|
moves++;
|
|
}
|
|
}
|
|
|
|
static void getval(bool color, char *val0, int i, int x) {
|
|
const char * colorarray[] = {
|
|
Color_WHITE,
|
|
Color_RED,
|
|
Color_GREEN,
|
|
Color_MAGENTA,
|
|
Color_YELLOW,
|
|
Color_CYAN,
|
|
Color_BLUE,
|
|
Color_GRAY
|
|
};
|
|
if (twok_buf[i][x]) {
|
|
if (color) {
|
|
snprintf (val0,31, "%s%4d"Color_RESET, colorarray [twok_buf [i][x] % 8 ], 1 << twok_buf[i][x]);
|
|
} else {
|
|
snprintf (val0,31, "%4d", 1 << twok_buf[i][x]);
|
|
}
|
|
} else {
|
|
strcpy (val0, " ");
|
|
}
|
|
}
|
|
|
|
static void twok_print(bool color) {
|
|
char val0[32];
|
|
char val1[32];
|
|
char val2[32];
|
|
char val3[32];
|
|
int i;
|
|
if (color) {
|
|
printf (Color_BBLUE" +------+------+------+------+\n");
|
|
} else {
|
|
printf (" +------+------+------+------+\n");
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
getval (color, val0, i, 0);
|
|
getval (color, val1, i, 1);
|
|
getval (color, val2, i, 2);
|
|
getval (color, val3, i, 3);
|
|
if (color) {
|
|
printf (Color_BBLUE" | | | | |\n");
|
|
printf (" |"Color_RESET" %s "Color_BBLUE"|"Color_RESET" %s "
|
|
Color_BBLUE"|"Color_RESET" %s "Color_BBLUE"|"Color_RESET" %s "Color_BBLUE"|\n",
|
|
val0, val1, val2, val3);
|
|
printf (" | | | | |\n");
|
|
printf (" +------+------+------+------+\n"Color_RESET);
|
|
} else {
|
|
printf (" | | | | |\n");
|
|
printf (" | %s | %s | %s | %s |\n",
|
|
val0, val1, val2, val3);
|
|
printf (" | | | | |\n");
|
|
printf (" +------+------+------+------+\n");
|
|
}
|
|
}
|
|
printf ("Hexboard: 'hjkl' and 'q'uit\n");
|
|
for (i = 0; i < 4; i++) {
|
|
printf (" %02x %02x %02x %02x\n",
|
|
twok_buf[i][0], twok_buf[i][1],
|
|
twok_buf[i][2], twok_buf[i][3]);
|
|
}
|
|
}
|
|
|
|
R_API void r_cons_2048(bool color) {
|
|
int ch;
|
|
r_cons_set_raw (1);
|
|
twok_init ();
|
|
twok_add ();
|
|
twok_add ();
|
|
while (twok_fin ()) {
|
|
r_cons_clear00 ();
|
|
if (color) {
|
|
r_cons_printf (Color_GREEN"[r2048]"Color_BYELLOW" score: %d moves: %d\n"Color_RESET, score, moves);
|
|
} else {
|
|
r_cons_printf ("[r2048] score: %d moves: %d\n", score, moves);
|
|
}
|
|
r_cons_flush ();
|
|
twok_print (color);
|
|
ch = r_cons_readchar ();
|
|
ch = r_cons_arrow_to_hjkl (ch);
|
|
switch (ch) {
|
|
case 'h':
|
|
twok_move (1, 1);
|
|
break;
|
|
case 'j':
|
|
twok_move (0, 0);
|
|
break;
|
|
case 'k':
|
|
twok_move (0, 1);
|
|
break;
|
|
case 'l':
|
|
twok_move (1, 0);
|
|
break;
|
|
}
|
|
if (ch < 1 || ch == 'q') {
|
|
break;
|
|
}
|
|
}
|
|
r_cons_clear00 ();
|
|
r_cons_printf ("[r2048] score: %d\n", score);
|
|
r_cons_flush ();
|
|
twok_print (color);
|
|
|
|
r_cons_printf ("\n [r2048.score] %d\n", score);
|
|
do {
|
|
ch = r_cons_any_key ("Press 'q' to quit.");
|
|
} while (ch != 'q' && ch >= 1);
|
|
r_cons_set_raw (0);
|
|
}
|