您的位置:首页 > 其它

蓝牙休闲娱乐平台(毕业设计)第七部份

2008-03-08 22:31 344 查看



/** *//**


* Copyright@schoalr_ii


* @author 梧州学院 04计本2班 罗功武


* date 08/03/03


*/


package game;




import java.io.DataInputStream;


import java.io.DataOutputStream;


import java.io.IOException;




import javax.bluetooth.BluetoothStateException;


import javax.bluetooth.DataElement;


import javax.bluetooth.DiscoveryAgent;


import javax.bluetooth.LocalDevice;


import javax.bluetooth.ServiceRecord;


import javax.microedition.io.Connector;


import javax.microedition.io.StreamConnection;


import javax.microedition.io.StreamConnectionNotifier;


import javax.microedition.lcdui.Command;


import javax.microedition.lcdui.CommandListener;


import javax.microedition.lcdui.Displayable;


import javax.microedition.lcdui.Font;


import javax.microedition.lcdui.Graphics;


import javax.microedition.lcdui.Image;


import javax.microedition.lcdui.game.GameCanvas;


import javax.microedition.lcdui.game.Sprite;




import flat.FlatMainMIDlet;






/** *//**


* GameClient 游戏服务器类


* 创建游戏等侍客户端的链接。


* 采用多线程技术,游戏主线程,接收数据线程,送收数据线程,


* 三种线程维护游戏的运作。


* 同一时间段内游戏主线程只与一个接收或发送数据线程并行运行。


* 游戏中的坐标采用相对坐标,使得游戏的移植性相对好点。


*/




