home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume3
/
pyramid
/
part04
/
pyramid.c
next >
Wrap
C/C++ Source or Header
|
1987-12-19
|
10KB
|
363 lines
#include "pyramid.h"
/* Compilation parameters: */
#define CELL_WIDTH 48
#define BORDER 40
#define TOTAL_WIDTH BOARDSIZE*CELL_WIDTH+BORDER*2
/* Constants, typedefs, externals, globals, statics, macros. */
static short icon_image[] = { /* Main icon. */
/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
*/
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0001,0xC000,0x0000,0x0000,0x0007,0xF000,0x0000,
0x03E0,0x0007,0xF000,0x0000,0x07F0,0x000F,0xF800,0x0000,
0x0E38,0x000F,0xF800,0x0000,0x1C1C,0x000F,0xF800,0x0000,
0x180C,0x0007,0xF000,0x0000,0x180C,0x0007,0xF000,0x0000,
0x000C,0x0001,0xC000,0x0000,0x001C,0x0000,0x0000,0x0000,
0x0038,0x0000,0x0000,0x0000,0x00F0,0x0000,0x0000,0x0000,
0x01E0,0x01C0,0x01C0,0x0000,0x01C0,0x07F0,0x07F0,0x0000,
0x01C0,0x07F0,0x07F0,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
0x01C0,0x0FF8,0x0FF8,0x0000,0x01C0,0x0FF8,0x0FF8,0x0000,
0x0000,0x07F0,0x07F0,0x0000,0x0000,0x07F0,0x07F0,0x0000,
0x01C0,0x01C0,0x01C0,0x0000,0x03E0,0x0000,0x0000,0x0000,
0x03E0,0x0000,0x0000,0x0000,0x03E0,0x0000,0x0000,0x0000,
0x01C1,0xC000,0x0001,0xC000,0x0007,0xF000,0x0007,0xF000,
0x0007,0xF000,0x0007,0xF000,0x000F,0xF800,0x000F,0xF800,
0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,0x000F,0xF800,
0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,0x0007,0xF000,
0x0001,0xC000,0x0001,0xC000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x01C0,0x0000,0x01C0,0x01C0,0x07F0,0x0000,0x07F0,0x07F0,
0x07F0,0x0000,0x07F0,0x07F0,0x0FF8,0x0000,0x0FF8,0x0FF8,
0x0FF8,0x0000,0x0FF8,0x0FF8,0x0FF8,0x0000,0x0FF8,0x0FF8,
0x07F0,0x0000,0x07F0,0x07F0,0x07F0,0x0000,0x07F0,0x07F0,
0x01C0,0x0000,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0001,0xC001,0xC001,0xC000,0x0007,0xF007,0xF007,0xF000,
0x0007,0xF007,0xF007,0xF000,0x000F,0xF80F,0xF80F,0xF800,
0x000F,0xF80F,0xF80F,0xF800,0x000F,0xF80F,0xF80F,0xF800,
0x0007,0xF007,0xF007,0xF000,0x0007,0xF007,0xF007,0xF000,
0x0001,0xC001,0xC001,0xC000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
} ;
DEFINE_ICON_FROM_IMAGE(pyramid_icon,icon_image) ;
static short piece_image[] = {
/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
*/
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x0000,0x0000,
0x0000,0x7FFF,0x0000,0x0000,0x0001,0xDDDD,0xC000,0x0000,
0x0003,0xBBBB,0xB000,0x0000,0x000F,0xFFFF,0xF800,0x0000,
0x003F,0xFFFF,0xFE00,0x0000,0x005F,0xFDDF,0xFD00,0x0000,
0x00BF,0xFFBF,0xFF80,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
0x01F7,0x7777,0x7FC0,0x0000,0x01FF,0xFFFF,0xFFC0,0x0000,
0x03FF,0xFFFF,0xFFA0,0x0000,0x07FE,0xEFEE,0xEFF0,0x0000,
0x07F7,0x7FFF,0x7FF0,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFF,0xEFF8,0x0000,
0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DFF,0xDDDD,0xFFDC,0x0000,
0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFF,0xFFFF,0xEFFC,0x0000,
0x1FF7,0xFFFF,0xFFFC,0x0000,0x1DDF,0xDDDD,0xFDDC,0x0000,
0x1BBF,0xBBBB,0xBFB8,0x0000,0x1FFE,0xFFFF,0xEFFC,0x0000,
0x1FF7,0xFFFF,0xFFFC,0x0000,0x0DFF,0xDDDD,0xFFD8,0x0000,
0x0BFF,0xBBBB,0xFFB8,0x0000,0x0FFE,0xFFFE,0xEFF8,0x0000,
0x07F7,0x7FFF,0x7FF0,0x0000,0x05FF,0xFDDF,0xFFD0,0x0000,
0x03FF,0xFFFF,0xFFA0,0x0000,0x03FE,0xEEEE,0xEFE0,0x0000,
0x01FF,0xFFFF,0xFFC0,0x0000,0x00FF,0xFFFF,0xFF80,0x0000,
0x00BF,0xFFBF,0xFF80,0x0000,0x007F,0xFFFF,0xFF00,0x0000,
0x003F,0xFFFF,0xFE00,0x0000,0x000D,0xDDDD,0xD800,0x0000,
0x0003,0xBBBB,0xB000,0x0000,0x0001,0xFFFF,0xC000,0x0000,
0x0000,0x7FFF,0x0000,0x0000,0x0000,0x0DD8,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
} ;
mpr_static(piece_pr,64,64,1,piece_image) ;
static Frame base_frame ; /* Assorted globals. */
static Panel panel ;
static Canvas canvas ;
static Panel_item new_game_but, quit_but, undo_but ;
Panel_item panel_mes ;
static Panel_item first_choice, difficulty_choice ;
static Cursor canvas_cursor ;
static Pixwin *canvas_pw ;
char board[8][5][5];
extern short table[32768];
static char line[40] ;
static void canvas_proc() ; /* Proc definitions. */
static void new_game_proc(), quit_proc(), undo_proc() ;
static void first_proc(), difficulty_proc() ;
static void init_panel() ;
static void canvas_init() ;
#define INIT_DEPTH 7
int depth,tdepth=11,first,tfirst=0,nl,eofg;
int x1,x2,y1,y2;
long seed;
main(argc,argv)
int argc ;
char *argv[] ;
{
(void) sprintf(line," Pyramid. V1.0") ;
base_frame = window_create(NULL, FRAME,
FRAME_ICON, &pyramid_icon,
FRAME_LABEL, line,
FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
WIN_ERROR_MSG, "Can't create window.",
FRAME_ARGS, argc,argv,
0) ;
panel = window_create(base_frame, PANEL,
WIN_WIDTH, TOTAL_WIDTH+1,
PANEL_LAYOUT, PANEL_HORIZONTAL,
0) ;
init_panel() ;
window_fit_height(panel) ;
canvas = window_create(base_frame, CANVAS,
WIN_X, 0,
WIN_BELOW, panel,
WIN_CONSUME_KBD_EVENT, WIN_NO_EVENTS,
WIN_EVENT_PROC, canvas_proc,
WIN_HEIGHT, TOTAL_WIDTH+1,
WIN_WIDTH, TOTAL_WIDTH+1,
WIN_IGNORE_PICK_EVENTS, KBD_REQUEST, WIN_ASCII_EVENTS, 0,
#ifdef 0
CANVAS_FAST_MONO, TRUE,
#endif
0) ;
window_fit(base_frame) ;
canvas_pw = (Pixwin *) window_get(canvas,CANVAS_PIXWIN) ;
canvas_cursor = window_get(canvas,WIN_CURSOR) ;
time(&seed);
srandom(seed);
initboard() ;
canvas_init() ;
window_main_loop(base_frame) ;
exit(0) ;
}
initboard() /* Initialise the pyramid board. */
{
int i,j ;
eofg=0;
x1=x2=y1=y2= -1;
FOR_BOARD(i,j) board[0][i][j] = BLACK ;
depth=tdepth,first=tfirst;nl=0;
if(first) move();
}
static void init_panel()
{
new_game_but = panel_create_item(panel,PANEL_BUTTON,
PANEL_NOTIFY_PROC,new_game_proc,
PANEL_LABEL_IMAGE,
panel_button_image(panel,"new game",8,(struct pixfont *) 0),
0) ;
quit_but = panel_create_item(panel,PANEL_BUTTON,
PANEL_NOTIFY_PROC,quit_proc,
PANEL_LABEL_IMAGE,
panel_button_image(panel,"quit",6,(struct pixfont *) 0),
0) ;
undo_but = panel_create_item(panel,PANEL_BUTTON,
PANEL_NOTIFY_PROC,undo_proc,
PANEL_LABEL_IMAGE,
panel_button_image(panel,"undo",6,(struct pixfont *) 0),
0) ;
first_choice = panel_create_item(panel,PANEL_CYCLE,
PANEL_NOTIFY_PROC,first_proc,
PANEL_LABEL_BOLD,TRUE,
PANEL_LABEL_STRING,"Start: ",
PANEL_VALUE,0,
PANEL_SHOW_MENU,TRUE,
PANEL_CHOICE_STRINGS,"You","Computer",0,
PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
0) ;
difficulty_choice = panel_create_item(panel,PANEL_CYCLE,
PANEL_NOTIFY_PROC,difficulty_proc,
PANEL_LABEL_BOLD,TRUE,
PANEL_LABEL_STRING,"Difficulty: ",
PANEL_VALUE,2,
PANEL_SHOW_MENU,TRUE,
PANEL_CHOICE_STRINGS,"1","2","3","4","5",0,
PANEL_DISPLAY_LEVEL,PANEL_CURRENT,
0) ;
panel_mes = panel_create_item(panel,PANEL_MESSAGE,
PANEL_LABEL_STRING,"To move, use your left mouse button",
0) ;
}
/*ARGSUSED*/
static void
quit_proc(item,event)
Panel_item item ;
Event *event ;
{
window_done(base_frame) ;
}
static void
undo_proc()
{
if(eofg)return;
if(nl==0) return;
nl--;canvas_init();
}
/*ARGSUSED*/
static void
difficulty_proc(item,value,event)
Panel_item item ;
int value ;
Event *event ;
{
tdepth = value*2 + INIT_DEPTH ;
}
/*ARGSUSED*/
static void
first_proc(item,value,event)
Panel_item item ;
int value ;
Event *event ;
{
tfirst = value ;
}
static void
canvas_init()
{
int i,j;
pw_writebackground(canvas_pw,0,0,TOTAL_WIDTH+1,TOTAL_WIDTH+1,RSRC) ;
FOR_BOARD(i,j) if(board[nl][i][j]>0)pw_write(canvas_pw,(int) ((j+2-i/2.0)*CELL_WIDTH+BORDER), i*CELL_WIDTH+BORDER,CELL_WIDTH,CELL_WIDTH,RSRC,&piece_pr,0,0);
FOR_BOARD(i,j) board[nl+1][i][j]=board[nl][i][j];
}
/*ARGSUSED*/
static void
canvas_proc(win,event,arg)
Canvas win ;
Event *event ;
caddr_t arg ;
{
int x,y,i ;
if(eofg)return;
y=(event_y(event)-BORDER)/CELL_WIDTH;
x=((event_x(event)-BORDER)/((float) CELL_WIDTH)-2+y/2.0);
switch (event_id(event))
{
case LOC_MOVE :
case LOC_DRAG :
case LOC_TRAJECTORY :
if(x1== -1&&y1== -1) break;
if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
if(legal(x,y)>0)
{x2=x;y2=y;pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);}
else x2=y2= -1;
break ;
case LOC_WINENTER :
case LOC_WINEXIT :
case LOC_RGNENTER :
case LOC_RGNEXIT :
case WIN_STOP :
break ;
case MS_LEFT :
cursor_set(canvas_cursor,CURSOR_SHOW_CURSOR,TRUE,0) ;
window_set(canvas,WIN_CURSOR,canvas_cursor,0) ;
if (event_is_down(event)) { if (legal(x,y)) x1=x;y1=y; }
else
{
if(x2>=0&&y2>=0) pw_vector(canvas_pw,PX(x1,y1),PY(y1),PX(x2,y2),PY(y2),RXOR,1);
if(!legal(x,y)){x1=x2=y1=y2= -1;break;}
nl++;
if(x1==x)
for(i=MIN(y,y1);i<=MAX(y,y1);i++)board[nl][i][x]=0;
else if(y1==y)
for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][y][i]=0;
else
for(i=MIN(x,x1);i<=MAX(x,x1);i++)board[nl][MIN(y,y1)+i-MIN(x,x1)][i]=0;
canvas_init();
x1=x2=y1=y2= -1;
sleep(2);
move();
canvas_init();
if(!eofg)panel_msg("It's your turn.") ;
}
break ;
}
}
static void
new_game_proc()
{
initboard() ;
canvas_init() ;
panel_msg("It's your turn.") ;
}
legal(x,y)
int x,y;
{ int i,test;
if(x1== -1 && y1== -1) return(board[nl][y][x]>0);
test=1;
if(x1==x)
for(i=MIN(y,y1);i<=MAX(y,y1);i++)test&=(board[nl][i][x]>0);
else if(y1==y)
for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][y][i]>0);
else if ((x1-x) != (y1-y)) test=0; else
for(i=MIN(x,x1);i<=MAX(x,x1);i++)test&=(board[nl][MIN(y,y1)+i-MIN(x,x1)][i]>0);
return(test);
}