急需修改tank游戏编程!!!

wy963971867 2012-04-27 10:05:46
package com.Tank;
import java.awt.*;

import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class Mytank2 extends JFrame{

MyPanel mp=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Mytank2 t=new Mytank2();
}
public Mytank2()
{

mp=new MyPanel();
//启动线程
Thread t=new Thread(mp);
t.start();
this.add(mp);
//注册监听

this.addKeyListener(mp);
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

}
//我的画板
class MyPanel extends JPanel implements KeyListener,Runnable
{
//定义我的tank
Hero hero=null;
//定义敌人的tank
Vector<EnemyTank> ets=new Vector<EnemyTank>();
//定义炸弹集合
Vector<Bomb> bombs=new Vector<Bomb>();
int enSize=3;
//定义三张图片,三张图片组成一个炸弹
Image image1=null;
Image image2=null;
Image image3=null;
//构造函数
public MyPanel()
{
hero=new Hero(100,100);
//初始化敌人的tank
for(int i=0;i<enSize;i++)
{
//创建一辆敌人的tank
EnemyTank et=new EnemyTank((i+1)*50,0);
et.setColor(0);
et.setDirect(2);
//启动敌人tank
Thread t=new Thread(et);
t.start();
ets.add(et);
}
//初始化图片
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
}
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 400, 300);
//画出自己的tank(扩展)
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
//从ss中取出子弹并绘画
for(int i=0;i<hero.ss.size();i++)
{
Shot myShot=hero.ss.get(i);
//画出子弹
if(myShot!=null&&myShot.isLive==true)
{
g.draw3DRect(myShot.x, myShot.y, 1, 1, false);
}
if(myShot.isLive==false)
{
//从ss中删除该子弹
hero.ss.remove(myShot);
}
}
//画出炸弹
for(int i=0;i<bombs.size();i++)
{
System.out.println("bombs.size()"+bombs.size());
//取出炸弹
Bomb b=bombs.get(i);
if(b.life>6)
{
g.drawImage(image1, b.x, b.y, 30, 30, this);
}else if(b.life>3)
{
g.drawImage(image2, b.x, b.y, 30, 30, this);

}else{
g.drawImage(image3, b.x, b.y, 30, 30, this);
}
//让b的生命值减少
b.lifeDown();
//如果生命值为0,就把炸弹从向量中除去
if(b.life==0)
{
bombs.remove(b);
}
}
//画出敌人的tank
for(int i=0;i<ets.size();i++)
{
EnemyTank et=ets.get(i);
if(et.isLive)
{
this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0);
}
}
}
//写一个函数专门判断子弹是否击中敌人堂克
public void hitTank(Shot s,EnemyTank et)
{
//判断该堂课的方向
switch(et.direct)
{
//如果堂克是向上或向下
case 0:
case 2:
if(s.x>et.x&&s.x<et.x+20&&s.y>et.y&&s.y<et.y+30)
{
//击中
//子弹死亡
s.isLive=false;
//敌人堂克死亡
et.isLive=false;
//创建一颗炸弹,放入vector中
Bomb b=new Bomb(et.x,et.y);
//放入vector中
bombs.add(b);
}
case 1:
case 3:
if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20)
{

//击中
//子弹死亡
s.isLive=false;
//敌人堂克死亡
et.isLive=false;
//创建一颗炸弹,放入vector中
Bomb b=new Bomb(et.x,et.y);
//放入vector中
bombs.add(b);
}

}

}
//画出tank的函数(封装函数)
public void drawTank(int x,int y,Graphics g,int direct,int type)
{
//判断是什么样的tank
switch(type)
{
case 0 :
g.setColor(Color.CYAN);
break;
case 1 :
g.setColor(Color.yellow);
break;
}
//判断方向
switch(direct)
{
//向上
case 0 :
//画tank
//画出左边的矩形
g.fill3DRect(x, y, 5, 30,false);
//画出右边的矩形
g.fill3DRect(x+15, y, 5, 30,false);
//画出中间的矩形
g.fill3DRect(x+5, y+5, 10, 20,false);
//画圆形
g.fillOval(x+5, y+10, 10, 10);
//画出直线
g.drawLine(x+10, y+15,x+10, y);
break;
case 1 :
//炮筒向右
//画出上面的矩形
g.fill3DRect(x, y, 30, 5,false);
//画出下面的矩形
g.fill3DRect(x, y+15, 30, 5,false);
//画出中间的矩形
g.fill3DRect(x+5, y+5, 20, 10,false);
//画圆形
g.fillOval(x+10, y+5, 10, 10);
//画出直线
g.drawLine(x+15, y+10,x+30, y+10);
break;
case 2 :
//炮筒向下
//画出左边的矩形
g.fill3DRect(x, y, 5, 30,false);
//画出右边的矩形
g.fill3DRect(x+15, y, 5, 30,false);
//画出中间的矩形
g.fill3DRect(x+5, y+5, 10, 20,false);
//画圆形
g.fillOval(x+5, y+10, 10, 10);
//画出直线
g.drawLine(x+10, y+15,x+10, y+30);
break;
case 3 :
//炮筒向左
//画出左边的矩形
g.fill3DRect(x, y, 30, 5,false);
//画出右边的矩形
g.fill3DRect(x, y+15, 30, 5,false);
//画出中间的矩形
g.fill3DRect(x+5, y+5, 20, 10,false);
//画圆形
g.fillOval(x+10, y+5, 10, 10);
//画出直线
g.drawLine(x+15, y+10,x, y+10);
break;
}
}
@Override
//按下A(左) S(下) W(上) D(右)键
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getKeyCode()==KeyEvent.VK_W)
{
//设置我的tank方向
this.hero.setDirect(0);
this.hero.moveUp();
}else if(arg0.getKeyCode()==KeyEvent.VK_D)
{
this.hero.setDirect(1);
this.hero.moveRight();
}
else if(arg0.getKeyCode()==KeyEvent.VK_S)
{
this.hero.setDirect(2);
this.hero.moveDown();
}
else if(arg0.getKeyCode()==KeyEvent.VK_A)
{
this.hero.setDirect(3);
this.hero.moveLeft();
}
if(arg0.getKeyCode()==KeyEvent.VK_J)
{
//判断玩家是否按下J
//开火
System.out.println("this.hero.ss.size()"+this.hero.ss.size());
if(this.hero.ss.size()<=4)
{
this.hero.shotEnemy();
}
}
//必需重绘窗口
this.repaint();

}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void run() {
// TODO Auto-generated method stub
//每个100秒去重绘
while(true)
{
try
{
Thread.sleep(100);
}
catch(Exception e)
{

e.printStackTrace();
}
//判断是否击中
for(int i=0;i<hero.ss.size();i++)
{
//取出子弹
Shot myShot=hero.ss.get(i);
//判断子弹是否有效
if(myShot.isLive)
{
//取出每个堂克与之判断
for(int j=0;j<ets.size();j++)
{
//取出堂克
EnemyTank et=ets.get(j);
if(et.isLive)
{
this.hitTank(myShot, et);
}

}
}

}
//重绘
this.repaint();
}
}
}