public class GameServer extends GameCanvas implements Runnable, CommandListener ...{




private Image chessImage = null;


private Image bgImage = null;


private Image redFruit = null;


private Image whiteFruit = null;


private Image redAngleImage = null;


private Image whiteAngleImage = null;


private Image waitMessImage = null;


private Image winMessImage = null;


private Image lossMessImage = null;


private Image deuceMessImage = null;


private Sprite redAngle = null;


private Sprite whiteAngle = null;


private Graphics g = null;




/**//*游戏逻棋盘-游戏的水果架*/


private int fruitList[][] = new int[5][9];


private int halfWidth = 0;


private int halfHeight = 0;


private int basePointX = 0;


private int basePointY = 0;




/**//*玩家等候时的坐标*/


private int waitPointX = 0;


private int waitPointY = 0;




/**//*玩家运动时的坐标-下棋的状态*/


private int runPointX = 0;


private int runPointY = 0;




/**//*红色天使的当前坐标-对应玩家*/


private int redAngleCurrentX = 0;


private int redAngleCurrentY = 0;




/**//*白色天使的当前坐标-对应对手*/


private int whiteAngleCurrentX = 0;


private int whiteAngleCurrentY = 0;


private int angleMoveOffsetX = 18;




/**//*服务器是否停止服务*/


private boolean isRunning = true;




/**//*游戏是否束结束*/


private boolean isGameOver = false;




/**//*是否玩家在运动-下棋状态*/


private boolean isRedAngleRunning ;




/**//*等待时的动画帧*/




private static final int waitFrameSequence[] = ...{0,1,2,3,4,5,6,7,8,9,10,11};




/**//*运动时的动画帧*/




private static final int runFrameSequence[] = ...{0,1,2};




/**//*玩家在水果架下方的当前列号*/


private int position = 0;




/**//*游戏盘数*/


private int count = 0;


private Command cmdExit = new Command("退出游戏",Command.EXIT,1);


private FlatMainMIDlet flatMainMidlet = null;


private String userName = null;


private int sI = 0;




/**//*游戏结束类型 1 赢 2 输 3 平手*/


private int overStyle = 0;


private int win = 0;


private int loss = 0;


private int deuce = 0;




/**//*服务链接器*/


StreamConnectionNotifier server = null;


//服务器服务记录


ServiceRecord record=null;


//数据输入流


private DataInputStream dis = null;


//数据输出流


private DataOutputStream dos = null;




public GameServer(FlatMainMIDlet flatMainMidlet ,String name)




...{


super(true);


this.flatMainMidlet = flatMainMidlet;


this.userName = name;


g = this.getGraphics();


addCommand(cmdExit);


setCommandListener(this);


halfWidth = this.getWidth()/2;


halfHeight = this.getHeight()/2;


basePointX = halfWidth-87;


basePointY = halfHeight-83;


waitPointX = halfWidth + 10;


waitPointY = halfHeight + 60;


runPointX = halfWidth - 90;


runPointY = halfHeight+15;


loadImage();


new Thread(this).start();


}






public void run() ...{




/**//*创建游戏服务器*/


isRunning = true;


LocalDevice local = null;




try ...{




/**//*设置设备的发现模式,使设备处可发现*/


local = LocalDevice.getLocalDevice();


local.setDiscoverable(DiscoveryAgent.GIAC);




} catch (BluetoothStateException e) ...{


return;


}




try ...{




/**//*开启服务*/


server = (StreamConnectionNotifier)Connector.open(


"btspp://localhost:33333333333333333333333333333333");




/**//*服务器服务记录*/


ServiceRecord record = local.getRecord(server);




/**//*自定义服务记录属性*/


DataElement elm = null;


elm = new DataElement(DataElement.STRING, userName);


record.setAttributeValue(0x1234, elm);


elm = null;


elm = new DataElement(DataElement.STRING, "SCHOLAR_II");


record.setAttributeValue(0x1235, elm);




/**//*更新服务记录属性*/


local.updateRecord(record);




} catch (IOException e) ...{


return;


}


initWaitGameCanvas();




/**//*等待用户的链接*/


StreamConnection conn = null;






try ...{




/**//*等待客户端的链接*/


conn = server.acceptAndOpen();




/**//*客户端链接后,关闭发现模式*/


local.setDiscoverable(DiscoveryAgent.NOT_DISCOVERABLE);




} catch (IOException e) ...{


return;


}




/**//*获得输入输出流*/




try ...{


dis = conn.openDataInputStream();


dos = conn.openDataOutputStream();




} catch (IOException e) ...{


close();


return;




}






while(isRunning)...{




/**//*初使化游戏界面*/


initGameCanvas();




/**//*游戏循环主体*/




while(isGameOver!=true)...{


input();


updateSpriteFrame();


updateGameCanvas();




try ...{


Thread.sleep(400);




} catch (InterruptedException e) ...{


close();


return;


}


}


showGameResult();




/**//*游戏次数加1*/


count++;


}




}






public void commandAction(Command command, Displayable displayable) ...{




if(command == cmdExit)...{




try ...{


Thread.sleep(1000);




} catch (InterruptedException e) ...{


close();


return;


}


close();


flatMainMidlet.showFlatMenu();


}




}




public void loadImage()




...{




try ...{


chessImage = Image.createImage("/clessImage.png");


redAngleImage = Image.createImage("/red_angle.png");


whiteAngleImage = Image.createImage("/white_angle.png");




} catch (IOException e) ...{


flatMainMidlet.showFlatMenu();


}


bgImage = Image.createImage(chessImage, 0, 0, 180, 208,


Sprite.TRANS_NONE);


waitMessImage = Image.createImage(chessImage, 0, 210, 150, 60,


Sprite.TRANS_NONE);


winMessImage = Image.createImage(chessImage,0,270,150,60,


Sprite.TRANS_NONE);


lossMessImage = Image.createImage(chessImage,0,328,150,60,


Sprite.TRANS_NONE);


deuceMessImage = Image.createImage(chessImage,0,390,117,60,


Sprite.TRANS_NONE);


redFruit = Image.createImage(chessImage,164, 209, 16, 19,


Sprite.TRANS_NONE);


whiteFruit = Image.createImage(chessImage,164, 231, 16, 19,


Sprite.TRANS_NONE);


redAngle = new Sprite(redAngleImage,24,32);


whiteAngle = new Sprite(whiteAngleImage,24,32);




}




/** *//**


* 初使化等待界面


*


*/




private void initWaitGameCanvas()...{




/**//*设计背景填充为白色*/


g.setColor(0xFFFFFF);


g.fillRect(0, 0, getWidth(), getHeight());


g.drawImage(bgImage, halfWidth,


halfHeight,Graphics.VCENTER|Graphics.HCENTER);


showWaitMessage();


flushGraphics();


}




private void initGameCanvas()...{


isGameOver = false;


position = 0;




for(int i = 0 ; i <= 4; i++)...{




for(int j = 0; j <= 8; j++)...{


fruitList[i][j] = 0;


}


}




/**//*设置精灵的初使位置*/




if(count%2==0)...{




/**//*设置天使精灵的初使位置*/


redAngle.setPosition(runPointX, runPointY);


whiteAngle.setPosition(waitPointX, waitPointY);




/**//*设置精录的初使帧序列*/


redAngle.setFrameSequence(runFrameSequence);


whiteAngle.setFrameSequence(waitFrameSequence);


redAngleCurrentX = runPointX;


redAngleCurrentY = runPointY;


whiteAngleCurrentX = waitPointX;


whiteAngleCurrentY = waitPointY;




/**//*设置红色天使可运动的状态*/


isRedAngleRunning = true;


}




else...{




/**//*设置天使精灵的初使位置*/


redAngle.setPosition(waitPointX, waitPointY);


whiteAngle.setPosition(runPointX, runPointY);




/**//*设置精录的初使帧序列*/


redAngle.setFrameSequence(waitFrameSequence);


whiteAngle.setFrameSequence(runFrameSequence);


redAngleCurrentX = waitPointX;


redAngleCurrentY = waitPointY;


whiteAngleCurrentX = runPointX;


whiteAngleCurrentY = runPointY;




/**//*设置红色天使可运动的状态*/


isRedAngleRunning = false;




/**//*接收线程*/


new AcceptThread().start();


}










}






/** *//**


* 处理用户输入


*


*/


private void input()




...{




if(isRedAngleRunning)...{


int keyState = getKeyStates();




/**//*向左*/




if((keyState & GameCanvas.LEFT_PRESSED) != 0)...{




if((redAngleCurrentX - angleMoveOffsetX)-runPointX >= 0)...{




redAngleCurrentX = redAngleCurrentX - angleMoveOffsetX;


position--;


//发送数据,新建发送数据线程


new SendThread(redAngleCurrentX).start();


}


}




/**//*向右*/




if((keyState & GameCanvas.RIGHT_PRESSED) != 0)...{




if((redAngleCurrentX + angleMoveOffsetX)-(halfWidth + 70) < 0 )...{


redAngleCurrentX = redAngleCurrentX + angleMoveOffsetX;


position++;


//发送数据,新建发送数据线程


new SendThread(redAngleCurrentX).start();


}




}




/**//*重新设置红色天使精灵的位置*/


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);




/**//*向上*/




if((keyState & GameCanvas.UP_PRESSED) != 0)...{




if(fruitList[4][position] ==0)...{


for(int i=0;i<5;i++)




...{




if(fruitList[i][position]==0)...{




/**//*向水果架放置水果,红萝卜*/


fruitList[i][position]=1;




/**//*判断输或和局*/


int flag = 0;


sI = checkGameOver(i,position);


flag = sI;




if(sI == 1)...{


isGameOver = true;


overStyle = 1;


win++;




}else if(sI == 3)...{


isGameOver = true;


overStyle = 3;


deuce++;


}




/**//*发送数据,新建发送数据线程*/


sI = sI*10000+ 1000 + i*10 + position;


//发送数据,新建发送数据线程


new SendThread(sI).start();


if(flag == 0)


replaceRole();


break;


}




}


}


}


}


}






