0,0 → 1,192 |
#include "system/kolibri.h" |
#include "system/stdlib.h" |
#include "system/string.h" |
|
char CONSOLE[] = "/sys/lib/console.obj"; |
|
#define MENTION _printf("Arrows to move left, up, right or down, or 'Esc' to exit: \n\n"); |
|
int** field; |
int emptyCell_x, emptyCell_y; |
|
char NOT_VALID_MOVE[] = {"Not valid move.\n\n"}; |
|
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t); |
void (* _cdecl _printf)(const char* format,...); |
void (* _stdcall __exit)(char bCloseWindow); |
int (* _stdcall _getch)(void); |
|
|
//------------------ |
void init() |
{ |
int x,y, i,j; |
srand( kol_system_time_get() ); |
for(i=1; i<=15;) |
{ |
x=rand()%4; y=rand()%4; |
if(field[x][y] == 0) field[x][y] = i++; |
} |
|
for(i=0; i<4; i++) //to find the empty cell |
for(j=0; j<4; j++) |
if(field[j][i] == 0) |
{ |
emptyCell_x=j; emptyCell_y = i; return; |
} |
|
} |
|
//--------------------- |
void printField() |
{ |
int i,j; |
for(i=0; i<4; i++) |
{ |
for(j=0; j<4; j++) |
if(field[j][i]) _printf("%3d", field[j][i]); |
else _printf(" _"); |
_printf("\n\n"); |
} |
_printf("\n\n"); |
} |
|
//----------------------- |
int notEndYet() |
{ |
int i,j; |
for(i=0; i<3; i++) |
for(j=0; j<4; j++) |
if(field[j][i] != 4*i+j+1) return 0; //go on play |
if(field[0][3] != 13) return 0; |
|
return 1; //victory! |
} |
|
//--------------- allows move the emply cell |
int move() |
{ |
|
unsigned short c; |
|
while(1) |
{ |
c = _getch(); |
switch(c) |
{ |
case 0x4d00: |
if(emptyCell_x==0) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x-1][emptyCell_y]; |
field[emptyCell_x-1][emptyCell_y] = 0; |
emptyCell_x--; |
return 1; |
} |
case 0x5000: |
if(emptyCell_y==0) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x][emptyCell_y-1]; |
field[emptyCell_x][emptyCell_y-1] = 0; |
emptyCell_y--; |
return 2; |
} |
case 0x4b00: |
if(emptyCell_x==3) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x+1][emptyCell_y]; |
field[emptyCell_x+1][emptyCell_y] = 0; |
emptyCell_x++; |
return 3; |
} |
case 0x4800: |
if(emptyCell_y==3) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x][emptyCell_y+1]; |
field[emptyCell_x][emptyCell_y+1] = 0; |
emptyCell_y++; |
return 4; |
} |
case 0x011b: __exit(1); |
default: MENTION |
} |
} |
} |
|
//----------------- main function |
void kol_main() |
{ |
|
int i; |
kol_struct_import *imp; |
|
imp = kol_cofflib_load(CONSOLE); |
if (imp == NULL) |
kol_exit(); |
|
con_init = ( _stdcall void (*)(unsigned, unsigned, unsigned, unsigned, const char*)) |
kol_cofflib_procload (imp, "con_init"); |
if (con_init == NULL) |
kol_exit(); |
|
_printf = ( _cdecl void (*)(const char*,...)) |
kol_cofflib_procload (imp, "con_printf"); |
if (_printf == NULL) |
kol_exit(); |
|
__exit = ( _stdcall void (*)(char)) |
kol_cofflib_procload (imp, "con_exit"); |
|
if (__exit == NULL) |
kol_exit(); |
|
|
_getch = ( _stdcall int (*)(void)) |
kol_cofflib_procload (imp, "con_getch2"); |
|
if (_getch == NULL) |
kol_exit(); |
|
con_init(-1, -1, -1, -1, "Console15 by O.Bogomaz"); |
|
field = (int**)malloc(4 * sizeof(int*)); |
|
for( i=0; i<4; i++) |
field[i] = (int*)malloc(4 * sizeof(int)); |
|
do |
init(); |
while(notEndYet()); |
|
MENTION |
|
printField(); |
|
while(!notEndYet()) |
{ |
move(); |
printField(); |
} |
|
_printf("\nYou win!\n"); |
__exit(0); |
} |