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

📄 billmove.c

📁 这是一个相当棒的Linux下的台球游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
/* billmove.c****    physics of the billard system to calculate timestep**    Copyright (C) 2001  Florian Berger**    Email:  harpin_floh@yahoo.de,  florian.berger@jk.uni-linz.ac.at****    This program is free software; you can redistribute it and/or modify**    it under the terms of the GNU General Public License Version 2 as**    published by the Free Software Foundation;****    This program is distributed in the hope that it will be useful,**    but WITHOUT ANY WARRANTY; without even the implied warranty of**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the**    GNU General Public License for more details.****    You should have received a copy of the GNU General Public License**    along with this program; if not, write to the Free Software**    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***/#define SQRTM1 100000.0#include "options.h"#include "billmove.h"#include "math.h"#include "stdlib.h"#include "stdio.h"#include "string.h" /* memcpy */#define MAX_EVENT_NR 1000enum event_type {    BALL_out,    BALL_wall,    BALL_ball};struct BallEvent{    int     ballnr;    int     ballnr2;    VMvect  pos;    VMvect  pos2;    VMvect  v;    VMvect  v2;    VMvect  w;    VMvect  w2;    int     timestep_nr;    BMfloat timeoffs;    enum event_type event;};static struct{    int timestep_nr;    BMfloat duration;    BMfloat duration_last;    int out_half;    int out_full;    int out_white;    int out_black;    int eventnr;    struct BallEvent event[MAX_EVENT_NR];} move_log;void BM_reset_move_info(){    move_log.out_half=0;    move_log.out_full=0;    move_log.out_white=0;    move_log.out_black=0;    move_log.eventnr=0;    move_log.timestep_nr=0;    move_log.duration=0.0;    move_log.duration_last=0.0;}int BM_get_balls_out_half()  { return move_log.out_half; }int BM_get_balls_out_full()  { return move_log.out_full; }int BM_get_balls_out_total() { return move_log.out_full+move_log.out_half; }int BM_get_balls_out_all() { return move_log.out_full+move_log.out_half+move_log.out_white+move_log.out_black; }int BM_get_white_out() { return move_log.out_white; }int BM_get_ball_out(int nr) {    int i,ballout;    ballout=0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_out && move_log.event[i].ballnr==nr ){            ballout=1;        }    }    return ballout;}int BM_get_nth_ball_out(int n){    int i,ballout;    ballout=-1;    for(i=0;i<move_log.eventnr && n!=0;i++){        if( move_log.event[i].event==BALL_out ){            n--;            if( n==0 ) ballout=move_log.event[i].ballnr;        }    }    return ballout;}int BM_get_min_ball_out()  {    int i,minnr;    minnr=100;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_out && move_log.event[i].ballnr<minnr ){            minnr=move_log.event[i].ballnr;        }    }    return minnr;}int BM_get_1st_ball_hit(){    int i,hitball;    hitball=-1;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].ballnr!=0 ){                hitball=move_log.event[i].ballnr;            } else {                hitball=move_log.event[i].ballnr2;            }            break;        }    }    return hitball;}int BM_get_non_strafraum_wall_hit_before_1st_ball( int (* in_strafraum)(VMvect) ){    int i;    int rval=0;    for( i=0 ; i<move_log.eventnr && move_log.event[i].event!=BALL_ball ; i++ ){        if( move_log.event[i].event==BALL_wall ){            if( !in_strafraum(move_log.event[i].pos2) ){                rval=1;                break;            }        }    }    return rval;}int BM_get_nth_ball_hit(int n){    int i,j,hitball;    hitball=-1;    i=0;    for(j=0;j<(n-1);j++){        for(   ;i<move_log.eventnr;i++){            if( move_log.event[i].event==BALL_ball ){                if( move_log.event[i].ballnr==0 ||                    move_log.event[i].ballnr2==0 ) break;            }        }        i++;    }    for(   ;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].ballnr==0 ){                hitball=move_log.event[i].ballnr2;  break;            } else if( move_log.event[i].ballnr2==0 ){                hitball=move_log.event[i].ballnr;   break;            }        }    }    return hitball;}int BM_get_nth_ball_hit_by_ind(int ind, int n){    int i,j,hitball;    hitball=-1;    i=0;    for(j=0;j<(n-1);j++){        for(   ;i<move_log.eventnr;i++){            if( move_log.event[i].event==BALL_ball ){                if( move_log.event[i].ballnr==ind ||                    move_log.event[i].ballnr2==ind ) break;            }        }        i++;    }    for(   ;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].ballnr==ind ){                hitball=move_log.event[i].ballnr2;  break;            } else if( move_log.event[i].ballnr2==ind ){                hitball=move_log.event[i].ballnr;   break;            }        }    }    return hitball;}VMvect BM_get_1st_ball_hit_pos(){    int i;    VMvect hitpos;    hitpos=vec_xyz(100,100,100);    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].ballnr!=0 ){                hitpos=move_log.event[i].pos;            } else {                hitpos=move_log.event[i].pos2;            }            break;        }    }    return hitpos;}int BM_get_balls_hit()  {    int i,hits;    hits=0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].ballnr==0 || move_log.event[i].ballnr2==0 ){                hits++;            }        }    }    return hits;}int BM_get_balls_hit_last()  {    int i,hits;    hits=0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                hits++;            }        }    }    return hits;}int BM_get_walls_hit_last()  {    int i,hits;    hits=0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_wall ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                hits++;            }        }    }    return hits;}double BM_get_balls_hit_strength_last()  {    int i;    double hitstrength=0.0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                hitstrength+=fabs(                                  vec_mul(                                          vec_unit(vec_diff(move_log.event[i].pos,move_log.event[i].pos2)),                                          vec_diff(move_log.event[i].v,move_log.event[i].v2)                                        )                                 );            }        }    }    return hitstrength;}void BM_get_balls_hit_strength_last_index(int index, double * strength, double * toffs){    int i;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_ball ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                index--;                if( !(index+1) ){                    *strength=fabs(                                   vec_mul(                                           vec_unit(vec_diff(move_log.event[i].pos,move_log.event[i].pos2)),                                           vec_diff(move_log.event[i].v,move_log.event[i].v2)                                          )                                  );//                    *strength *= *strength;                    *toffs=move_log.event[i].timeoffs;                    break;                }            }        }    }    if( i==move_log.eventnr ){ *toffs=0.0; *strength=0.0; }}double BM_get_walls_hit_strength_last()  {    int i;    double hitstrength=0.0;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_wall ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                hitstrength+=vec_abs( move_log.event[i].v2 );            }        }    }    return hitstrength;}void BM_get_walls_hit_strength_last_index(int index, double * strength, double * toffs){    int i;    for(i=0;i<move_log.eventnr;i++){        if( move_log.event[i].event==BALL_wall ){            if( move_log.event[i].timestep_nr==move_log.timestep_nr ){                index--;                if( !(index+1) ){                    *strength=vec_abs(move_log.event[i].v2);//                    *strength *= *strength;                    *toffs=move_log.event[i].timeoffs;                    break;                }            }        }    }    if( i==move_log.eventnr ){ *toffs=0.0; *strength=0.0; }}BallType * BM_get_ball_by_nr( int nr, BallsType *pballs ){    int i;    for(i=0;i<pballs->nr;i++){        if( pballs->ball[i].nr == nr ) break;    }    return (i!=pballs->nr) ? &(pballs->ball[i]) : NULL ;}void record_move_log_event( enum event_type event,                            int nr,                            int nr2,                            BallsType *pballs,                            BMfloat timeoffs ){    move_log.event[move_log.eventnr].event=event;

⌨️ 快捷键说明

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