/** *//**


* 更新游戏画面


*


*/




private void updateGameCanvas()...{




/**//*设计背景填充为白色*/


g.setColor(0xFFFFFF);


g.fillRect(0, 0, getWidth(), getHeight());


g.drawImage(bgImage, halfWidth,


halfHeight,Graphics.VCENTER|Graphics.HCENTER);


showfruits();


showSprites();


flushGraphics();


}




/** *//**


* 更新精灵功画帧


*


*/




private void updateSpriteFrame()...{


redAngle.nextFrame();


whiteAngle.nextFrame();


}




/** *//**


* 显示等待玩家进入的信息条


*


*/




private void showWaitMessage()...{


g.drawImage(waitMessImage, halfWidth - 2,


halfHeight - 25 , Graphics.VCENTER|Graphics.HCENTER);


}




/** *//**


* 显示 平手的信息条


*


*/




private void showDeuceMessage()...{


g.drawImage(deuceMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}




/** *//**


* 显示输的信息条


*


*/




private void showWinMessage()...{


g.drawImage(winMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}






/** *//**


* 显示蠃的信息条


*


*/




private void showLossMessage()...{


g.drawImage(lossMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}






/** *//**


* 显示水果


*


*/




private void showfruits()...{






for(int i=0;i<5;i++)...{


for(int j=0;j<9;j++)




...{


if(fruitList[i][j]!=0)




...{


if(fruitList[i][j]==1)




...{ /**//*绘置红萝卜*/


g.drawImage(redFruit, basePointX + j*18,


basePointY + i*20, Graphics.TOP|Graphics.LEFT);


}


else




...{ /**//*绘置白萝卜*/


g.drawImage(whiteFruit, basePointX + j*18,


basePointY + i*20, Graphics.TOP|Graphics.LEFT);


}


}


}


}


}




/** *//**


* 显示精灵


*


*/




private void showSprites()...{


redAngle.paint(g);


whiteAngle.paint(g);


}




/** *//**


* 置换角色


*/




private void replaceRole()...{






if(isRedAngleRunning)...{


whiteAngleCurrentX = runPointX;


whiteAngleCurrentY = runPointY;


redAngleCurrentX = waitPointX;


redAngleCurrentY = waitPointY;


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);


whiteAngle.setFrameSequence(runFrameSequence);


redAngle.setFrameSequence(waitFrameSequence);


isRedAngleRunning = false;




/**//*接收线程*/


new AcceptThread().start();


}




else...{


whiteAngleCurrentX = waitPointX;


whiteAngleCurrentY = waitPointY;


redAngleCurrentX = runPointX;


redAngleCurrentY = runPointY;


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);


whiteAngle.setFrameSequence(waitFrameSequence);


redAngle.setFrameSequence(runFrameSequence);


isRedAngleRunning = true;


}


position=0;


getKeyStates();


getKeyStates();




/**//*线程暂停*/




try ...{


Thread.sleep(200);




} catch (InterruptedException e) ...{




}


}




/** *//**


* 检测游戏结果/判断放下一个水果后的游戏结果


* @param row 水果架的行号


* @param colu 水果架的列号


* @return 1-赢 3-平手 0-没有结束


*/




private int checkGameOver(int row,int colu)...{




/**//*赢棋的判断*/


int i = 0;


int j = 0;


int k = 0;




/**//*垂直方向上的判断*/




if(row >= 3)...{




for(i=row-1;i >= 0;i--)...{




if(fruitList[i][colu]==1)...{


k++;


}




else...{


break;


}


}


if(k >= 3) return 1;


}






/**//*45角度方向上的判断*/




if((row+colu >= 3)&&(row + colu <= 9 ))...{




/**//*45向上查找*/


k = 0;




for(i = row - 1, j = colu + 1;(i>=0)&&(j<=8);i--,j++ )...{




if(fruitList[i][j] == 1)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}




/**//*45向下查找*/




for(i = row + 1, j = colu - 1; (i <= 4)&&(j >= 0); i++, j--)...{




if(fruitList[i][j] == 1)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}


}




/**//*水平方向上的判断*/


k = 0;




/**//*向左查找*/




for(i = colu - 1; i >= 0; i--)...{




if(fruitList[row][i] == 1)...{


k++;


}




else...{


break;


}


}




if(k>=3)...{


return 1;


}




/**//*向右查找*/




for(i = colu + 1; i <=8 ; i++)...{




if(fruitList[row][i] == 1)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}




/**//*135度方向的判断*/


k = 0;




/**//*135度向上查找*/




for(i = row - 1, j = colu - 1; (i >= 0)&&(j >= 0); i--,j--)...{




if(fruitList[i][j] == 1)...{


k++;


}




else...{


break;


}


}


if(k >= 3)


return 1;




/**//*135度向下查找*/




for(i = row + 1, j = colu + 1; (i <= 4)&&(j <= 8); i++, j++)...{




if(fruitList[i][j] == 1)...{


k++;


}




else...{


break;


}


}


if(k >= 3)


return 1;




/**//*和棋的判断*/




for(i = 0;i <= 8;i++)...{




if(fruitList[4][i] == 0)...{


break;


}


}




if(i==8)...{


return 3;


}


return 0;


}




/** *//**


* 显示游戏结果


*


*/




private void showGameResult()...{




/**//*设计背景填充为白色*/


g.setColor(0xFFFFFF);


g.fillRect(0, 0, getWidth(), getHeight());


g.drawImage(bgImage, halfWidth,


halfHeight,Graphics.VCENTER|Graphics.HCENTER);


showfruits();


showSprites();


g.setColor(0x000000);


g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,


Font.STYLE_BOLD,Font.SIZE_LARGE));


