package ss;
import zlib.event.ChangeListener;
import zlib.math.MathKit;
/**
* 泡泡龙逻辑类
*
* @author Administrator
*/
public class Scene
{
/**创建一个8行7列的显示数组,存放球的位置*/
public BallBean[][] paopao=new BallBean[9][7];
/** 母球颜色*/
public int paopaocorlor;
/**泡泡半径为18 */
private static int paopao_r=16;
/**泡泡移动偏移量 */
private static int speedkit=10;
/** 母泡泡x坐标*/
public double paopao_x;
/**母泡泡y坐标 */
public double paopao_y;
/** 母球圆心与初始化化球圆心之间的距离*/
public double c;
/** 发生碰撞的弧度*/
private double rate;
/**发生碰撞的角度 */
private double ratejiao;
/**递归标示 */
private int type=1;
/**入射角度 */
public double a;
/** 母球数组下标*/
public int pp_i;
/**母球数组下标 */
public int pp_j;
/**判断球是否处于运动中 */
public boolean run_falg=true;
/** 观察模式*/
public ChangeListener listener;
/** 遍历类*/
public BianLiToString bt;
/**母球移动标示 */
public static int MOVE=10;
/** 小球是否停止标示*/
public static int RUNFALG=20;
/**创建母泡泡标示 */
public static int MUPAOPAO=30;
/**游戏结束标示 */
public static int GAME_OVER=40;
/**清空标识 */
public static int CLEAR=50;
/** 母球计数器*/
public int count=0;
/** 初始化游戏 */
public void init()
{
bt = new BianLiToString();//创建遍历方法类对象
bt.listener=listener;
paopao_x=115;
paopao_y=380;
paopaocorlor=MathKit.randomValue(1,8); // 创建母泡泡的颜色
//System.out.println("母泡泡颜色"+paopaocorlor);
a=90;
/**
* 开始布局 初始化前3行泡泡 随即产生0-7个数,0代表空,1为绿,2为紫,3为红,4为黑,5为黄,6为蓝,7为橙 奇数行放7个有色球
* 偶数行放6个有色球和一个空球
*/
for(int i=0;i<3;i++)
{
if(i%2==0||i==0)
{
for(int j=0;j<7;j++)
{ // 奇数行
paopao[i][j]=new BallBean(i,j,j*32+paopao_r,i*32+paopao_r,MathKit
.randomValue(1,8));
System.out.println("init:"+i+" "+j+" "+paopao[i][j]);
// paopao[i][j]=MathKit.randomValue(1,8);
}
}
if(i%2==1||i==1)
{
for(int j=0;j<6;j++)
{ // 偶数行
paopao[i][j]=new BallBean(i,j,j*32+2*paopao_r,i*32+paopao_r,MathKit
.randomValue(1,8));
System.out.println("init:"+i+" "+j+" "+paopao[i][j]);
// paopao[i][j]=MathKit.randomValue(1,8);
}
}
}
// 初始化后6行都为无色球
for(int i=3;i<9;i++)
{
if(i%2==0||i==0)
{
for(int j=0;j<7;j++)
{ // 奇数行
paopao[i][j]=new BallBean(i,j,j*32+paopao_r,i*32+paopao_r,0);
}
}
if(i%2==1||i==1)
{
for(int j=0;j<6;j++)
{ // 偶数行
paopao[i][j]=new BallBean(i,j,j*32+2*paopao_r,i*32+paopao_r,0);
}
}
}
}
/** 创建发射球
* 初始化所有球标记
* */
public void mupaopaocorlor(){
paopao_x=115;
paopao_y=380;
paopaocorlor=MathKit.randomValue(1,8); // 创建母泡泡的颜色
listener.change(this,MUPAOPAO,paopaocorlor);
//System.out.println("===========重新创建母泡泡成功"+" 颜色为"+paopaocorlor);
}
/**
* 发射球开始游戏 泡泡移动 a 是发射角度 x 是x轴坐标 y 是一轴坐标
*/
public void start(){
//System.out.println("=====!!进入移动");
if(run_falg){
double a_a=Math.toRadians(a); // 角度转化为弧度
//System.out.println("---------------------跟踪角度2================"+a);
Move(a_a);
//撞墙
if(paopao_x>=200||paopao_x<=20)
{
pzMove();
}
if(paopao_y<=0){
int y=(int)((paopao_x-paopao_r)/32);
paopao[0][y].setPaopaocorlor(paopaocorlor);//保存泡泡
paopao[0][y].setType(1);
pp_i=0;
pp_j=y;
runFalg();//运动停止
//ceshi();
//System.out.println("~~~~~~~~~~~~~~~~~~~~210行碰撞球"+0+y+"母球"+0+y+"坐标:"+paopao[0][y].getX()+" "+paopao[0][y].getY());
bt.sixMan(paopao,paopaocorlor,0,y); //遍历6面颜色相同的球
bt.delete(paopao); //删除颜色相同的球
//ceshi();
selectXuanKong();//查找悬空
//ceshi();
bt.deleteXuankong(paopao);//删除悬空
reset();//小球重置
//ceshi();
mupaopaocorlor();//创建新母球
}
jcPengZhuang();
}
}
/**
* 泡泡碰墙后移动 改变移动角度
*/
public void pzMove()
{
a=180-a;
}
/**
* 泡泡无碰撞移动
*/
public void Move(double a_a)
{
paopao_x=paopao_x+speedkit*Math.cos(a_a); // x轴移动到的位置
paopao_y=paopao_y-speedkit*Math.sin(a_a); // y轴移动到的位置
listener.change(this,MOVE,(int)paopao_x,(int)paopao_y);
}
/**
* 检测泡泡碰撞 计算碰撞位置及保存泡泡
*/
public void jcPengZhuang(){
// 计算圆心距检测碰撞
//System.out.println("================================================================================!!");
for(int k=0;k<8;k++)
{
for(int m=0;m<7;m++)
{
if(paopao[k][m]!=null&&paopao[k][m].getPaopaocorlor()!=0)
{
c=Math.sqrt((paopao[k][m].getX()-paopao_x)*(paopao[k][m].getX()-paopao_x)+(paopao[k][m].getY()-paopao_y)*(paopao[k][m].getY()-paopao_y)); // 计算圆心距离
if(c<=(2*paopao_r)){ // 圆心距小于2*paopao_r 发生碰撞
//System.out.println("圆心距============="+c);
//System.out.println("========!!进入碰撞");
// 检测发生碰撞的位置
rate=Math.abs(Math.atan((paopao[k][m].getY()-paopao_y)/(paopao_x-paopao[k][m].getX()))); // 母泡泡的弧度
ratejiao=Math.toDegrees(rate); // 弧度转化给角度
//System.out.println("碰撞角度="+ratejiao);
// 发生在第一象限
if((paopao_x-paopao[k][m].getX())>0&&(paopao[k][m].getY()-paopao_y)>0){
// 角度小于30,母泡泡正左边
if(ratejiao<=30&&ratejiao>=0)
{
//System.out.println("~~~~~~~~~~~~~~第一象限碰撞在球的正右边202行");
paopao[k][m+1].setPaopaocorlor(paopaocorlor);//保存泡泡
paopao[k][m+1].setType(1);
pp_i=k;
pp_j=m+1;
runFalg();//运动停止
//ceshi();
//System.out.println("~~~~~~~~~~~~~~~~~~~~210行碰撞球"+k+m+"母球"+k+(m+1)+"坐标:"+paopao[k][m+1].getX()+" "+paopao[k][m+1].getY());
bt.sixMan(paopao,paopaocorlor,k,m+1); //遍历6面颜色相同的球
bt.delete(paopao); //删除颜色相同的球
//ceshi();
selectXuanKong();//查找悬空
//ceshi();
bt.deleteXuankong(paopao);//删除悬空
end();
reset();//小球重置
//ceshi();
mupaopaocorlor();//创建新母球
}
// 角度大于30小于90,母泡泡的左下
else if(ratejiao>=30&&ratejiao<=90)
{
//System.out.println("~~~~~~~~~~~~~~~~~~碰撞在球的右上216行");
// 上排为奇数行
if(k%2==0||k==0)
{
paopao[k-1][m].setPaopaocorlor(paopaocorlor);
paopao[k-1][m].setType(1);
pp_i=k-1;
pp_j=m;
runFalg();//运动停止
//ceshi();
//System.out.println("~~~~~~~~~~~~~~~~~228行碰撞球"+k+m+"母球"+(k-1)+(m)+"坐标:"+paopao[k-1][m].getX()+" "+paopao[k][m].getY());
bt.sixMan(paopao,paopaocorlor,k-1,m); //遍历6面颜色相同的球
bt.delete(paopao); //删除颜色相同的球
//ceshi();
selectXuanKong();//查找悬空
//ceshi();
bt.deleteXuankong(paopao);//删除悬空
end();
reset();//小球重置
//ceshi();
mupaopaocorlor();//创建新母球
}else
// 上排为偶数行
if(k%2==1||k==1)
{
paopao[k-1][m+1].setPaopaocorlor(paopaocorlor);
paopao[k-1][m+1].setType(1);
pp_i=k-1;
pp_j=m+1;
runFalg();//运动停止
//ceshi();
//System.out.println("~~~~~~~~~~~~~~~~~~240行碰撞球"+k+m+"母球"+(k-1)+(m+1)+"坐标:"+paopao[k-1][m+1].getX()+" "+paopao[k-1][m+1].getY());
bt.sixMan(paopao,paopaocorlor,k-1,m+1); //遍历6面颜色相同的球
bt.delete(paopao); //删除颜色相同的球
//ceshi();
selectXuanKong();//查找悬空
//ceshi()