|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 10480 (0x28f0) Types: TextFile Names: »pyramid.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/Sun/Pyramid/pyramid.c«
#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 notdef 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); }