g.drawString("赢 " + win, halfWidth - 20, halfHeight - 60, Graphics.TOP|Graphics.LEFT);


g.drawString("输 " + loss, halfWidth - 20, halfHeight - 30, Graphics.TOP|Graphics.LEFT);


g.drawString("平 " + deuce, halfWidth - 20, halfHeight , Graphics.TOP|Graphics.LEFT);




switch(overStyle)...{




/**//*赢*/


case 1:


showWinMessage();


break;




/**//*输*/


case 2:


showLossMessage();


break;




/**//*和*/


case 3:


showDeuceMessage();


break;


}


flushGraphics();




/**//*暂停3秒后在重新开始游戏*/




try ...{


Thread.sleep(3000);




} catch (InterruptedException e) ...{


close();


flatMainMidlet.showFlatMenu();


}


}




/** *//**


* 关闭连接


*/




public void close() ...{




try ...{




/**//*关闭输入流*/


if (dis != null)




...{


dis.close();


dis = null;


}




/**//*关闭输出流*/


if (dos != null)




...{


dos.close();


dos = null;


}




/**//*关闭服务器*/


if (server != null)




...{


server.close();


server = null;


}




} catch (Exception e) ...{


flatMainMidlet.showFlatMenu();


}


}




/**//*内部类--发送数据的线程类*/




class SendThread extends Thread...{




/**//*要发送的数据*/


private int data;




public SendThread(int data)...{


this.data = data;


}




public void run()...{




if (dos == null) ...{


return;


}




try ...{


dos.writeInt(data);


dos.flush();




} catch (IOException e) ...{


close();


return;


}


}




}




/**//*内部类--接收数据的线程类*/




