335 lines
6.4 KiB
C
335 lines
6.4 KiB
C
|
|
||
|
#include "all.h"
|
||
|
|
||
|
void init_board()
|
||
|
{
|
||
|
int i, x, y, z;
|
||
|
int x1, y1;
|
||
|
|
||
|
for (x = 0; x < 8; x++)
|
||
|
for (y = 0; y < 8; y++)
|
||
|
for (z = 0; z < 4; z++)
|
||
|
board[x][y][z] = 0;
|
||
|
|
||
|
for (i = 0; i < 4; i++)
|
||
|
board[rand()%8][rand()%8][LAY_HIDDEN] = 1;
|
||
|
|
||
|
foxN = 0;
|
||
|
for (x = 0; x < 8; x++)
|
||
|
for (y = 0; y < 8; y++)
|
||
|
if (board[x][y][LAY_HIDDEN] == 1)
|
||
|
foxN++;
|
||
|
|
||
|
if (foxN < 4) // if some foxes are in one hole
|
||
|
{
|
||
|
init_board();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// count of visible foxes
|
||
|
for (x = 0; x < 8; x++)
|
||
|
for (y = 0; y < 8; y++)
|
||
|
{
|
||
|
|
||
|
for (x1 = 0; x1 < 8; x1++) // horizontal
|
||
|
if (board[x1][y][LAY_HIDDEN] == 1)
|
||
|
board[x][y][LAY_NUM]++;
|
||
|
|
||
|
|
||
|
for (y1 = 0; y1 < 8; y1++) // vertical
|
||
|
if (board[x][y1][LAY_HIDDEN] == 1)
|
||
|
board[x][y][LAY_NUM]++;
|
||
|
|
||
|
|
||
|
if (x-y>0) // north-west to south-east
|
||
|
x1 = x-y;
|
||
|
else
|
||
|
x1 = 0;
|
||
|
|
||
|
if (y-x>0)
|
||
|
y1 = y-x;
|
||
|
else
|
||
|
y1 = 0;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (board[x1][y1][LAY_HIDDEN] == 1)
|
||
|
board[x][y][LAY_NUM]++;
|
||
|
x1++;
|
||
|
y1++;
|
||
|
} while ((x1<8)&&(y1<8));
|
||
|
|
||
|
|
||
|
if (x+y-7>0) // south-west to north-east
|
||
|
x1 = x+y-7;
|
||
|
else
|
||
|
x1 = 0;
|
||
|
|
||
|
if (x+y<8)
|
||
|
y1 = x+y;
|
||
|
else
|
||
|
y1 = 7;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (board[x1][y1][LAY_HIDDEN] == 1)
|
||
|
board[x][y][LAY_NUM]++;
|
||
|
x1++;
|
||
|
y1--;
|
||
|
} while ((x1<8)&&(y1>-1));
|
||
|
|
||
|
|
||
|
if (board[x][y][LAY_HIDDEN] == 1)
|
||
|
board[x][y][LAY_NUM] -= 3;
|
||
|
|
||
|
}
|
||
|
|
||
|
foxLeft = foxN;
|
||
|
moves = 0;
|
||
|
result = 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
void init_grid_sizes()
|
||
|
{
|
||
|
size = 20;
|
||
|
x_start = 5;
|
||
|
y_start = 30;
|
||
|
window_width = 2*x_start + 8*size + 9;
|
||
|
window_height = y_start + x_start + 8*size + kol_skin_height() + 9 + 14;
|
||
|
}
|
||
|
|
||
|
void wnd_draw()
|
||
|
{
|
||
|
|
||
|
int i;
|
||
|
int x, y;
|
||
|
int x1, y1;
|
||
|
char tmp[64];
|
||
|
char tmp2[64];
|
||
|
|
||
|
kol_paint_start();
|
||
|
|
||
|
kol_wnd_define(100, 100, window_width, window_height, 0x34ddddff, 0x34ddddff, "FoxHunt v0.2 by Albom");
|
||
|
|
||
|
kol_btn_define(x_start, x_start, 40, 16, 2, 0xccccee);
|
||
|
kol_paint_string(x_start+20-12, x_start+5, "New", 0x902222ff);
|
||
|
|
||
|
strcpy(tmp, "F:");
|
||
|
itoa(foxLeft, tmp2);
|
||
|
strcat(tmp, tmp2);
|
||
|
strcat(tmp, "/4");
|
||
|
kol_paint_string(x_start+55, x_start+5, tmp, 0x902222ff);
|
||
|
|
||
|
strcpy(tmp, "M:");
|
||
|
itoa(moves, tmp2);
|
||
|
strcat(tmp, tmp2);
|
||
|
kol_paint_string(x_start+110, x_start+5, tmp, 0x902222ff);
|
||
|
|
||
|
for (i = 0; i <= 8; i++)
|
||
|
{
|
||
|
kol_paint_line(x_start+i*size, y_start, x_start+i*size, y_start+8*size, 0x33); // vertical
|
||
|
kol_paint_line(x_start, y_start+i*size, x_start+8*size, y_start+i*size, 0x33); // horizontal
|
||
|
}
|
||
|
|
||
|
// foxes found by user
|
||
|
for (x1 = 0; x1 < 8; x1++)
|
||
|
for (y1 = 0; y1 < 8; y1++)
|
||
|
{
|
||
|
if (board[x1][y1][LAY_FOUND]==1)
|
||
|
{
|
||
|
grid_to_pos(x1, y1, &x, &y);
|
||
|
kol_paint_string(x+size/2-4, y+size/2-4, "F", 0x90227722);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// opened cells
|
||
|
for (x1 = 0; x1 < 8; x1++)
|
||
|
for (y1 = 0; y1 < 8; y1++)
|
||
|
{
|
||
|
if (board[x1][y1][LAY_OPENED] == 1)
|
||
|
{
|
||
|
itoa(board[x1][y1][LAY_NUM], tmp);
|
||
|
grid_to_pos(x1, y1, &x, &y);
|
||
|
kol_paint_string(x+size/2-4, y+size/2-4, tmp, 0x902222ff);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (result > 0)
|
||
|
{
|
||
|
char victory[]={"V I C T O R Y !"};
|
||
|
kol_paint_string(window_width/2-7*8+4, window_height-14-kol_skin_height()-4, victory, 0x90227722);
|
||
|
kol_paint_string(window_width/2-7*8+4-1, window_height-14-kol_skin_height()-4, victory, 0x90227722);
|
||
|
kol_paint_string(window_width/2-7*8+4+1, window_height-14-kol_skin_height()-4, victory, 0x90227722);
|
||
|
}
|
||
|
|
||
|
if (result < 0)
|
||
|
{
|
||
|
|
||
|
// draw real position of foxes
|
||
|
for (x1 = 0; x1 < 8; x1++)
|
||
|
for (y1 = 0; y1 < 8; y1++)
|
||
|
{
|
||
|
if (board[x1][y1][LAY_HIDDEN]==1)
|
||
|
{
|
||
|
grid_to_pos(x1, y1, &x, &y);
|
||
|
kol_paint_string(x+size/2-2, y+size/2-2, "F", 0x90ff2222);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char game_over[]={"G A M E O V E R !"};
|
||
|
kol_paint_string(window_width/2-9*8+4, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
|
||
|
kol_paint_string(window_width/2-9*8+4-1, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
|
||
|
kol_paint_string(window_width/2-9*8+4+1, window_height-14-kol_skin_height()-4, game_over, 0x90ff2222);
|
||
|
}
|
||
|
|
||
|
kol_paint_end();
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
int check()
|
||
|
{
|
||
|
int x, y;
|
||
|
for (x = 0; x < 8; x++)
|
||
|
for (y = 0; y < 8; y++)
|
||
|
if (board[x][y][LAY_HIDDEN] != board[x][y][LAY_FOUND])
|
||
|
return -1;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
void grid_to_pos(unsigned gx, unsigned gy, unsigned* x, unsigned* y)
|
||
|
{
|
||
|
*x = gx*size + x_start;
|
||
|
*y = gy*size + y_start;
|
||
|
}
|
||
|
|
||
|
|
||
|
int pos_to_grid(unsigned x, unsigned y, int* gx, int* gy)
|
||
|
{
|
||
|
|
||
|
*gx = (x - x_start)/size;
|
||
|
*gy = (y - y_start)/size;
|
||
|
|
||
|
if ((*gx < 0) || (*gx>7) || (*gy < 0) || (*gy>7) )
|
||
|
return -1;
|
||
|
else
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// ===========================================================
|
||
|
|
||
|
void kol_main()
|
||
|
{
|
||
|
|
||
|
unsigned event;
|
||
|
unsigned key;
|
||
|
unsigned btn;
|
||
|
unsigned pos, x, y;
|
||
|
int gx, gy;
|
||
|
|
||
|
|
||
|
srand(kol_system_time_get());
|
||
|
|
||
|
kol_event_mask( 0xC0000027 ); // enable using of mouse
|
||
|
init_grid_sizes();
|
||
|
init_board();
|
||
|
wnd_draw();
|
||
|
|
||
|
|
||
|
for(;;)
|
||
|
{
|
||
|
event = kol_event_wait();
|
||
|
|
||
|
switch (event)
|
||
|
{
|
||
|
case 1:
|
||
|
wnd_draw();
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
key = (kol_key_get() & 0xff00)>>8;
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
switch ((kol_btn_get() & 0xff00)>>8)
|
||
|
{
|
||
|
case 1: // close button
|
||
|
kol_exit();
|
||
|
case 2: // 'new' button
|
||
|
init_board();
|
||
|
wnd_draw();
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 6:
|
||
|
btn = kol_mouse_btn(); // read mouse button
|
||
|
pos = kol_mouse_posw(); // read mouse position
|
||
|
x = pos / 65536;
|
||
|
y = pos % 65536;
|
||
|
if (x > window_width)
|
||
|
x=0;
|
||
|
if (y > window_height)
|
||
|
y=0;
|
||
|
|
||
|
if ( pos_to_grid(x, y, &gx, &gy) > 0 )
|
||
|
{
|
||
|
switch (btn & 3)
|
||
|
{
|
||
|
case 1: // left button
|
||
|
if (result == 0) // are we in game?
|
||
|
{
|
||
|
if (board[gx][gy][LAY_FOUND] == 0)
|
||
|
{
|
||
|
if ( board[gx][gy][LAY_OPENED] == 0 )
|
||
|
board[gx][gy][LAY_OPENED] = 1;
|
||
|
else
|
||
|
board[gx][gy][LAY_OPENED] = 0;
|
||
|
moves++;
|
||
|
wnd_draw();
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 2: // right button
|
||
|
if (result == 0) // are we in game?
|
||
|
{
|
||
|
if (board[gx][gy][LAY_FOUND] == 0)
|
||
|
{
|
||
|
if ( board[gx][gy][LAY_OPENED] == 0 )
|
||
|
{
|
||
|
board[gx][gy][LAY_FOUND] = 1;
|
||
|
foxLeft--;
|
||
|
moves++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
board[gx][gy][LAY_FOUND] = 0;
|
||
|
foxLeft++;
|
||
|
moves++;
|
||
|
}
|
||
|
|
||
|
if (foxLeft == 0) // all 4 foxes are marked
|
||
|
result = check();
|
||
|
|
||
|
wnd_draw();
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
kol_exit();
|
||
|
}
|
||
|
|
||
|
/// ===========================================================
|