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

📄 game.cpp

📁 这是一个台球游戏的源代码
💻 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 + -