class AcceptThread extends Thread...{




public void run()...{


int i=10;




while(i<1000)...{




try ...{


i = dis.readInt();




} catch (IOException e) ...{


close();


return;


}




/**//*如果对手与放下水果,结束接收线程*/


if(i>=1000)


break;


whiteAngleCurrentX = i;


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);


}




/**//*分解接收到的数据*/


int j = 0;


int k = 0;


int l = 0;


l = i / 10000;




/**//*最高位为1,对手赢*/




if(l == 1)...{


isGameOver = true;


overStyle = 2;


loss++;


j = (i -11000)/10;


k = (i - 11000)%10;




/**//*最高位为3,平手*/




}else if(l == 3)...{


isGameOver = true;


overStyle = 3;


deuce++;


j = (i - 31000)/10;


k = (i - 31000)%10;




}else...{


j = (i -1000)/10;


k = (i - 1000)%10;


}


fruitList[j][k] = 2;




/**//*没有结束,互换角色*/




if(l == 0)...{


replaceRole();


}


}


}


}//GameServer.java文件结束






/** *//**


* Copyright@scholar_ii


* @author 梧州学院 04计本2班 罗功武


* date 08/03/03


*/


package game;




import java.io.DataInputStream;


import java.io.DataOutputStream;


import java.io.IOException;




import javax.microedition.io.Connector;


import javax.microedition.io.StreamConnection;


import javax.microedition.lcdui.Command;


import javax.microedition.lcdui.CommandListener;


import javax.microedition.lcdui.Displayable;


import javax.microedition.lcdui.Font;


import javax.microedition.lcdui.Graphics;


import javax.microedition.lcdui.Image;


import javax.microedition.lcdui.game.GameCanvas;


import javax.microedition.lcdui.game.Sprite;




import flat.FlatMainMIDlet;






/** *//**


* GameClient 游戏客户端类


* 链接游戏服务器。


* 采用多线程技术,游戏主线,接收数据线程,送收数据线程,


* 三种线程维护游戏的运作。


* 同一时间段内游戏主线程只与一个接收或发送数据线程并行运行


* 游戏中的坐标采用相对坐标,使得游戏的移植性相对好点。


*/




