📄 game.cpp
字号:
#include "Game.h"
#include "Camera.h"
#include <math.h>
#include <stdio.h>
#include <time.h>
CPoolGame theGame;
extern CCamera theCamera;
char hint[256];
char congrats[256];
const double b_radius=0.02875;
const double b_mass=0.17;
CPlayer::CPlayer(void)
{
m_bTurn=false;
m_ballHitMin=0;
m_ballHitMax=0;
}
CBall::CBall(void)
{
v[0]=0;
v[1]=0;
v[2]=0;
status=BS_STATIONARY;
hit=false;
ball_alpha=0.02;
}
void CBall::SetParameters(double cx0, double cy0, double cz0, double r0, double mass0,
GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
x[0]=cx0; x[1]=cy0; x[2]=cz0; r=r0; mass=mass0;
color[0]=red; color[1]=green; color[2]=blue; color[3]=alpha;
}
CBoundary::CBoundary(void)
{
}
void CBoundary::SetParameters(double x0, double y0, double x1, double y1,
double x2, double y2, double x3, double y3,
double top0, double bottom0,
GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
x[0][0]=x0;
x[0][1]=y0;
x[1][0]=x1;
x[1][1]=y1;
x[2][0]=x2;
x[2][1]=y2;
x[3][0]=x3;
x[3][1]=y3;
top=top0;
bottom=bottom0;
color[0]=red;
color[1]=green;
color[2]=blue;
color[3]=alpha;
}
CHole::CHole(void)
{
}
void CHole::SetParameters(double x0, double y0, double r0,
double top0, double bottom0,
GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
x[0]=x0;
x[1]=y0;
r=r0;
top=top0;
bottom=bottom0;
color[0]=red;
color[1]=green;
color[2]=blue;
color[3]=alpha;
}
void CPoolGame::reset(void){
choose=false;
rule=false;
first=true;
player1red=false;
win=false;
loss=false;
status=GS_INIT_REPOSITION;
for(int j=0;j<16;j++) balls[j].status=BS_STATIONARY;
double T=b_radius*sqrt(3);
int Alpha=100;
balls[0].SetParameters(0.762,0,b_radius,b_radius,b_mass,230,220,200,Alpha);//white
balls[1].SetParameters(-0.635,0,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[9].SetParameters(-0.635-T,-b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[10].SetParameters(-0.635-T,b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[3].SetParameters(-0.635-2*T,2*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[8].SetParameters(-0.635-2*T,0,b_radius,b_radius,b_mass,33,33,33,255);//black
balls[2].SetParameters(-0.635-2*T,-2*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[12].SetParameters(-0.635-3*T,3*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[13].SetParameters(-0.635-3*T,b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[6].SetParameters(-0.635-3*T,-b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[11].SetParameters(-0.635-3*T,-3*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[5].SetParameters(-0.635-4*T,4*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[15].SetParameters(-0.635-4*T,2*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[7].SetParameters(-0.635-4*T,0,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[14].SetParameters(-0.635-4*T,-2*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[4].SetParameters(-0.635-4*T,-4*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
}
CPoolGame::CPoolGame(void)
{
sprintf(player1.m_Name,"player1");
sprintf(player2.m_Name,"player2");
player1.m_pOpponent = &player2;
player2.m_pOpponent = &player1;
restart=false;
choose=false;
rule=false;
first=true;
player1red=false;
normally=false;
pot=false;
foul=false;
win=false;
loss=false;
bdhitnum=0;
ballhit=0;
numin=0;
status=GS_INIT_REPOSITION;
////////////////////////
sizex=2.54;
sizey=1.27;
thickness=0.1;
num_balls=16;
int Alpha=100;
double T=b_radius*sqrt(3);
/*
balls[0].SetParameters(0.762,0,b_radius,b_radius,b_mass,230,220,200,255);//white
balls[1].SetParameters(-0.635,0,b_radius,b_radius,b_mass,230,230,24,255);
balls[9].SetParameters(-0.635-T,-b_radius,b_radius,b_radius,b_mass,230,230,24,255);
balls[10].SetParameters(-0.635-T,b_radius,b_radius,b_radius,b_mass,0,0,230,255);
balls[3].SetParameters(-0.635-2*T,2*b_radius,b_radius,b_radius,b_mass,240,0,0,255);
balls[8].SetParameters(-0.635-2*T,0,b_radius,b_radius,b_mass,33,33,33,255);//black
balls[2].SetParameters(-0.635-2*T,-2*b_radius,b_radius,b_radius,b_mass,0,0,230,255);
balls[12].SetParameters(-0.635-3*T,3*b_radius,b_radius,b_radius,b_mass,180,0,180,255);
balls[13].SetParameters(-0.635-3*T,b_radius,b_radius,b_radius,b_mass,240,160,0,255);
balls[6].SetParameters(-0.635-3*T,-b_radius,b_radius,b_radius,b_mass,0,180,0,255);
balls[11].SetParameters(-0.635-3*T,-3*b_radius,b_radius,b_radius,b_mass,240,0,0,255);
balls[5].SetParameters(-0.635-4*T,4*b_radius,b_radius,b_radius,b_mass,240,160,0,255);
balls[15].SetParameters(-0.635-4*T,2*b_radius,b_radius,b_radius,b_mass,165,0,33,255);
balls[7].SetParameters(-0.635-4*T,0,b_radius,b_radius,b_mass,165,0,33,255);
balls[14].SetParameters(-0.635-4*T,-2*b_radius,b_radius,b_radius,b_mass,0,180,0,255);
balls[4].SetParameters(-0.635-4*T,-4*b_radius,b_radius,b_radius,b_mass,180,0,180,255);
*/
balls[0].SetParameters(0.762,0,b_radius,b_radius,b_mass,230,220,200,Alpha);//white
balls[1].SetParameters(-0.635,0,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[9].SetParameters(-0.635-T,-b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[10].SetParameters(-0.635-T,b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[3].SetParameters(-0.635-2*T,2*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[8].SetParameters(-0.635-2*T,0,b_radius,b_radius,b_mass,33,33,33,255);//black
balls[2].SetParameters(-0.635-2*T,-2*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[12].SetParameters(-0.635-3*T,3*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[13].SetParameters(-0.635-3*T,b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[6].SetParameters(-0.635-3*T,-b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[11].SetParameters(-0.635-3*T,-3*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[5].SetParameters(-0.635-4*T,4*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[15].SetParameters(-0.635-4*T,2*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[7].SetParameters(-0.635-4*T,0,b_radius,b_radius,b_mass,140,28,24,Alpha);
balls[14].SetParameters(-0.635-4*T,-2*b_radius,b_radius,b_radius,b_mass,222,222,0,Alpha);
balls[4].SetParameters(-0.635-4*T,-4*b_radius,b_radius,b_radius,b_mass,140,28,24,Alpha);
double tk=0.05,d1=0.015,d2=0.01;//分别为内壁厚度,角洞、腰洞张度
double top=0.04,bottom=0;
double
x0=0.06,
y0=0.635+tk,
x1=0.06+d2,
y1=0.635,
x2=1.27-sqrt(2)*0.105/2-d1,
y2=0.635,
x3=x2+d1+tk,
y3=y0,
x4=1.27+tk,
x5=1.27,
y5=0.635-sqrt(2.0)*0.105/2-d1,
y4=y5+d1+tk;
num_boundaries=6;
boundaries[0].SetParameters(x0,y0,x1,y1,x2,y2,x3,y3,top,bottom,183,41,2,255);
boundaries[1].SetParameters(x4,y4,x5,y5,x5,-y5,x4,-y4,top,bottom,183,41,2,255);
boundaries[2].SetParameters(x3,-y3,x2,-y2,x1,-y1,x0,-y0,top,bottom,183,41,2,255);
boundaries[3].SetParameters(-x0,-y0,-x1,-y1,-x2,-y2,-x3,-y3,top,bottom,183,41,2,255);
boundaries[4].SetParameters(-x4,-y4,-x5,-y5,-x5,y5,-x4,y4,top,bottom,183,41,2,255);
boundaries[5].SetParameters(-x3,y3,-x2,y2,-x1,y1,-x0,y0,top,bottom,183,41,2,255);
for(int i=0;i<6;i++){
for(int j=0;j<3;j++){
boundaries[i].n[j][0]=(boundaries[i].x[j+1][1]-boundaries[i].x[j][1])/sqrt((boundaries[i].x[j+1][1]-boundaries[i].x[j][1])*(boundaries[i].x[j+1][1]-boundaries[i].x[j][1])+
(boundaries[i].x[j+1][0]-boundaries[i].x[j][0])*(boundaries[i].x[j+1][0]-boundaries[i].x[j][0]));
boundaries[i].n[j][1]=(boundaries[i].x[j][0]-boundaries[i].x[j+1][0])/sqrt((boundaries[i].x[j+1][1]-boundaries[i].x[j][1])*(boundaries[i].x[j+1][1]-boundaries[i].x[j][1])+
(boundaries[i].x[j+1][0]-boundaries[i].x[j][0])*(boundaries[i].x[j+1][0]-boundaries[i].x[j][0]));
}
}
double low=0.01;
double lj=sqrt((y0-y1)*(y0-y1)+low*low);
double xy=low/lj;
double z=(y0-y1)/lj;
boundaries[0].topn[0]=0.0;boundaries[0].topn[1]=-xy;boundaries[0].topn[2]=z;
boundaries[1].topn[0]=-xy;boundaries[1].topn[1]=0.0;boundaries[1].topn[2]=z;
boundaries[2].topn[0]=0.0;boundaries[2].topn[1]=xy;boundaries[2].topn[2]=z;
boundaries[3].topn[0]=0.0;boundaries[3].topn[1]=xy;boundaries[3].topn[2]=z;
boundaries[4].topn[0]=xy;boundaries[4].topn[1]=0.0;boundaries[4].topn[2]=z;
boundaries[5].topn[0]=0.0;boundaries[5].topn[1]=-xy;boundaries[5].topn[2]=z;
double bevel=0.01;
lj=sqrt((top-low)*(top-low)+bevel*bevel);
xy=(top-low)/lj;
z=-bevel/lj;
boundaries[0].inn[0]=0.0;boundaries[0].inn[1]=-xy;boundaries[0].inn[2]=z;
boundaries[1].inn[0]=-xy;boundaries[1].inn[1]=0.0;boundaries[1].inn[2]=z;
boundaries[2].inn[0]=0.0;boundaries[2].inn[1]=xy;boundaries[2].inn[2]=z;
boundaries[3].inn[0]=0.0;boundaries[3].inn[1]=xy;boundaries[3].inn[2]=z;
boundaries[4].inn[0]=xy;boundaries[4].inn[1]=0.0;boundaries[4].inn[2]=z;
boundaries[5].inn[0]=0.0;boundaries[5].inn[1]=-xy;boundaries[5].inn[2]=z;
double
m1=0,
n1=0.635+0.07,
rc=0.06,
m2=1.27+0.025,
n2=0.635+0.025,
rv=0.06,
toph=-0.001,
bottomh=-0.1;
num_holes=6;
holes[0].SetParameters(m1,n1,rc,toph,bottomh,200,100,100,255);
holes[1].SetParameters(m2,n2,rv,toph,bottomh,200,100,100,255);
holes[2].SetParameters(m2,-n2,rv,toph,bottomh,200,100,100,255);
holes[3].SetParameters(m1,-n1,rc,toph,bottomh,200,100,100,255);
holes[4].SetParameters(-m2,-n2,rv,toph,bottomh,200,100,100,255);
holes[5].SetParameters(-m2,n2,rv,toph,bottomh,200,100,100,255);
rotation_flag=false;
min_hit_speed=0.01;
max_hit_speed=4.0;
hit_speed=0.0;
max_rod_ball_dist=0.3;
min_rod_ball_dist=0.0;
srand((unsigned)time( NULL));
if(rand() % 2 == 0){
player1.m_bTurn=true;
player2.m_bTurn=false;
sprintf(hint,"It's %s's m_bTurn",player1.m_Name);
}
else{
player1.m_bTurn=false;
player2.m_bTurn=true;
sprintf(hint,"It's %s's m_bTurn",player2.m_Name);
}
}
CPoolGame::~CPoolGame(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -