forked from KolibriOS/kolibrios
193 lines
3.6 KiB
C
193 lines
3.6 KiB
C
|
#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);
|
||
|
}
|