public class GameClient extends GameCanvas implements Runnable, CommandListener ...{




private Image chessImage = null;


private Image bgImage = null;


private Image redFruit = null;


private Image whiteFruit = null;


private Image redAngleImage = null;


private Image whiteAngleImage = null;


private Image winMessImage = null;


private Image lossMessImage = null;


private Image deuceMessImage = null;


private Sprite redAngle = null;


private Sprite whiteAngle = null;


private Graphics g = null;




/**//*游戏逻棋盘-游戏的水果架*/


private int fruitList[][] = new int[5][9];


private int halfWidth = 0;


private int halfHeight = 0;


private int basePointX = 0;


private int basePointY = 0;




/**//*玩家等候时的坐标*/


private int waitPointX = 0;


private int waitPointY = 0;




/**//*玩家运动时的坐标-下棋的状态*/


private int runPointX = 0;


private int runPointY = 0;




/**//*红色天使的当前坐标-对应玩家对手*/


private int redAngleCurrentX = 0;


private int redAngleCurrentY = 0;




/**//*白色天使的当前坐标-对应玩家*/


private int whiteAngleCurrentX = 0;


private int whiteAngleCurrentY = 0;


private int angleMoveOffsetX = 18;




/**//*客户端是否停止链接*/


private boolean isRunning = true;




/**//*游戏是否束结束*/


private boolean isGameOver = false;




/**//*是否玩家在运动-下棋状态*/


private boolean isWhiteAngleRunning ;




private static final int waitFrameSequence[] = ...{0,1,2,3,4,5,6,7,8,9,10,11};




private static final int runFrameSequence[] = ...{0,1,2};


private int position = 0;//---


private int count = 0;


private int overStyle = 0;


private Command cmdExit = new Command("退出游戏",Command.EXIT,1);


private FlatMainMIDlet flatMainMidlet = null;




/**//*链接字符串*/


private String connectURL = null;




/**//*链接流*/


private StreamConnection client = null;




/**//*数据输入流*/


private DataInputStream dis = null;




/**//*数据输出流*/


private DataOutputStream dos = null;


private int sI = 0;


private int win = 0;


private int loss = 0;


private int deuce = 0;


public GameClient(String connectURL, FlatMainMIDlet flatMainMidlet)




...{


super(true);


this.connectURL = connectURL;


this.flatMainMidlet = flatMainMidlet;


g = this.getGraphics();


addCommand(cmdExit);


setCommandListener(this);


halfWidth = this.getWidth()/2;


halfHeight = this.getHeight()/2;


basePointX = halfWidth-87;


basePointY = halfHeight-83;


waitPointX = halfWidth + 10;


waitPointY = halfHeight + 60;


runPointX = halfWidth - 90;


runPointY = halfHeight+15;


loadImage();


new Thread(this).start();


}






public void run() ...{






/**//*链接服务器*/


isRunning = true;




try ...{




/**//*链接服务器*/


client = (StreamConnection)Connector.open(connectURL);




/**//*获得输入输出流*/


dis = client.openDataInputStream();


dos = client.openDataOutputStream();






} catch (Exception e) ...{


return;


}






while(isRunning)...{




/**//*初使化游戏界面*/


initGameCanvas();




/**//*游戏循环主体*/




while(isGameOver!=true)...{


input();


updateSpriteFrame();


updateGameCanvas();




try ...{


Thread.sleep(250);




} catch (InterruptedException e) ...{


e.printStackTrace();


}


}


showGameResult();




/**//*游戏次数自加*/


count++;


}




}






public void commandAction(Command command, Displayable displayable) ...{




/**//*退出游戏*/




if(command==cmdExit)...{




/**//*线程暂停*/




try ...{


Thread.sleep(1000);




} catch (InterruptedException e) ...{


close();


return;


}


close();


flatMainMidlet.showFlatMenu();


}




}




public void loadImage()




...{




try ...{


chessImage = Image.createImage("/clessImage.png");


redAngleImage = Image.createImage("/red_angle.png");


whiteAngleImage = Image.createImage("/white_angle.png");




} catch (IOException e) ...{


flatMainMidlet.showFlatMenu();


//System.out.println("图片加载出错");


}


bgImage = Image.createImage(chessImage, 0, 0, 180, 208,


Sprite.TRANS_NONE);


winMessImage = Image.createImage(chessImage,0,270,150,60,


Sprite.TRANS_NONE);


lossMessImage = Image.createImage(chessImage,0,328,150,60,


Sprite.TRANS_NONE) ;


deuceMessImage = Image.createImage(chessImage,0,390,117,60,


Sprite.TRANS_NONE);


redFruit = Image.createImage(chessImage,164, 209, 16, 19,


Sprite.TRANS_NONE);


whiteFruit = Image.createImage(chessImage,164, 231, 16, 19,


Sprite.TRANS_NONE);


redAngle = new Sprite(redAngleImage,24,32);


whiteAngle = new Sprite(whiteAngleImage,24,32);




}






private void initGameCanvas()...{


isGameOver = false;




for(int i = 0 ; i <= 4; i++)...{




for(int j = 0; j <= 8; j++)...{


fruitList[i][j] = 0;


}


}


position = 0 ;




/**//*设置精灵的初使位置*/




if(count%2==0)...{




/**//*设置天使精灵的初使位置*/


redAngle.setPosition(runPointX, runPointY);


whiteAngle.setPosition(waitPointX, waitPointY);




/**//*设置精录的初使帧序列*/


redAngle.setFrameSequence(runFrameSequence);


whiteAngle.setFrameSequence(waitFrameSequence);


redAngleCurrentX = runPointX;


redAngleCurrentY = runPointY;


whiteAngleCurrentX = waitPointX;


whiteAngleCurrentY = waitPointY;




/**//*设置红色天使可运动的状态*/


isWhiteAngleRunning = false;




/**//*接收线程*/


new AcceptThread() .start();


}




else...{




/**//*设置天使精灵的初使位置*/


redAngle.setPosition(waitPointX, waitPointY);


whiteAngle.setPosition(runPointX, runPointY);




/**//*设置精录的初使帧序列*/


redAngle.setFrameSequence(waitFrameSequence);


whiteAngle.setFrameSequence(runFrameSequence);


redAngleCurrentX = waitPointX;


redAngleCurrentY = waitPointY;


whiteAngleCurrentX = runPointX;


whiteAngleCurrentY = runPointY;




/**//*设置红色天使可运动的状态*/


isWhiteAngleRunning = true;


}










}






/** *//**


* 处理用户输入


*


*/


private void input()




...{




if(isWhiteAngleRunning)...{


int keyState = getKeyStates();




/**//*向左*/




if((keyState & GameCanvas.LEFT_PRESSED) != 0)...{




if((whiteAngleCurrentX - angleMoveOffsetX)>=runPointX)...{


whiteAngleCurrentX = whiteAngleCurrentX - angleMoveOffsetX;


position--;




/**//*发送数据,新建发送数据线程*/


new SendThread(whiteAngleCurrentX).start();


}


}




/**//*向右*/




if((keyState & GameCanvas.RIGHT_PRESSED) != 0)...{




if((whiteAngleCurrentX + angleMoveOffsetX)<180)...{


whiteAngleCurrentX = whiteAngleCurrentX + angleMoveOffsetX;


position++;


//发送数据,新建发送数据线程


new SendThread(whiteAngleCurrentX).start();




}




}




/**//*重新设置红色天使精灵的位置*/


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);




/**//*向上*/




if((keyState & GameCanvas.UP_PRESSED) != 0)...{




if(fruitList[4][position] ==0)...{


for(int i=0;i<5;i++)




...{




if(fruitList[i][position]==0)...{




/**//*向水果架放置水果,白萝卜*/


fruitList[i][position]=2;




/**//*判断输或和局*/


int flag = 0;


sI = checkGameOver(i,position);


flag = sI;




if(sI == 1)...{


isGameOver = true;


overStyle = 1;


win++;




}else if(sI == 3)...{


isGameOver = true;


overStyle = 3;


deuce++;


}




/**//*发送数据,新建发送数据线程*/


sI = sI*10000+ 1000 + i*10 + position;


new SendThread(sI).start();


if(flag == 0)


replaceRole();


break;


}




}


}


}


}


}






