drawingPanel()和setBackground(Color c)创建一个面板并设置背景颜色,再通过setBounds()和setLayout()方法定义了页面的大小并将页面布局定义为空。通过add()方法向页面添加按钮和文本框。使用setColor(Color c)方法设置面板颜色为指定颜色,再通过继承自java.awt.Graphics类中的drawString(String,int,int)方法向面板添加并输出当前关数及剩余敌人数,通过if判断语句进行判断,如果消灭坦克数量大于敌方坦克数量则输出胜利场景。
4.2子弹功能设计
该模块用setColor()方法设置子弹颜色为浅灰色,使用g.fillRect(int,int,int,int)方法设置子弹水平或垂直发射时的形状,子弹和什么东西相交通过if()判断语句和equals()方法来鉴定,然后再处理相交时子弹和其他对象的属性变化。具体代码如下:
public void draw(Graphics g) { }
if(!border.intersects(map)){
8
g.setColor(Color.lightGray); if(direction == 0 || direction == 1)
g.fillRect(border.x + 1, border.y +1, 3, 9); g.fillRect(border.x +1, border.y + 1, 9, 3); if(direction == 2 || direction == 3)
gameModel.removeActor(this); notifiyOwner(); makeBomb(); writeToOutputLine(); return;
if(gameModel.actors[i].getType().equals(\
Steelwall temp =(Steelwall)gameModel.actors[i];
if(!temp.walldestoried){
temp.damageWall(border,bulletpower,direction);
}
wall temp = (wall)gameModel.actors[i]; if(!temp.walldestoried){ }
bullet temp = (bullet)gameModel.actors[i]; if(temp.owner.getType().equals(\hitTarget = true;
if(temp.bulletdestoried)
hitTarget = true;
hitTarget = true;
if(temp.bulletdestoried)
}else if(gameModel.actors[i].getType().equals(\
temp.damageWall(border,bulletpower,direction);
}else if(gameModel.actors[i].getType().equals(\
} }
gameModel.removeActor(this); notifiyOwner(); makeBomb(); writeToOutputLine(); return; }
}
}
gameModel.removeActor(gameModel.actors[i]); temp.notifiyOwner(); }
if(owner.getType().equals(\
player temp = (player)gameModel.actors[i]; temp.hurt(); }else{ }
hitTarget = true;
}else if(gameModel.actors[i].getType().equals(\
}else if }
enemy temp = (enemy)gameModel.actors[i]; player tempe = (player)owner; if(temp.health == 0)
tempe.scores+=temp.type*100; temp.hurt(); hitTarget = true;
base temp = (base)gameModel.actors[i]; temp.doom(); hitTarget = true;
gameModel.gameOver = true;
(gameModel.actors[i].getType().equals(\
}else if(gameModel.actors[i].getType().equals(\
if(hitTarget){
4.3坦克功能设计
坦克吃掉了什么特殊武器图标通过if()判断语句和equals()方法来鉴定,如果吃到TNT图标,则已经出现了的敌方坦克全部被炸毁;如果吃到坦克图标,玩家坦克加一条生命;如果吃到五角星图标,则提升玩家坦克子弹火力并且速度加快,可以打破铁墙;若是头盔图标,则玩家坦克获得防护盾且免疫敌方子弹;如果吃到铁墙图标,则基地由普通墙变为铁墙,如果吃到钟表图标,
9
则时间停止,所有敌方坦克静止。具体代码如下:
if(gameModel.actors[i].getType().equals(\
scores+=50;powerUp temp = (powerUp)gameModel.actors[i]; int function = temp.function; if(function == 0){ upgrade();
}else if(function == 1){ base tempe = (base)gameModel.actors[4];tempe.steelWallTime = 600; }else if(function == 2){
for(int j = 0; j < gameModel.actors.length; j++)
if(gameModel.actors[j] != null)
if(gameModel.actors[j].getType().equals(\
enemy tempe = (enemy)gameModel.actors[j];
gameModel.addActor(new bomb(tempe.xPos, tempe.yPos, \
gameModel));
gameModel.removeActor(gameModel.actors[j]);}
level.NoOfEnemy = 0;level.deathCount = 20 - level.enemyLeft;}else if(function == 3){ InvulnerableTime = 300 + (int)Math.random()*400; }else if(function == 4){
enemy.freezedTime = 300 + (int)Math.random()*400;
enemy.freezedMoment = ServerModel.gameFlow;
}else if(function == 5){
if(status < 3)numberOfBullet++;
status =4;health = 2;if(type.equals(\else
for(int j = 0; j < 4; j ++)
for(int j = 0; j < 4; j ++)textures[j] = gameModel.textures[66+j];
textures[j] = gameModel.textures[84+j];
}else if(function == 6){ life++;} 4.4服务器设计 4.4.1 ServerModel类
在ServerModel类,实现了ActionListener接口,具备了监听功能。创建了一些连接变量和游戏变量,设置了布尔类型的服务器状态变量,使用构造器完成了消息队列信息的设置,使用createServer(){}方法建立主机,当布尔变量serverCreated的值为true时,主机创建成功,还设置了一个端口号,用try{}catch{}语句处理代码执行时发生的异常,并给出错误提示,服务器通过accept()方法与客户端建立连接,当端口号没有被其他应用程序占用并IP地址正确,则成功完成连接,载入游戏,如若不然,就会显示相应的错误提示。使用addMessage()在屏幕上显示消息,使用removeMessage()方法删除屏幕上的消息,通过addActor()和remove()方法完成了向地图中增添新的物体对象和清除已经不存在了的物体对象的操作。具体代码如下:
public void createServer(){
10
addMessage(\正在建立主机(端口9999)\try {
serverSocket = new ServerSocket(9999); serverCreated = true;
} catch (Exception e) {
addMessage(\无法建立主机,请确认端口9999没有被别的程序使用\ System.out.println(e); t.stop();
return;
}
addMessage(\建立完成,等待玩家连接\ try {
clientSocket = serverSocket.accept();
clientConnected = true; out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
} catch (Exception e) {
addMessage(\连接中出现错误,请重新建立主机\ serverCreated = false; clientConnected = false; t.stop(); try{ serverSocket.close(); clientSocket.close(); out.close();
in.close();
}catch(Exception ex){}
return;
}
view.messageField.setEnabled(true);
addMessage(\玩家已连接上,开始载入游戏\ out.println(\ textures = new Image[88];
for(int i = 1; i < textures.length+1; i++)
textures[i-1] = Toolkit.getDefaultToolkit().getImage(\ actors = new Actor[400]; level.loadLevel(this); P1 = new player(\ addActor(P1);
P2 = new player(\
addActor(P2);
11
}
public void addMessage(String message){
}
if(messageIndex < 8){ } else{ }
if(messageIndex == 0)
return; messageIndex--;
for(int i = 0; i < messageIndex; i++)
messageQueue[i] = messageQueue[i+1]; messageQueue[messageIndex] = null; if(!gameStarted)
view.mainPanel.repaint(); for(int i = 0; i < 7; i++)
messageQueue[i] = messageQueue[i+1]; messageQueue[7] = message;
messageQueue[messageIndex] = message; messageIndex++;
}
for(int i = 0; i < actors.length; i ++ ) }
if(actors[i] == actor){
actors[i] = null; break;
gameStarted = true;
view.mainPanel.actors = actors; view.mainPanel.gameStarted = true;
addMessage(\载入完毕,游戏开始了!\
public void removeActor(Actor actor){
public void removeMessage(){
4.4.2 feedbackHandler类
feedbackHandler类从客户端程序解码指令字符串,然后将字符串转换为真正的指令。通过while(!instruction.substring(i, i+1).equals(\?\语句来判断其指令,并根据其指令来完成相对性的操作。
4.4.3 其他各类设计
Lever类设置了不同的关卡,通过if(1+ (currentLevel-1)%8 == num){}判断语句来加入关卡,在进入下一关卡时,上一个关卡的所有东西都会被系统清理,并且增加了游戏难度。同时还设置了胜利场景。
12