#define BORDER 32 #define NUM_UNITS 64 #define MOVE_DISTANCE 100 #define BREAK_DISTANCE 6 class Unit { I64 num,x,y,player,link,bandwidth; U8 *img; Bool alive,king; } u[NUM_UNITS]; I64 cur_player,start_x,start_y,end_x,end_y; Bool show_start; $BG,2$ $SP,"<1>",1$ $SP,"<2>",2$ $SP,"<3>",3$ $SP,"<4>",4$ $BG$ U8 *pawn_imgs[2]={$IB,"<1>",1$,$IB,"<2>",2$}; U8 *king_imgs[2]={$IB,"<3>",3$,$IB,"<4>",4$}; I64 num_alive[2]; U0 DrawIt(CTask *task,CDC *dc) { I64 i; task->text_attr=GREEN<<4; for (i=0;icolor=YELLOW; dc->pen_width=u[i].bandwidth; GrLine3(dc,u[i].x,u[i].y,0,u[u[i].link].x,u[u[i].link].y,0); if (Blink(,tP(task))) { dc->color=BLUE; dc->pen_width=2; GrPlot3(dc,(u[i].x+u[u[i].link].x)>>1,(u[i].y+u[u[i].link].y)>>1,0); } } for (i=0;icolor=LTRED; GrLine(dc,start_x-4,start_y-4,start_x+4,start_y+4); GrLine(dc,start_x-4,start_y+4,start_x+4,start_y-4); GrLine(dc,start_x,start_y,end_x,end_y); } if (cur_player==0) dc->color=LTCYAN; else dc->color=LTPURPLE; GrPrintF(dc,0,0,"Player %d",cur_player+1); if ((num_alive[0]==1 || num_alive[1]==1) && Blink(4,tP(task))) { dc->color=BLACK; GrPrintF(dc,(task->win_pixel_width-FONT_WIDTH*9)>>1, (task->win_pixel_height-FONT_HEIGHT)>>1,"Game Over"); } } Unit *FindUnit(I64 x,I64 y,I64 player) { I64 i,dd,best_dd=MAX_I64; Unit *result=NULL; for (i=0;i>1; y2=(u[i].y+u[u[i].link].y)>>1; dd=SqrI64(x2-x1)+SqrI64(y2-y1); if (dd<=BREAK_DISTANCE*BREAK_DISTANCE) { u[i].alive=FALSE; Snd(500);Sleep(100);Snd(0);Sleep(25); num_alive[u[i].player]--; do { found=FALSE; for (j=0;jx; dy=y-tempu->y; if (!(d=Sqrt(dx*dx+dy*dy))) return; dx/=d; dy/=d; if (d>MOVE_DISTANCE) d=MOVE_DISTANCE; tempu->x+=d*dx; tempu->y+=d*dy; end_x=tempu->x; end_y=tempu->y; } U0 Init() { I64 i,j,dd,best_dd,best; best=0; best_dd=MAX_I64; for (i=0;iwin_inhibit=WIF_ALL-WIF_BORDER-WIF_MENU; DocCursor; DocClear; Fs->draw_it=&DrawIt; try { do { ch=0; Init; tempu=NULL; cur_player=0; show_start=FALSE; do { msg_code=GetMsg(&p1,&p2,1<1 && num_alive[1]>1) { tempu=FindUnit(p1,p2,cur_player); MemCpy(&saved_u,tempu,sizeof(Unit)); end_x=start_x=tempu->x; end_y=start_y=tempu->y; show_start=TRUE; } break; case MSG_IP_MOVE: if (tempu) { MemCpy(tempu,&saved_u,sizeof(Unit)); MoveUnit(tempu,p1,p2); } break; case MSG_IP_L_UP: MemCpy(tempu,&saved_u,sizeof(Unit)); MoveUnit(tempu,p1,p2); CheckForKills(tempu->x,tempu->y,cur_player); show_start=FALSE; tempu=NULL; cur_player=1-cur_player; break; } } while (ch!=CH_ESC && ch!=CH_NEW_LINE && ch!=CH_SHIFT_ESC); } while (ch!=CH_ESC && ch!=CH_SHIFT_ESC); } catch CatchAll; SettingsPop; MenuPop; } ChessNet; Púÿÿÿúÿÿÿüÿÿÿüÿÿÿ þÿÿÿþÿÿÿþÿÿÿþÿÿÿPúÿÿÿúÿÿÿüÿÿÿüÿÿÿ þÿÿÿþÿÿÿþÿÿÿþÿÿÿPúÿÿÿúÿÿÿüÿÿÿüÿÿÿ üÿÿÿüÿÿÿPúÿÿÿúÿÿÿüÿÿÿüÿÿÿ üÿÿÿüÿÿÿ