/** *//**


* 更新游戏画面


*


*/




private void updateGameCanvas()...{




/**//*设计背景填充为白色*/


g.setColor(0xFFFFFF);


g.fillRect(0, 0, getWidth(), getHeight());


g.drawImage(bgImage, halfWidth,


halfHeight,Graphics.VCENTER|Graphics.HCENTER);


showfruits();


showSprites();


flushGraphics();


}




/** *//**


* 更新精灵功画帧


*


*/




private void updateSpriteFrame()...{


redAngle.nextFrame();


whiteAngle.nextFrame();


}




/** *//**


* 显示平手的信息条


*


*/




private void showDeuceMessage()...{


g.drawImage(deuceMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}




/** *//**


* 显示输的信息条


*


*/




private void showWinMessage()...{


g.drawImage(winMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}






/** *//**


* 显示误蠃的信息条


*


*/




private void showLossMessage()...{


g.drawImage(lossMessImage, halfWidth - 90,


halfHeight + 104, Graphics.BOTTOM|Graphics.LEFT);


}






/** *//**


* 显示水果


*


*/




private void showfruits()...{






for(int i=0;i<5;i++)...{


for(int j=0;j<9;j++)




...{


if(fruitList[i][j]!=0)




...{


if(fruitList[i][j]==1)




...{ /**//*绘置红萝卜*/


g.drawImage(redFruit, basePointX + j*18,


basePointY + i*20, Graphics.TOP|Graphics.LEFT);


}


else




...{ /**//*绘置白萝卜*/


g.drawImage(whiteFruit, basePointX + j*18,


basePointY + i*20, Graphics.TOP|Graphics.LEFT);


}


}


}


}


}




/** *//**


* 显示精灵


*


*/




private void showSprites()...{


redAngle.paint(g);


whiteAngle.paint(g);


}




/** *//**


* 置换角色


*/




private void replaceRole()...{






if(isWhiteAngleRunning)...{


whiteAngleCurrentX = waitPointX;


whiteAngleCurrentY = waitPointY;


redAngleCurrentX = runPointX;


redAngleCurrentY = runPointY;


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);


whiteAngle.setFrameSequence(waitFrameSequence);


redAngle.setFrameSequence(runFrameSequence);


isWhiteAngleRunning = false;




/**//*接收线程*/


new AcceptThread() .start();


}




else...{


whiteAngleCurrentX = runPointX;


whiteAngleCurrentY = runPointY;


redAngleCurrentX = waitPointX;


redAngleCurrentY = waitPointY;


whiteAngle.setPosition(whiteAngleCurrentX, whiteAngleCurrentY);


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);


whiteAngle.setFrameSequence(runFrameSequence);


redAngle.setFrameSequence(waitFrameSequence);


isWhiteAngleRunning = true;


}


position=0;


getKeyStates();


getKeyStates();




/**//*线程暂停*/




try ...{


Thread.sleep(200);




} catch (InterruptedException e) ...{




}


}




/** *//**


* 检测游戏结果/判断放下一个水果后的游戏结果


* @param row 水果架的行号


* @param colu 水果架的列号


* @return 1-赢 3-平手 0-没有结束


*/