还有
tank的成员这两个在同一代码里测试的用上面的,下面的是他的成员方法以及类

package com.Tank;

import java.awt.Color;
import java.util.Vector;
//炸弹类
class Bomb
{
//定义炸弹的坐标
int x,y;
//炸弹的生命
int life=9;
boolean isLive=true;
public Bomb(int x,int y)
{
this.x=x;
this.y=y;
}
//减少生命值
public void lifeDown()
{
if(life>0)
{
life--;
}else{
this.isLive=false;
}

}
}
//子弹类
class Shot implements Runnable
{
int x;
int y;
int direct;
int speed=1;
//是否还活着
boolean isLive=true;
public Shot(int x,int y,int direct)
{

this.x=x;
this.y=y;
this.direct=direct;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(50);
}
catch(Exception e)
{
}
switch(direct)
{//向上
case 0:
y-=speed;
break;
case 1:
x+=speed;
break;
case 2:
y+=speed;
break;
case 3:
x-=speed;
break;

}
//System.out.println("子弹坐标x="+x+"y="+y);
//判断子弹是否到边缘
if(x<0||x>400||y<0||y>300)
{
this.isLive=false;
break;
}
}
}
}
class Tank
{
//tank横坐标
int x=0;
int y=0;
//堂克方向
//按下0(上) 1(右) 2(下) 3(左)键
int direct=0;
//堂克速度
int speed=2;
int color;
public Tank(int x,int y)
{
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}

}
//敌人tank,做成线程类
class EnemyTank extends Tank implements Runnable
{
boolean isLive=true;
public EnemyTank(int x,int y)
{

super(x,y);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
switch(this.direct)
{//向上

case 0:
for(int i=0;i<30;i++)
{
if(y>0)
{
y-=speed;
}
try
{
Thread.sleep(50);
}
catch(Exception e)
{
e.printStackTrace();
}
}
break;

case 1:
for(int i=0;i<30;i++)
{if(x<400)
{
x+=speed;
}
try
{
Thread.sleep(50);
}
catch(Exception e)
{
e.printStackTrace();
}
}

break;
case 2:
for(int i=0;i<30;i++)
{if(y<300)
{
y+=speed;
}
try
{
Thread.sleep(50);
}
catch(Exception e)
{
e.printStackTrace();
}
}
break;
case 3:
for(int i=0;i<30;i++)
{if(x>0)
{
x-=speed;
}
try
{
Thread.sleep(50);
}
catch(Exception e)
{
e.printStackTrace();
}
}
break;

}
//让tank产生随机方向
this.direct=(int)(Math.random()*4);
//判断敌人tank是否死亡
if(this.isLive==false)
{
//让敌人tank死亡退出线程
}
break;
}

}
}
//我的tank
class Hero extends Tank
{
//子弹

Vector<Shot> ss=new Vector<Shot>();
Shot s=null;

public Hero(int x,int y)
{
super(x,y);

}
//开火
public void shotEnemy()
{

switch(this.direct)
{
case 0 :
s=new Shot(x+10,y,0);
ss.add(s);
break;
case 1 :
s=new Shot(x+30,y+10,1);
ss.add(s);
break;
case 2 :
s=new Shot(x+10,y+30,2);
ss.add(s);
break;
case 3 :
s=new Shot(x,y+10,3);
ss.add(s);
break;
}
//启动子单线程
Thread t=new Thread(s);
t.start();
}
//tank向上移动
public void moveUp()
{
y-=speed;
}
//tank向右移动
public void moveRight()
{
x+=speed;
}
//tank向下移动
public void moveDown()
{
y+=speed;
}
//tank向左移动
public void moveLeft()
{
x-=speed;
}

}
我想要的结果是敌人tank随机乱动,并且不能碰到区域
...全文
122 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

58,455

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