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

📄 billard.c

📁 这是一个相当棒的Linux下的台球游戏
💻 C
📖 第 1 页 / 共 4 页
字号:
        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*1.01, 0.5*sqrt(3.0)*1.01,0.0),BALL_D);    dball2=vec_scale(vec_xyz(+0.5*1.01, 0.5*sqrt(3.0)*1.01,0.0),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, vec_scale(dball2,2.0) );    balls->ball[ 3].r = vec_add( balls->ball[2].r, vec_scale(dball1,2.0) );    balls->ball[ 4].r = vec_add( balls->ball[1].r, vec_scale(dball1,2.0) );    balls->ball[ 5].r = vec_add( balls->ball[1].r, dball1 );    balls->ball[ 6].r = vec_add( balls->ball[1].r, dball2 );    balls->ball[ 7].r = vec_add( balls->ball[2].r, dball1 );    balls->ball[ 8].r = vec_add( balls->ball[4].r, dball2 );    balls->ball[ 9].r = vec_add( balls->ball[1].r, vec_add(dball1,dball2) );    /* add randomness to init positions */    for( i=1 ; i<balls->nr ; i++ ){        double ang, ampl;        myvec verr;        ang  = rand();        ang  = (double)rand()/(double)RAND_MAX*2.0*M_PI;        ampl = (double)rand()/(double)RAND_MAX*0.0049*BALL_D;        verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), ampl );        balls->ball[i].r = vec_add( balls->ball[i].r, verr );    }    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 placecarambolballnrs( BallsType * balls ){    int i;    for(i=0;i<balls->nr;i++){        balls->ball[i].nr=i;    }}void create_carambol_scene( BallsType * balls ){    int i;    myvec vdummy;    balls->gametype=GAME_CARAMBOL;    /* balls */    balls->nr=3;    if( balls->ball != NULL ) billard_free( balls->ball );    balls->ball = billard_malloc(sizeof(BallType)*balls->nr);    placecarambolballnrs(balls);    for(i=0;i<balls->nr;i++){        balls->ball[i].nr=i;    }    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;    }    /* white ball */    balls->ball[0].r = vec_xyz( TABLE_W/4.0, -TABLE_L/4.0, 0.0 );    balls->ball[1].r = vec_xyz(         0.0, -TABLE_L/4.0, 0.0 );    balls->ball[2].r = vec_xyz(         0.0, +TABLE_L/4.0, 0.0 );    for( i=0 ; i<balls->nr ; i++ ){        balls->ball[i].path=0;        balls->ball[i].pathcnt=0;        balls->ball[i].pathsize=0;    }}void placesnookerballnrs( BallsType * balls ){    int i;/*    for(i=0;i<8;i++){        balls->ball[i].nr=i;    }*/    for(i=0;i<balls->nr;i++){        balls->ball[i].nr=i;    }}int try_snooker_spot(BallsType *balls,struct Vect spot){   int i,available=1;   for(i=0;i<22;i++)   {      if(balls->ball[i].in_game && vec_abs(vec_diff(spot,balls->ball[i].r)) < (balls->ball[i].d) + 0.001)      {         available=0;      }   }   return available;}#define TABLE_SCALE (TABLE_L/(3.571042))void spot_snooker_ball(BallsType *balls,int nr){    int i,found=0;    struct Vect spots[8];    spots[0]=vec_xyz(0.1,-TABLE_L/2+TABLE_SCALE*0.737,0.0);/*white*/    spots[2]=vec_xyz(TABLE_SCALE*0.292,-TABLE_L/2+TABLE_SCALE*0.737,0.0);/*yellow*/    spots[3]=vec_xyz(-TABLE_SCALE*0.292,-TABLE_L/2+TABLE_SCALE*0.737,0.0);/*green*/    spots[4]=vec_xyz(0.0,-TABLE_L/2+TABLE_SCALE*0.737,0.0);/*brown*/    spots[5]=vec_xyz(0.0,0.0,0.0);/*blue*/    spots[6]=vec_xyz(0.0,TABLE_L/4.0,0.0);/*pink*/    spots[7]=vec_xyz(0.0,TABLE_L/2-TABLE_SCALE*0.324,0.0);/*black*/    balls->ball[nr].in_game=0;    if(try_snooker_spot(balls,spots[nr]))    {       balls->ball[nr].r=spots[nr];       found=1;    }    else    {       i=7;       while(i>=2 && !found)       {          if(try_snooker_spot(balls,spots[i]))          {             balls->ball[nr].r=spots[i];             found=1;          }          i--;       }    }    if(!found)    {        struct Vect try=spots[nr];        while(!try_snooker_spot(balls,try))        {           try.y-=0.001;        }        balls->ball[nr].r=try;    }    balls->ball[nr].in_game=1;    balls->ball[nr].in_hole=0;    balls->ball[nr].v=vec_xyz(0.0,0.0,0.0);    balls->ball[nr].w=vec_xyz(0.0,0.0,0.0);}void create_snooker_scene( BallsType * balls ){    int i;    myvec dball1, dball2, vdummy;    balls->gametype=GAME_SNOOKER;    /* balls */    balls->nr=22;    if( balls->ball != NULL ) billard_free( balls->ball );    balls->ball = billard_malloc(sizeof(BallType)*balls->nr);    placesnookerballnrs(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].r = vec_xyz(TABLE_L*3,TABLE_L*3,0.0); /* get balls out of the way */        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*1.01, 0.5*sqrt(3.0)*1.01,0.0),BALL_D);    dball2=vec_scale(vec_xyz( 1.01,      0.0,     0.0),BALL_D);    /* red balls */    balls->ball[ 1].r = vec_xyz(0.0,TABLE_L/4.0+1.1*BALL_D,0.0);    balls->ball[ 8].r = vec_add( balls->ball[ 1].r, dball1 );    balls->ball[ 9].r = vec_add( balls->ball[ 8].r, dball2 );    balls->ball[10].r = vec_add( balls->ball[ 8].r, dball1 );    balls->ball[11].r = vec_add( balls->ball[10].r, dball2 );    balls->ball[12].r = vec_add( balls->ball[11].r, dball2 );    balls->ball[13].r = vec_add( balls->ball[10].r, dball1 );    balls->ball[14].r = vec_add( balls->ball[13].r, dball2 );    balls->ball[15].r = vec_add( balls->ball[14].r, dball2 );    balls->ball[16].r = vec_add( balls->ball[15].r, dball2 );    balls->ball[17].r = vec_add( balls->ball[13].r, dball1 );    balls->ball[18].r = vec_add( balls->ball[17].r, dball2 );    balls->ball[19].r = vec_add( balls->ball[18].r, dball2 );    balls->ball[20].r = vec_add( balls->ball[19].r, dball2 );    balls->ball[21].r = vec_add( balls->ball[20].r, dball2 );    /* color balls */    for(i=7;i>=2;i--)    {        spot_snooker_ball(balls,i);    }    /* white ball */    spot_snooker_ball(balls,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;        ampl = (double)rand()/(double)RAND_MAX*0.0049*BALL_D;        verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), ampl );        balls->ball[i].r = vec_add( balls->ball[i].r, verr );    }    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);}int balls_in_game( BallsType * balls, int full_half )/* without white, 8 is neither full nor half */{    int i;    int nr=0;    for(i=1;i<balls->nr;i++) {        if( ( ( full_half==BALL_FULL && balls->ball[i].nr<8 ) ||              ( full_half==BALL_HALF && balls->ball[i].nr>8 ) ||              ( full_half==BALL_ANY ) ) &&            balls->ball[i].in_game          ) nr++;    }    return nr;}

⌨️ 快捷键说明

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