private int checkGameOver(int row,int colu)...{




/**//*赢棋的判断*/


int i = 0;


int j = 0;


int k = 0;




/**//*垂直方向上的判断*/




if(row >= 3)...{




for(i=row-1;i >= 0;i--)...{




if(fruitList[i][colu]==2)...{


k++;


}




else...{


break;


}


}


}




if(k >= 3)...{


return 1;


}




/**//*45角度方向上的判断*/




if((row+colu >= 3)&&(row + colu <= 9 ))...{




/**//*45向上查找*/


k = 0;




for(i = row - 1, j = colu + 1;(i>=0)&&(j<=8);i--,j++ )...{




if(fruitList[i][j] == 2)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}




/**//*45向下查找*/




for(i = row + 1, j = colu - 1; (i <= 4)&&(j >= 0); i++, j--)...{




if(fruitList[i][j] == 2)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}




}






/**//*水平方向上的判断*/


k = 0;




/**//*向左查找*/




for(i = colu - 1; i >= 0; i--)...{




if(fruitList[row][i] == 2)...{


k++;


}




else...{


break;


}


}




if(k>=3)...{


return 1;


}




/**//*向右查找*/




for(i = colu + 1; i <=8 ; i++)...{




if(fruitList[row][i] == 2)...{


k++;


}




else...{


break;


}


}




if(k >= 3)...{


return 1;


}




/**//*135度方向的判断*/


k = 0;




/**//*135度向上查找*/




for(i = row - 1, j = colu - 1; (i >= 0)&&(j >= 0); i--,j--)...{




if(fruitList[i][j] == 2)...{


k++;


}




else...{


break;


}


}


if(k >= 3)


return 1;




/**//*135度向下查找*/




for(i = row + 1, j = colu + 1; (i <= 4)&&(j <= 8); i++, j++)...{




if(fruitList[i][j] == 2)...{


k++;


}




else...{


break;


}


}


if(k >= 3)


return 1;




/**//*和棋的判断*/




for(i = 0;i < 9;i++)...{




if(fruitList[4][i] == 0)...{


break;


}


}




if(i==8)...{


return 3;


}


return 0;


}




/** *//**


* 显示游戏结果


*


*/




private void showGameResult()...{




/**//*设计背景填充为白色*/


g.setColor(0xFFFFFF);


g.fillRect(0, 0, getWidth(), getHeight());


g.drawImage(bgImage, halfWidth,


halfHeight,Graphics.VCENTER|Graphics.HCENTER);


showfruits();


showSprites();


g.setColor(0x000000);


g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,


Font.STYLE_BOLD,Font.SIZE_LARGE));


g.drawString("赢 " + win, halfWidth - 20, halfHeight -60, Graphics.TOP|Graphics.LEFT);


g.drawString("输 " + loss, halfWidth - 20, halfHeight - 30, Graphics.TOP|Graphics.LEFT);


g.drawString("平 " + deuce, halfWidth - 20, halfHeight , Graphics.TOP|Graphics.LEFT);




switch(overStyle)...{




/**//*赢*/


case 1:


showWinMessage();


break;




/**//*输*/


case 2:


showLossMessage();


break;




/**//*和*/


case 3:


showDeuceMessage();


break;


}


flushGraphics();




/**//*暂停3秒后在重新开始游戏*/




try ...{


Thread.sleep(3000);




} catch (InterruptedException e) ...{


e.printStackTrace();


}


}




/** *//**


* 关闭连接


*/




public void close() ...{




try ...{




/**//*关闭输入流*/


if (dis != null)




...{


dis.close();


dis = null;


}




/**//*关闭输出流*/


if (dos != null)




...{


dos.close();


dos = null;


}




/**//*关闭客户端链接流*/


if (client != null)




...{


client.close();


client = null;


}




} catch (Exception e) ...{


}


}




/**//*内部类--发送数据的线程类*/




class SendThread extends Thread...{




/**//*要发送的数据*/


private int data;




public SendThread(int data)...{


this.data = data;


}




public void run()...{




if (dos == null) ...{


return;


}




try ...{


dos.writeInt(data);


dos.flush();




} catch (IOException e) ...{


close();


return;


}


}




}




/**//*内部类--接收数据线程类*/




class AcceptThread extends Thread...{




public void run()...{


int i=10;




while(i<1000)...{




try ...{




if(dis == null)...{


return;


}


i = dis.readInt();




} catch (IOException e) ...{


close();


return;


}




/**//*如果对手与放下水果,结束接收线程*/


if(i>=1000)


break;


redAngleCurrentX = i;


redAngle.setPosition(redAngleCurrentX, redAngleCurrentY);


}




/**//*分解接收到的数据*/


int j = 0;


int k = 0;


int l = 0;


l = i / 10000;




/**//*最高位为1,对手赢*/




if(l == 1)...{


isGameOver = true;




/**//*故自己输*/


overStyle = 2;


loss++;




/**//*分离出对手放的水果的坐标*/


j = (i -11000)/10;


k = (i - 11000)%10;




/**//*最高位为3,平手*/




}else if(l == 3)...{


isGameOver = true;


overStyle = 3;


deuce++;


j = (i - 31000)/10;


k = (i - 31000)%10;




}else...{


j = (i -1000)/10;


k = (i - 1000)%10;


}


fruitList[j][k] = 1;




/**//*没有结束,互换角色*/




if(l == 0)...{


replaceRole();


}


}


}




}//GameClient .java文件结束

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息