?? main.java
字號:
import javax.microedition.lcdui.*;
import java.util.Vector;
import com.nokia.mid.ui.FullCanvas;
//
//
//
public class Main extends FullCanvas implements CommandListener,Runnable {
//public class Main extends Canvas implements CommandListener,Runnable {
public static final byte
STATE_GAME_AIM = 0,
STATE_GAME_FORCE = 1,
STATE_GAME_RUNNING = 2,
STATE_GAME_AITHINK = 3;
public byte gameState = STATE_GAME_AIM;//游戲狀態
Image backImage,whiteBallImage,redBallImage,blueBallImage,blackBallImage;
Thread self;
long MILLIS_PER_TICK =50;
int post;//玩家方向坐標點的位置
int x ,y; //玩家選擇的方向點的坐標
public int force;//力量,開始最少為100
byte flag = 0;//按鍵標志
boolean forceUp;//力量條上升
public static AI ai = new AI();
// Vector v = new Vector();
public m myMIDlet;
public Main(m M) {
myMIDlet = M;
init();
newGame();
}
public void init(){
backImage = a.loadImage("/table.png");
whiteBallImage = a.loadImage("/whiteball.png");
redBallImage = a.loadImage("/redball.png");
blueBallImage = a.loadImage("/blueball.png");
blackBallImage = a.loadImage("/blackball.png");
}
public void newGame(){
a.turn = 0;
flag = 0;
post = 75;
force = 100;
a.firstIn = false;
a.isPlayerTurn = true;
postToXY();
formatBalls();
a.linkBallsState();
a.setTargetBalls(true,a.KIND_ALL);
a.setTargetBalls(false,a.KIND_ALL);
}
public void commandAction(Command command, Displayable displayable) {
}
public void run() {
final Thread currentThread = Thread.currentThread();
while (currentThread == self) {
try {
long time = System.currentTimeMillis();
if (isShown()) {
repaint(); //所有游戲的繪制和邏輯均在里面實現
serviceRepaints(); //寫屏
}
time = System.currentTimeMillis() - time;
if (time < MILLIS_PER_TICK) {
synchronized (this) {
wait(MILLIS_PER_TICK - time); //使每個周期大致相等
}
}
else {
currentThread.yield(); //讓出控制權,防止餓死其它線程
}
}
catch (Exception ex) {}
}
}
/**
* 線程開始
*/
synchronized public void begin() {
self = new Thread(this);
self.start();
}
/**
* 線程中斷
*/
synchronized public void stop() {
self = null;
}
protected void paint(Graphics g) {
gameRun();
switch(getGameState()){
case STATE_GAME_AIM:
drawBalls(g);
this.drawLine(g);
g.setColor(0xffff00);
g.fillRect(151,9,12,162);
break;
case STATE_GAME_AITHINK:
drawBalls(g);
g.setColor(0xffff00);
g.fillRect(151,9,12,162);
g.setColor((int)System.currentTimeMillis());
if(a.thinkOver)
g.drawString("AI思考結束,按5鍵繼續",30,2,20);
else
g.drawString("AI思考",30,2,20);
break;
case STATE_GAME_RUNNING:
drawBalls(g);
break;
case STATE_GAME_FORCE:
drawForce(g);
break;
}
}
/**
* 畫球
* @param g Graphics
*/
private void drawBalls(Graphics g){
g.drawImage(backImage, 0, 0, 20);
for (int i = 0; i < a.Balls.length; i++) {
if (a.Balls[i].alive || a.Balls[i].onBag) {
switch (a.Balls[i].style) {
case 0:
a.Balls[i].drawBall(g, whiteBallImage);
break;
case 8:
a.Balls[i].drawBall(g, blackBallImage);
break;
case 1:
a.Balls[i].drawBall(g, redBallImage);
break;
case 9:
a.Balls[i].drawBall(g, blueBallImage);
break;
}
}
}
}
/**
* 畫力量條
* @param g Graphics
*/
private void drawForce(Graphics g){
g.setColor(0xffff00);
g.fillRect(151,9,12,162);
g.setColor(0xff0000);
g.fillRect(152,170-force/100*8,10,force/100*8);
}
protected void keyPressed(int keyCode) {
switch(keyCode){
case Canvas.KEY_NUM5:
case -5:
flag = 5;
break;
case Canvas.KEY_NUM7:
flag = 7;
break;
case -7:
myMIDlet.exitMIDlet();
}
switch(getGameAction(keyCode)){
case Canvas.LEFT:
flag = 1;
break;
case Canvas.RIGHT:
flag = 2;
break;
case Canvas.UP:
flag = 3;
break;
case Canvas.DOWN:
flag = 4;
break;
}
}
protected void keyReleased(int keyCode) {
flag = 0;
}
/**
* 游戲邏輯計算
*/
private void gameRun() {
switch (getGameState()) {
case STATE_GAME_AIM:
playerAim();
break;
case STATE_GAME_AITHINK:
computerAim();
break;
case STATE_GAME_FORCE:
selectForce();
break;
case STATE_GAME_RUNNING:
ballsMove();
break;
}
}
/**
* post坐標轉成X,Y坐標
*/
public void postToXY(){
if(post>=0&&post<150){
x=post;y=0;
}
else if(post>=150&&post<350){
x=150;y=post-150;
}
else if(post>=350&&post<500){
x=500-post;y=200;
}
else if(post>=500&&post<700){
x=0;y=700-post;
}
}
/**
* 初始化所有球
*/
public void formatBalls(){
a.solidBallsID = new byte[7];
a.stripeBallsID = new byte[7];
a.Balls[0] = new Ball(75,180, 0,a.STYLE_WHITE);
a.Balls[1] = new Ball(75, 80, 1,a.STYLE_SOLID);
a.Balls[5] = new Ball(75, 62, 5,a.STYLE_BLACK);
setupBalls(new int[]{2,3},new int[][]{{70,71,1},{80,71,9}});
setupBalls(new int[]{4,6},new int[][]{{65,62,9},{85,62,1}});
setupBalls(new int[]{7,8,9,10},new int[][]{{60, 53,1},{70, 53,9},{80, 53,1},{90, 53,9}});
setupBalls(new int[]{11,12,13,14,15},new int[][]{{55, 44,9},{65, 44,9},{75, 44,1},{85, 44,9},{95, 44,1}});
int m = 0,n = 0;
for(int i = 0; i<16; i++){
if(a.Balls[i].style == a.STYLE_WHITE || a.Balls[i].style == a.STYLE_BLACK){
continue;
}
if(a.Balls[i].style<8){
a.solidBallsID[m] = a.Balls[i].arraySign;
m++;
}
else{
a.stripeBallsID[n] =a.Balls[i].arraySign;
n++;
}
}
}
/**
* 隨機放置球的序號
* @param order int[]
* @param data int[][]
*/
private void setupBalls(int[] order,int[][] data){
Vector v = new Vector();
for(int i = 0;i<data.length;i++){
v.addElement(data[i]);
}
for(int i = 0;i<order.length;i++){
int temp = a.getRandom()%v.size();
int[] tempData = (int[])(v.elementAt(temp));
a.Balls[order[i]] = new Ball(tempData[0],tempData[1],order[i],tempData[2]);
v.removeElementAt(temp);
}
}
/**
* 設置游戲狀態
* @param s byte 狀態號
*/
private void setGameState(byte s){
gameState = s;
switch(s){
case STATE_GAME_AIM:
a.isPlayerTurn = true;
break;
case STATE_GAME_AITHINK:
a.isPlayerTurn = false;
a.think = true;
ai.begin();
break;
case STATE_GAME_RUNNING:
a.think = false;
break;
}
}
/**
* 返回游戲狀態
* @return byte
*/
private byte getGameState(){
return gameState;
}
/**
* 畫瞄準線
*/
private void drawLine(Graphics g){
int x2 = a.tempBalls[0].x,
y2 = a.tempBalls[0].y;
int x1=0,y1=0;
int x3=0,y3=0;
int x = this.x*100,
y = this.y*100;
byte lineState = 0;
boolean haveReturn = true;
boolean isOK = false;
int l = a.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
int vx = (x-x2)*10000/l,
vy = (y-y2)*10000/l;
if(post >=0 && post<150){
lineState = 0;
}
else if(post>=150 && post<350){
lineState = 1;
}
else if(post>=350 && post<500){
lineState = 2;
}
else if(post>=500 && post<700){
lineState = 3;
}
while(!isOK){
switch(lineState){
case 0:
y1=a.SIDE;
x1=(y1-y)*(x2-x)/(y2-y)+x;
isOK = true;
if(x1<=1960 || x1>=13040){
haveReturn = false;
}
else{
haveReturn = true;
}
if(x1<a.SIDE){
lineState = 3;
isOK = false;
}
else if(x1>a.w-a.SIDE){
lineState = 1;
isOK = false;
}
break;
case 1:
x1=a.w-a.SIDE;
y1=(y2-y)*(x1-x)/(x2-x)+y;
isOK = true;
if((y1>=9134&&y1<=10866)||y1<=1960||y1>=18040){
haveReturn = false;
}
else {
haveReturn = true;
}
if(y1<a.SIDE){
lineState = 0;
isOK = false;
}
else if(y1>a.h-a.SIDE){
lineState = 2;
isOK = false;
}
break;
case 2:
y1=a.h-a.SIDE;
x1=(y1-y)*(x2-x)/(y2-y)+x;
isOK = true;
if(x1<=1960 || x1>=13040){
haveReturn = false;
}
else{
haveReturn = true;
}
if(x1<a.SIDE){
lineState = 3;
isOK = false;
}
else if(x1>a.w-a.SIDE){
lineState = 1;
isOK = false;
}
break;
case 3:
x1 = a.SIDE;
y1=(y2-y)*(x1-x)/(x2-x)+y;
isOK = true;
if((y1>=9134&&y1<=10866)||y1<=1960||y1>=18040){
haveReturn = false;
}
else {
haveReturn = true;
}
if(y1<a.SIDE){
lineState = 0;
isOK = false;
}
else if(y1>a.h-a.SIDE){
lineState = 2;
isOK = false;
}
break;
}
}
if(haveReturn){
switch (lineState) {
case 0:
case 2:
x3 = x1 + 12 * vx / 100;
y3 = y1 - 12 * vy / 100;
break;
case 1:
case 3:
x3 = x1 - 12 * vx / 100;
y3 = y1 + 12 * vy / 100;
break;
}
}
x1/=100;x2/=100;x3/=100;y1/=100;y2/=100;y3/=100;
g.setColor(0xffffff);
g.drawLine(x2,y2,x1,y1);
if(haveReturn){
g.setColor(0xffff00);
g.drawLine(x3, y3, x1, y1);
}
}
/**
* 玩家瞄準
*/
private void playerAim() {
switch (flag) {
case 0:
break;
case 1:
post -= 2;
if (post < 0) {
post += 700;
}
postToXY();
break;
case 2:
post += 2;
if (post >= 700) {
post -= 700;
}
postToXY();
break;
case 4:
post += 50;
if (post >= 700) {
post -= 700;
}
postToXY();
flag = 0;
break;
case 3:
post -= 50;
if (post < 0) {
post += 700;
}
postToXY();
flag = 0;
break;
case 5:
setGameState(STATE_GAME_FORCE);
force = 0;
forceUp = true;
flag = 0;
break;
}
}
/**
* 電腦瞄準
*/
private void computerAim() {
if(a.thinkOver && flag == 5){
a.linkBallsState();
a.Balls[0].onHit(a.dataLevel[a.hitLevel][5],a.dataLevel[a.hitLevel][1],a.dataLevel[a.hitLevel][2]);
setGameState(STATE_GAME_RUNNING);
a.thinkOver = false;
System.gc();
}
if(a.PRINT){ if(a.thinkOver && flag == 7) System.out.println("球:"+a.dataLevel[a.hitLevel][6]+" LV:"+a.hitLevel +" 回合:"+a.turn);}
}
/**
* 選擇力量條
*/
private void selectForce(){
if (forceUp) {
if(force<1200)
force += 50;
else
force += 80;
if(force == 2000){
forceUp = false;
}
}
else{
if(force>1200)
force -= 80;
else
force -= 50;
if(force == 100){
forceUp = true;
}
}
if (flag == 5) {
a.tempBalls[0].onHit(force, x * 100, y * 100);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
setGameState(STATE_GAME_RUNNING);
}
else if(flag == 7){
setGameState(STATE_GAME_AIM);
force = 0;
}
}
/**
* 球的移動
*/
private void ballsMove(){
a.move();
if (a.ballsState == 0) { //移動完成
if(!a.isPlayerTurn){
setGameState(STATE_GAME_AIM);
a.turn ++;
}
else{
setGameState(STATE_GAME_AITHINK);
}
if (!a.tempBalls[0].alive) {
a.tempBalls[0] = null;
a.tempBalls[0] = new Ball(80, 180, 0,0);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -