kolibrios-fun/programs/games/console15/c_code.c

193 lines
3.6 KiB
C
Raw Normal View History

#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);
}