?? ai.java
字號:
public class AI implements Runnable{
private int AIforce;
// private boolean thisBallIn = false;
public AI() {
}
Thread self = new Thread(this);
synchronized public void begin() {
self = new Thread(this);
self.start();
}
public void run() {
initThinkData();
// AIthink(true);
AIthink(false);
if(a.AIHitBallsKind != 0 //分出顏色
&& a.turn > 3 //當回合大于3的時候
){//進行反彈思考
if(a.hitLevel>0){
if(a.PRINT)System.out.println("***************************************************沒有球進袋,計算反彈結果****************************************************************");
AIthink(true);
}
}
if(a.PRINT)System.out.println("########### 結束 ############");
if (a.hitLevel < 3) {//碰撞等級小于3時,有坐標設置: dataLevel[][3] dataLevel[][4]起作用
a.haveSet = true;
}
else {//碰撞等級大于等于3時,無坐標設置: dataLevel[][3] dataLevel[][4]不起作用
a.haveSet = false;
}
a.thinkOver = true;
}
/**
* 初始化一些思考的數據
*/
private void initThinkData(){
a.AIx = 8000;
a.AIy = 0;
a.haveSet = false;
a.dataLevel = new int[4][7];
a.hitLevel = 3;
if(a.turn < 3 || a.AIHitBallsKind == a.KIND_ALL){
AIforce = 2000;
}
else{
AIforce = 1500;
}
if(a.AIHitBallsKind == a.KIND_ALL){
a.dataLevel[2][0] = 1;
a.dataLevel[2][1] = a.w/2;
a.dataLevel[2][2] = (a.Balls[0].y/1000 == 6) ? 7000:6000;
a.dataLevel[2][3] = 0;
a.dataLevel[2][4] = 0;
a.dataLevel[3][5] = 2000;
a.dataLevel[2][6] = 0;
}
else{
for (int t = 0; t < a.AIBallsID.length; t++) {
if (a.Balls[a.AIBallsID[t]].alive) {
a.dataLevel[3][0] = 1;
a.dataLevel[3][1] = a.Balls[a.AIBallsID[t]].x;
a.dataLevel[3][2] = a.Balls[a.AIBallsID[t]].y;
a.dataLevel[3][3] = a.Balls[a.AIBallsID[t]].x;
a.dataLevel[3][4] = a.Balls[a.AIBallsID[t]].y;
a.dataLevel[3][5] = 2000;
a.dataLevel[3][6] = a.AIBallsID[t];
break;
}
}
}
}
/**
* 復位一些思考的數據
*/
private void resetThinkData(){
a.fail = false;
a.curTrackSign = 0;
a.thinkStop = false;//本次思考結束標志
a.thinkEnd = false;
a.haveSet = true;
a.whiteBallStop = false;
a.curBallStop = false;
a.curBallIn = false;
a.whiteBallIn = false;
}
/**
* 設置數據
* @param lv int 等級 0:有球能被打進 1:白球和目標球都進 2:白球撞到目標球但沒進袋 3:白球撞不到目標球
* @param x int 方向X坐標
* @param y int 方向Y坐標
* @param hitx int 碰撞X坐標
* @param hity int 碰撞Y坐標
* @param force int 力量
* @param s int 球號
*/
private void setDataInLevel(int lv,int x,int y,int hitx,int hity,int force,int s){
if (a.dataLevel[lv][0] == 0 ||
( (Math.abs(hitx - a.Balls[0].x) + Math.abs(hity - a.Balls[0].y)) <
(Math.abs(a.dataLevel[lv][3] - a.Balls[0].x) + Math.abs(a.dataLevel[lv][4] - a.Balls[0].y)))
) {
a.dataLevel[lv][0] = 1;
a.dataLevel[lv][1] = x;
a.dataLevel[lv][2] = y;
a.dataLevel[lv][3] = hitx;
a.dataLevel[lv][4] = hity;
a.dataLevel[lv][5] = force;
a.dataLevel[lv][6] = s;
}
}
/**
* 找目標球的碰撞點
* @param ballSign byte 球號
* @param bagSign byte 袋號
* @return int[] 返回的結果[0]碰撞點的X坐標[1]碰撞點的Y坐標[2]碰撞點和袋的X距離[3]碰撞點和袋的Y距離
*/
private int[] findHitSet(byte ballSign,byte bagSign){
int[] result = new int[4];
a.copyBallsState();
int dtx = a.tempBalls[ballSign].x - a.bagSet[bagSign][0],
dty = a.tempBalls[ballSign].y - a.bagSet[bagSign][1];
int u = a.sqrt(dtx * dtx + dty * dty);
int vx = dtx * 10000 / u,
vy = dty * 10000 / u;
int x = (u + a.ballD) * vx / 10000 + a.bagSet[bagSign][0],
y = (u + a.ballD) * vy / 10000 + a.bagSet[bagSign][1];
result[0] = x;
result[1] = y;
result[2] = dtx;
result[3] = dty;
return result;
}
/**
* 找白球的方向點
* @param x int 碰撞點的X坐標
* @param y int 碰撞點的Y坐標
* @param dtx int 碰撞點和袋的X距離
* @param dty int 碰撞點和袋的Y距離
* @param isRebound boolean 是否反彈
* @param side int 反彈的邊號
* @return int[] 返回的結果 [0]是否有結果[1]方向X坐標[2]方向Y坐標[3]碰撞X坐標[4]碰撞Y坐標
*/
private int[] findStartSet(int x,int y,int dtx,int dty,boolean isRebound,int side){
int [] result = new int[5];
a.copyBallsState();
int m,n;
if(!isRebound){
m = x - a.tempBalls[0].x;
n = y - a.tempBalls[0].y;
if ( (dtx * m + dty * n) < 0){
result[0] = 1;
result[1] = x;
result[2] = y;
result[3] = x;
result[4] = y;
}
else{
result[0] = 0;
}
}
else{
int x1=0,y1=0,x0=0,y0=0;
switch(side){
case 0:
x1 = x;
y1 = a.SIDE_UP-(y-a.SIDE);
x0 = a.tempBalls[0].x;
y0 = a.SIDE_UP-(a.tempBalls[0].y-a.SIDE_UP);
break;
case 1:
x1 = a.SIDE_RIGHT+(a.SIDE_RIGHT-x);
y1 = y;
x0 = a.SIDE_RIGHT+(a.SIDE_RIGHT-a.tempBalls[0].x);
y0 = a.tempBalls[0].y;
break;
case 2:
x1 = x;
y1 = a.SIDE_DOWN+(a.SIDE_DOWN-y);
x0 = a.tempBalls[0].x;
y0 = a.SIDE_DOWN+(a.SIDE_DOWN-a.tempBalls[0].y);
break;
case 3:
x1 = a.SIDE_LEFT-(x-a.SIDE_LEFT);
y1 = y;
x0 = a.SIDE_LEFT-(a.tempBalls[0].x-a.SIDE_LEFT);
y0 = a.tempBalls[0].y;
break;
}
m = x-x0;
n = y-y0;
if ( (dtx * m + dty * n) < 0){
result[0] = 1;
result[1] = x1;
result[2] = y1;
result[3] = x;
result[4] = y;
}
else{
result[0] = 0;
}
}
return result;
}
public void AIthink(boolean isRebound){
if(a.PRINT)System.out.println("----------------------------------------------------");/////////
for(byte s=0;s<a.AIBallsID.length;s++){//-----------------AI要打的球循環-----------------
if(!a.tempBalls[a.AIBallsID[s]].alive){
continue;
}
boolean thisBallIn = false;
for (byte i = 0; i < a.bagSet.length; i++){//------------球代循環--------------------
if(thisBallIn) break;
int[] hitData = findHitSet(a.AIBallsID[s],i);
for (byte j = 0;j<4;j++){//--------------------------球案邊循環---------------------------
int[] data = findStartSet(hitData[0],hitData[1],hitData[2],hitData[3],isRebound,j);
if (data[0] == 1) { //--------------------------------角度合適---------VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
a.curHitSign = a.AIBallsID[s];
a.AIx = data[3];
a.AIy = data[4];
resetThinkData(); //----------初始化一些狀態數據
a.tempBalls[0].onHit(AIforce, data[1], data[2]);
if(a.PRINT)System.out.println("================================================="); /////////
if(a.PRINT)System.out.println("球號" + a.AIBallsID[s] + " 袋號" + i); /////////////////////////////////////////////////////
int loop = 0;
while (!a.thinkEnd) { //-------------while think move------------****************************************
loop++;
a.move(); //球進行移動
if (a.fail) { // 碰錯球 LV3=====================================================================
a.thinkEnd = true;
if(a.PRINT)System.out.println("失敗"); //////////////////////////////////////////////////
}
else
if (a.curBallIn && a.whiteBallStop) { //目標球進袋 LV0============================================
thisBallIn = true;
a.thinkEnd = true;
a.hitLevel = 0;
setDataInLevel(0, data[1], data[2], data[3], data[4], AIforce,a.curHitSign);
if(a.PRINT)System.out.println("成功!!!▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一"); /////////////////////////////////////////////////
if (a.AIHitBallsKind == a.KIND_ALL || //打所有球的時候得到坐標就確定
isRebound //反彈的時候有了坐標就確定
) {
return;
}
}
else
if (a.curBallIn && a.whiteBallIn) { //全進 LV1=====================================================
a.thinkEnd = true;
if(a.PRINT)System.out.println("全進袋"); /////////////////////////////////////////////////////////
// if((!isRebound && a.hitLevel>0)||(isRebound && a.hitLevel>1)){
// a.hitLevel = 1;
// setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
// }
if(isRebound){//反彈的時候
if(a.hitLevel>1){//當在非反彈的時候沒有兩球都進的情況進入
a.hitLevel = 1;
setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
}
}
else{//不是反彈的情況
if (a.hitLevel > 0 ) {//當沒有成功的情況進入
a.hitLevel = 1;
setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
}
}
}
else
if (a.thinkStop || (a.curBallStop && a.curTrackSign == a.curHitSign)) { //全沒進 LV2====================================
a.thinkEnd = true;
if(a.PRINT)System.out.println("碰到球,沒進袋"); //////////////////////////////////////////////////
if(a.PRINT){if (!a.thinkStop) System.out.println("//////////////////力量不夠//////////////////////////////");}
if(!isRebound){
if (a.hitLevel > 1) {
a.hitLevel = 2;
setDataInLevel(2, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
}
}
else{
if (a.hitLevel > 2) {
a.hitLevel = 2;
setDataInLevel(2, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
}
}
}
else
if (loop > 110) {//=============================超過循環時間========================================================
a.thinkEnd = true;
}
} //-------------------------while think move end-----------**********************************************
if(a.PRINT)System.out.println("loop = " + loop); /////////////////////////////////////////////////
} //------ 角度合適 end-----------------VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
if(!isRebound){
break;
}
}//------------邊循環 end-----------------------------------------------
}//------------球代循環 end ----------------------------------------------
}//-----------------AI要打的球循環 end ---------------------------
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -