void main ()
{
srand((unsigned)time(0));
hConWnd = GetConsoleWndHandle(); //support grafik sistem
//x(t)=(ViCos@)t,y(t)=(-1/2)gt^2+(ViSin@)t+Si
//pi=3.141593
//H=y(tH),y'(t)=0==>tH=ViSin@/g
//R=x(tR),y(t)=0==>t=[(-b(+/-)sqrt(b^2-4ac)]/(2a)
if(hConWnd){
int i;
//////////////////////////////////////////////////////////////////////////////////////baru yg betul
double dblInitialHeight,dblLaunchAngle,dblInitialSpeed; //input
double dblTimeInterval,dblTimeYAxisZero[2],dblTimeMaxRange,dblTimeMaxHeight; //data for time
double dblHeightMax,dblRangeMax; //x and y axis
const double PI=3.141593,g=32; // g=32ft/s^2 = 9.81m/s^2 //value for pi and gravity
double dblA,dblB,dblC; //for quadratic eqtn
bool boolPlay = true;
bool boolNew = true;
while (boolPlay){
if (boolNew){
inttarget = (rand()%500)+(rand()%500);
boolNew = false;
}
clrscr();
cout<<"----------------------------------------------------------------"<<endl;
cout<<"Program ini untuk menunjukkan 'Ballistic Projectile Motion Game'"<<endl;
cout<<"----------------------------------------------------------------"<<endl;
cout << "\n\nJarak Target: ";
cout << inttarget-10 << " - " <<inttarget+10 << " ft";
cout<<"\n\n";
cout<<"masukkan nilai halaju awal(ft/s)= ";
cin>>dblInitialSpeed;
cout<<"masukkan jarak tinggi awal jika ade(0 jika tiada)(ft)= ";
cin>>dblInitialHeight;
cout<<"masukkan nilai darjah(degree)= "; // limit angle adalah 0-90 degree only
cin>>dblLaunchAngle;
dblLaunchAngle=dblLaunchAngle*PI/180; //change degree to radian
dblA=-g/2; dblB=dblInitialSpeed*sin(dblLaunchAngle); dblC=dblInitialHeight;
dblTimeYAxisZero[0]=(-dblB + sqrt(pow(dblB,2)-4*(dblA)*(dblC)))/(2*dblA); //root utk dapatkan time max
dblTimeYAxisZero[1]=(-dblB - sqrt(pow(dblB,2)-4*(dblA)*(dblC)))/(2*dblA); //root ukt dapatkan time max
if(dblTimeYAxisZero[0]<=0) {dblTimeMaxRange=dblTimeYAxisZero[1];} //vice versa utk dapatkan nilai max time (utk dapatkan X max sebenarnya)
if(dblTimeYAxisZero[1]<=0) {dblTimeMaxRange=dblTimeYAxisZero[0];}
dblRangeMax=dblInitialSpeed*cos(dblLaunchAngle)*dblTimeMaxRange; //largest value of height(max value of X-axis) ok
dblTimeMaxHeight=dblB/g; //time for maximum height //yang ni equation selepas pembezaan y= (y'=0)
dblHeightMax=((-g/2)*pow(dblTimeMaxHeight,2)) + (dblB*dblTimeMaxHeight) + dblInitialHeight; //the largest value for height(Y-axiz)
dblTimeInterval=(dblTimeMaxRange/(intArray-1)); //to plot & make domain for time menjadi 500 bahagian
dblYaxisValue[0]=((-g/2)*0*0) + (dblB*0) + dblInitialHeight; // at time t=0
dblXaxisValue[0]=dblInitialSpeed*cos(dblLaunchAngle)*0; //at time t=0
// cout<<"at time=0 value x,valuey= "<<dblXaxisValue[0]<<","<<dblYaxisValue[0]<<endl; //coordinate semasa time=0
///////////////////////////////////////////////////////////////////// code utk lakar grafik bermula
for(i=1;i<intArray;i++) //intArray =501
{
dblYaxisValue[i]=((-g/2)*dblTimeInterval*dblTimeInterval) + (dblB*dblTimeInterval) + dblInitialHeight; //utk cari coordinate y axis
dblXaxisValue[i]=dblInitialSpeed*cos(dblLaunchAngle)*dblTimeInterval; //utk cari coordinate x axis
// cout<<"at time"<<dblTimeInterval<<" value x["<<i<<"],y["<<i<<"]="<<dblXaxisValue[i]<<","<<dblYaxisValue[i]<<endl; //for display every coordinate
dblTimeInterval+=(dblTimeMaxRange/(intArray-1)); //untuk dapatkan turutan time (bukan i) dari 500 slot array
}
cout<<"sila tekan mana2 kunci untuk tembak"<<endl;
getch(); //utk tunggu user tekan keyboard baru jalan
//cout<<"sila tunggu sebentar..";
//do{ clrscr();Draw(dblRangeMax,dblHeightMax);}while(getch()!='q'); //clear jawapan untuk lukis grafik selepasnya.
// }
clrscr();
Draw(1000,350); //clear jawapan untuk lukis grafik selepasnya.
Sleep(1000);
clrscr();
if ((dblRangeMax<inttarget-10)||(dblRangeMax>inttarget+10)){
//tak kena
cout << "Sasaran tersasar!" << endl << endl;
}
else{
cout << "Tahniah!"<< endl << endl;
boolNew = true;
}
cout<<"masa jarak max="<<dblTimeMaxRange;
cout<<endl;
cout<<"jarak x max ="<<dblRangeMax;
cout<<endl;
cout<<"masa tinggi max="<<dblTimeMaxHeight;
cout<<endl;
cout<<"jarak y max ="<<dblHeightMax;
cout<<endl;
cout<<"sila tekan mana2 kunci untuk teruskan" <<endl;
getch(); //utk tunggu user tekan keyboard baru jalan
BCX_Circle(hConWnd,300,200,400,Black,Black); //Paint All black
BCX_Circle(hConWnd,500,200,400,Black,Black); //Paint All black
BCX_Circle(hConWnd,700,200,400,Black,Black); //Paint All black
}
}
}
int Draw(double dblRangeMax,double dblHeightMax)
{
int intOriginX=40,intOriginY=25;
Sleep(1000); //rehat 1 saat semasa tunggu grafik //milisecond
gotoxy(3,1);printf("y"); gotoxy(69,23);printf("x"); //utk tentukan nama paksi
BCX_Line(hConWnd,intOriginX,300-intOriginY,intOriginX,intOriginY-10,Grey); //y-axis
BCX_Line(hConWnd,37,intOriginY-7,intOriginX,intOriginY-10,Grey); //small arrow to y-axis hujung axis
BCX_Line(hConWnd,43,intOriginY-7,intOriginX,intOriginY-10,Grey); //small arrow to y-axis hujung axis
BCX_Line(hConWnd,intOriginX,300-intOriginY,(intArray-1+50),300-intOriginY,Grey); //x-axis
BCX_Line(hConWnd,(intArray-1+50-3),300-intOriginY-3,(intArray-1+50),300-intOriginY,Grey); //small arrow at x-axis hujung axis
BCX_Line(hConWnd,(intArray-1+50-3),300-intOriginY+3,(intArray-1+50),300-intOriginY,Grey); //small arrow at x-axis hujung axis
//draw target
for(int i=0;i<intArray;i++)
{
int intDummy[2];
intDummy[0]=int(dblXaxisValue[i]*(intArray-1)/dblRangeMax);
if(((dblXaxisValue[i]*(intArray-1)/dblRangeMax)-intDummy[0])>=0.5) intDummy[0]+=1;//x position(scaling utk boleh masuk 500 slot)
intDummy[1]=int((dblYaxisValue[i]*((intArray-1)/2))/dblHeightMax); //utk jadikan scale y axis = 250 = (intArray-1)/2
if((dblYaxisValue[i]*(intArray-1)/dblHeightMax)-intDummy[1]>=0.5) intDummy[1]+=1;//y position(scaling) //if guna utk bundar
BCX_Circle(hConWnd,intOriginX+intDummy[0],275-intDummy[1],1,Red); //lakar curve yg betul2
BCX_Line(hConWnd,intOriginX+((inttarget-10)*(intArray-1)/1000),300-intOriginY,intOriginX+((inttarget+10)*(intArray-1)/1000),300-intOriginY,Green);
Sleep(5);
}
return 0;
}