⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 billard.c

📁 这是一个相当棒的Linux下的台球游戏
💻 C
📖 第 1 页 / 共 4 页
字号:
    walls->border[31].pnr = 3;    walls->border[31].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[31].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[31].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[31].n  = vec_xyz( 0.0, 0.0, 1.0 );#undef TABLE_W2#undef TABLE_L2    walls->border[30].mu          = 0.2;    walls->border[30].loss0       = 0.6;    walls->border[30].loss_max    = 0.99;    walls->border[30].loss_wspeed = 1.5;    walls->border[31].mu          = 0.2;    walls->border[31].loss0       = 0.6;    walls->border[31].loss_max    = 0.99;    walls->border[31].loss_wspeed = 1.5;#else    /* borders */    walls->nr=4;    walls->border = billard_malloc(sizeof(BorderType)*walls->nr);    walls->border[0].r = vec_xyz( +TABLE_W/2.0, 0.0, 0.0 );    walls->border[0].n = vec_xyz( -1.0, 0.0, 0.0 );    walls->border[1].r = vec_xyz( -TABLE_W/2.0, 0.0, 0.0 );    walls->border[1].n = vec_xyz( +1.0, 0.0, 0.0 );    walls->border[2].r = vec_xyz( 0.0, +TABLE_L/2.0, 0.0 );    walls->border[2].n = vec_xyz( 0.0, -1.0, 0.0 );    walls->border[3].r = vec_xyz( 0.0, -TABLE_L/2.0, 0.0 );    walls->border[3].n = vec_xyz( 0.0, +1.0, 0.0 );#endif    /* holes */    walls->holenr = 6;    if( walls->hole != NULL ) billard_free( walls->hole );    walls->hole = billard_malloc(sizeof(HoleType)*walls->holenr);    /* middle right */    walls->hole[0].aim = vec_xyz( +TABLE_W/2.0-HOLE2_AIMOFFS, 0.0, 0.0 );    walls->hole[0].pos = vec_xyz( +TABLE_W/2.0+HOLE2_XYOFFS, 0.0, 0.0 );    walls->hole[0].r   = HOLE2_R;    /* middle left */    walls->hole[1].aim = vec_xyz( -TABLE_W/2.0+HOLE2_AIMOFFS, 0.0, 0.0 );    walls->hole[1].pos = vec_xyz( -TABLE_W/2.0-HOLE2_XYOFFS, 0.0, 0.0 );    walls->hole[1].r   = HOLE2_R;    /* upper right */    walls->hole[2].aim = vec_xyz( +TABLE_W/2.0-HOLE1_AIMOFFS, +TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 );    walls->hole[2].pos = vec_xyz( +TABLE_W/2.0+HOLE1_XYOFFS, +TABLE_L/2.0+HOLE1_XYOFFS, 0.0 );    walls->hole[2].r   = HOLE1_R;    /* upper left */    walls->hole[3].aim = vec_xyz( -TABLE_W/2.0+HOLE1_AIMOFFS, +TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 );    walls->hole[3].pos = vec_xyz( -TABLE_W/2.0-HOLE1_XYOFFS, +TABLE_L/2.0+HOLE1_XYOFFS, 0.0 );    walls->hole[3].r   = HOLE1_R;    /* lower left */    walls->hole[4].aim = vec_xyz( -TABLE_W/2.0+HOLE1_AIMOFFS, -TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 );    walls->hole[4].pos = vec_xyz( -TABLE_W/2.0-HOLE1_XYOFFS, -TABLE_L/2.0-HOLE1_XYOFFS, 0.0 );    walls->hole[4].r   = HOLE1_R;    /* lower right */    walls->hole[5].aim = vec_xyz( +TABLE_W/2.0-HOLE1_AIMOFFS, -TABLE_L/2.0+HOLE1_AIMOFFS, 0.0 );    walls->hole[5].pos = vec_xyz( +TABLE_W/2.0+HOLE1_XYOFFS, -TABLE_L/2.0-HOLE1_XYOFFS, 0.0 );    walls->hole[5].r   = HOLE1_R;}void create_0hole_walls( BordersType * walls ){    int i;    /* borders */    walls->nr=6;    if( walls->border != NULL ) billard_free( walls->border );    walls->border = billard_malloc( sizeof(BorderType)*walls->nr );    /* bonds *//*    walls->border[0].pnr = 3;    walls->border[0].r1 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0 );    walls->border[0].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, 0.0 );    walls->border[0].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, BALL_D/2.0 );    walls->border[0].n  = vec_xyz( -1.0, 0.0, 0.0 );    walls->border[1].pnr = 3;    walls->border[1].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, BALL_D/2.0 );    walls->border[1].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, 0.0 );    walls->border[1].r3 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0 );    walls->border[1].n  = vec_xyz( +1.0, 0.0, 0.0 );    walls->border[2].pnr = 3;    walls->border[2].r1 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0 );    walls->border[2].r2 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, 0.0 );    walls->border[2].r3 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, BALL_D/2.0 );    walls->border[2].n  = vec_xyz( 0.0, -1.0, 0.0 );    walls->border[3].pnr = 3;    walls->border[3].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0 );    walls->border[3].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, 0.0 );    walls->border[3].r3 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, BALL_D/2.0 );    walls->border[3].n  = vec_xyz( 0.0, +1.0, 0.0 );*/    walls->border[0].pnr = 2;    walls->border[0].r1 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[0].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[1].pnr = 2;    walls->border[1].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[1].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[2].pnr = 2;    walls->border[2].r1 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[2].r2 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[3].pnr = 2;    walls->border[3].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    walls->border[3].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, options_jump_shots ? 0.14*BALL_D : 0.0 );    for(i=0;i<walls->nr;i++){        walls->border[i].mu          = 0.12;        walls->border[i].loss0       = 0.2;        walls->border[i].loss_max    = 0.5;        walls->border[i].loss_wspeed = 4.0;  /* [m/s] */    }    /* table surface */    walls->border[4].pnr = 3;    walls->border[4].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[4].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[4].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[4].n  = vec_xyz( 0.0, 0.0, 1.0 );    walls->border[5].pnr = 3;    walls->border[5].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[5].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[5].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 );    walls->border[5].n  = vec_xyz( 0.0, 0.0, 1.0 );    walls->border[4].mu          = 0.2;    walls->border[4].loss0       = 0.6;    walls->border[4].loss_max    = 0.9;    walls->border[4].loss_wspeed = 2.0;    walls->border[5].mu          = 0.2;    walls->border[5].loss0       = 0.6;    walls->border[5].loss_max    = 0.9;    walls->border[5].loss_wspeed = 2.0;    /* no holes */    walls->holenr = 0;    if( walls->hole != NULL ) billard_free( walls->hole );    walls->hole = billard_malloc(sizeof(HoleType)*walls->holenr);}void create_8ball_scene( BallsType * balls ){    int i;    myvec dball1, dball2, vdummy;//    double poserr=0.002;    double poserr=0.007;    balls->gametype=GAME_8BALL;    /* balls */    balls->nr=16;    if( balls->ball != NULL ) billard_free( balls->ball );    balls->ball = billard_malloc(sizeof(BallType)*balls->nr);    place8ballnrs(balls);    for(i=0;i<balls->nr;i++){        balls->ball[i].m=BALL_M;        /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */        balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/;        balls->ball[i].d=BALL_D;        balls->ball[i].v=vec_xyz(0.0,0.0,0.0);        balls->ball[i].w=vec_xyz(0.0,0.0,0.0);        balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand()));        vdummy=vec_xyz(rand(),rand(),rand());        balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0])));        balls->ball[i].b[2]=vec_cross(balls->ball[i].b[0],balls->ball[i].b[1]);        balls->ball[i].in_game=1;        balls->ball[i].in_hole=0;    }    dball1=vec_scale( vec_xyz(-0.5, 0.5*sqrt(3.0), 0.0), (1.0+2.0*poserr)*BALL_D );    dball2=vec_scale( vec_xyz( 1.0,           0.0, 0.0), (1.0+2.0*poserr)*BALL_D );    /* white ball */    balls->ball[0].r = vec_xyz(0.0,-TABLE_L/4.0,0.0);//    balls->ball[0].w = vec_xyz(-M_PI*5.0,0.0,-M_PI*5.0);    balls->ball[0].w = vec_xyz(0.0,0.0,0.0);    /* other balls */    balls->ball[ 1].r = vec_xyz(0.0,TABLE_L/4.0,0.0);    balls->ball[ 2].r = vec_add( balls->ball[ 1].r, dball1 );    balls->ball[ 3].r = vec_add( balls->ball[ 2].r, dball2 );    balls->ball[ 4].r = vec_add( balls->ball[ 2].r, dball1 );    balls->ball[ 5].r = vec_add( balls->ball[ 4].r, dball2 );    balls->ball[ 6].r = vec_add( balls->ball[ 5].r, dball2 );    balls->ball[ 7].r = vec_add( balls->ball[ 4].r, dball1 );    balls->ball[ 8].r = vec_add( balls->ball[ 7].r, dball2 );    balls->ball[ 9].r = vec_add( balls->ball[ 8].r, dball2 );    balls->ball[10].r = vec_add( balls->ball[ 9].r, dball2 );    balls->ball[11].r = vec_add( balls->ball[ 7].r, dball1 );    balls->ball[12].r = vec_add( balls->ball[11].r, dball2 );    balls->ball[13].r = vec_add( balls->ball[12].r, dball2 );    balls->ball[14].r = vec_add( balls->ball[13].r, dball2 );    balls->ball[15].r = vec_add( balls->ball[14].r, dball2 );//    balls->ball[15].r = vec_xyz( 0, -TABLE_L/4, 0 );    /* add randomness to init positions */    for( i=1 ; i<balls->nr ; i++ ){        double ang, ampl;        myvec verr;        ang  = (double)rand()/(double)RAND_MAX*2.0*M_PI;        DPRINTF("ball_placemet_err:   angle=%f    ",ang);        ampl = (double)rand()/(double)RAND_MAX*(poserr*0.95)*BALL_D;        DPRINTF("amplitude=%f\n",ampl);        verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), (poserr*0.95)*BALL_D );        balls->ball[i].r = vec_add( balls->ball[i].r, verr );    }    for( i=1 ; i<balls->nr ; i++ ){        int j;        for( j=i+1 ; j<balls->nr ; j++ ){            if (vec_abs(vec_diff(balls->ball[i].r,balls->ball[j].r))/BALL_D<1.5){                DPRINTF("BALLLDISR(%d,%d)=%f\n",balls->ball[i].nr,balls->ball[j].nr,vec_abs(vec_diff(balls->ball[i].r,balls->ball[j].r))/BALL_D);            }        }    }    for( i=0 ; i<balls->nr ; i++ ){        balls->ball[i].path=0;        balls->ball[i].pathcnt=0;        balls->ball[i].pathsize=0;    }//    balls->ball[0].v=vec_xyz(1.5,2.0,0.0);    balls->ball[0].v=vec_xyz(0.0,0.0,0.0);}void place9ballnrs( BallsType * balls ){    int i;    for(i=0;i<balls->nr;i++){        balls->ball[i].nr=i;    }}void create_9ball_scene( BallsType * balls ){    int i;    myvec dball1, dball2, vdummy;    balls->gametype=GAME_9BALL;    /* balls */    balls->nr=10;    if( balls->ball != NULL ) billard_free( balls->ball );    balls->ball = billard_malloc(sizeof(BallType)*balls->nr);    place9ballnrs(balls);    for(i=0;i<balls->nr;i++){        balls->ball[i].m=BALL_M;        /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */        balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/;        balls->ball[i].d=BALL_D;        balls->ball[i].v=vec_xyz(0.0,0.0,0.0);        balls->ball[i].w=vec_xyz(0.0,0.0,0.0);        balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand()));        vdummy=vec_xyz(rand(),rand(),rand());        balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0])));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -