我编的坦克大战到底是什么问题 老是报错 代码都是从

学习JAVA一个月了,贴出自己做的一个小游戏代码
&&&自己编了一个坦克大战的游戏,每个坦克每个炮弹都是独享自己的线程,但是线程间通信还有点问题。
&& 以下是代码:
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.*;
public class Tank3 extends JFrame {
&private static final long serialVersionUID =
&&Tank3( String title ){
&&this.setTitle(title) ;
//窗体名称
&&this.setSize(415 , 500) ;
//窗体大小
&&this.setLocation(300 , 300) ;
//窗体位置
&&this.setBackground(Color.WHITE)
&&MyTank3 singlePlayer1 = new
MyTank3();// 类Mytank3中包含所有游戏信息
&&this.add( singlePlayer1
&&this.addKeyListener(singlePlayer1);
Thread(singlePlayer1).start();
//&&MyBullet3 singlePlayer2 = new
MyBullet3();
//&&this.add( singlePlayer2
//&&this.addKeyListener(singlePlayer2);
Thread(singlePlayer2).start();
&public static void main(String[] args) {
&&Tank3 h = new
Tank3("坦克大战(版本1.1)") ;
&&h.setVisible(true) ;
// 存储地图网格数据的类,以判断坦克碰撞,0为可行区域,大于0为不可行区域
class groundData {&
&volatile public int ground[][] = new int
//主线程,我方坦克线程,paint线程&&
三合一& (这里应该更明确地对象化)
class MyTank3 extends JPanel implements KeyListener ,Runnable{
&private static final long serialVersionUID =
&groundData o = new
groundData();//地图数据,会在本线程中实时更新
&int perStep = 1, sleepTime =
7;//线程的睡眠时间以及每次睡眠后坦克移动的像素
&int x = 105 ,& y = 355
;//我方坦克出生点
&int op = 0 ; // 0:up 1:right 2:down 3:left
&int tankStep = 0; //用于在tank移动中计数
&int life = 100 , score = 0 , difficulty = 20 ;
//生命,得分,难度
&int enemyNum = 0 , enemyMax =
6;//现有敌人数量,画面允许敌人的最大数量
&boolean stuck =//坦克是否无法前行
&MyBullet3 bullet = new MyBullet3();//我方坦克炮弹
&//敌方坦克炮弹
&MyBullet3 sBullet = new MyBullet3();
&MyBullet3 enemyBullet[] =
{sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,
&&&sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,
&&&sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,
&&&sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet};
&//敌方坦克
&EnemyTank sEnemy = new
EnemyTank(2,5,5,o,-2);
&EnemyTank enemy[] =
{sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,
&&&sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,
&&&sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,
&&&sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy,sEnemy};
&//绘制坦克方法,i为坦克标号,我方为1,敌方大于1
&public void drawTank ( Graphics g , int op , int
x ,int y,int i){
&&if( i == 1 ){
&&&g.setColor(Color.yellow);//我方黄色,敌方红色
&&&g.setColor(Color.red);
&&if(op == 0) {
&&&g.fillRect(x
, y , 40 , 40) ; //坦克体
&&&g.setColor(Color.black)
&&&g.drawRect(x
+ 10, y + 5, 20 , 20 );//轮廓
&&&g.drawRect(x
, y , 40 , 40 );
&&&g.drawRect(x
- 5, y - 5, 10 , 50 );//左右两侧履带
&&&g.fillOval(x
- 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 5 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 15 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 25 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 35 , 10 , 10) ;
&&&g.drawRect(x
+ 35 , y - 5, 10 , 50 );
&&&g.fillOval(x
+ 35 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 15 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 25 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 35 , 10 , 10) ;
&&&g.fillRect(x
+ 15 , y - 20 , 10 , 40) ; //炮口
&&&g.fillOval(x
+ 5 , y + 30 , 10 , 10) ; //天线
&&&g.fillOval(x
+ 25 , y + 30 , 10 , 10) ;
&&}// end of if ( op == 1 )
&&if(op == 1) {
&&&g.fillRect(x
, y , 40 , 40) ;
&&&g.setColor(Color.black)
&&&g.drawRect(x
+ 15, y + 10, 20 , 20 );
&&&g.drawRect(x
, y , 40 , 40 );
&&&g.drawRect(x
- 5, y - 5, 50 , 10 );
&&&g.fillOval(x
- 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 15 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 25 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y - 5 , 10 , 10) ;
&&&g.drawRect(x
- 5 , y + 35, 50 , 10 );
&&&g.fillOval(x
- 5 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 5 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 15 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 25 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y+35 , 10 , 10) ;
&&&g.fillRect(x
+ 20 , y + 15 , 40 , 10) ;
&&&g.fillOval(x
, y + 5 , 10 , 10) ;
&&&g.fillOval(x
, y + 25 , 10 , 10) ;
&&}// end of if (op==2)
&&if(op == 2) {
&&&g.fillRect(x
, y , 40 , 40) ;
&&&g.setColor(Color.black)
&&&g.drawRect(x
+ 10, y + 15, 20 , 20 );
&&&g.drawRect(x
, y , 40 , 40 );
&&&g.drawRect(x
- 5, y - 5, 10 , 50 );
&&&g.fillOval(x
- 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 5 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 15 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 25 , 10 , 10) ;
&&&g.fillOval(x
- 5 , y + 35 , 10 , 10) ;
&&&g.drawRect(x
+ 35 , y - 5, 10 , 50 );
&&&g.fillOval(x
+ 35 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 15 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 25 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y + 35 , 10 , 10) ;
&&&g.fillRect(x
+ 15 , y + 20 , 10 , 40) ;
&&&g.fillOval(x
+ 5 , y , 10 , 10) ;
&&&g.fillOval(x
+ 25 , y , 10 , 10) ;
&&} //end of if ( op == 3 )
&&if(op == 3) {
&&&g.fillRect(x
, y , 40 , 40) ;
&&&g.setColor(Color.black)
&&&g.drawRect(x
+ 5, y + 10, 20 , 20 );
&&&g.drawRect(x
, y , 40 , 40 );
&&&g.drawRect(x
- 5, y - 5, 50 , 10 );
&&&g.fillOval(x
- 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 5 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 15 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 25 , y - 5 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y - 5 , 10 , 10) ;
&&&g.drawRect(x
- 5 , y + 35, 50 , 10 );
&&&g.fillOval(x
- 5 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 5 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 15 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 25 , y+35 , 10 , 10) ;
&&&g.fillOval(x
+ 35 , y+35 , 10 , 10) ;
&&&g.fillRect(x
- 20 , y + 15 , 40 , 10) ;
&&&g.fillOval(x
+ 30 , y + 5 , 10 , 10) ;
&&&g.fillOval(x
+ 30 , y + 25 , 10 , 10) ;
&&}&//end of if
( op == 4 )
&public void paint( Graphics g ){
&&super.paint(g);
&&this.setBackground(Color.WHITE);
&&//设置下方血条和得分的显示
&&g.setColor(Color.black) ;
&&g.fillRect(0 , 400 , 415 , 100)
&&g.setColor(Color.red) ;
&&g.fillRect(50 , 420 , life * 3
&&//为坦克的阻塞区域填色,调试用
//&&for ( int i = 0; i
& 18 ; i++ )
//&&&for ( int j
= 0; j & 18 ; j++ )
(o.ground[i][j] == 1 ) {
//&&&&&g.setColor(Color.red)
//&&&&&g.fillRect((i-1)*25,
(j-1)*25, 25, 25);}
//&&&&else&if
(o.ground[i][j] == 2 ) {
//&&&&&g.setColor(Color.blue)
//&&&&&g.fillRect((i-1)*25,
(j-1)*25, 25, 25);}
//&&&&else&if
(o.ground[i][j] == 3 ) {
//&&&&&g.setColor(Color.yellow)
//&&&&&g.fillRect((i-1)*25,
(j-1)*25, 25, 25);}
//&&&&else&if
(o.ground[i][j] == 4 ) {
//&&&&&g.setColor(Color.green)
//&&&&&g.fillRect((i-1)*25,
(j-1)*25, 25, 25);}
//&&&&else&if
(o.ground[i][j] == 5 ) {
//&&&&&g.setColor(Color.gray)
//&&&&&g.fillRect((i-1)*25,
(j-1)*25, 25, 25);}
&&g.setColor(Color.white) ;
&&g.drawString("生命:" , 10 , 430 )
&&g.drawRect(50 , 420 , 300 , 10)
&&g.drawString("得分:&
"+ score , 10 , 450) ;
&&g.setColor(Color.gray);
&&//画网格线,调试用&&
//&&for ( int i = 0; i
&= 405 ; i = i+50) {
//&&&g.drawLine(0,
i , 425, i);
//&&&g.drawLine(i,
0, i, 450);
&&//绘制本方坦克
&&drawTank( g , op , x , y , 1
&&//绘制本方炮弹
&&if ( bullet.flying ){
&&&g.fillOval(bullet.bx,
bullet.by, 10, 10);
&&//绘制敌方坦克与炮弹
&&for (int i = 0; i
& enemyN i++)
&&if (enemy[i]!=null)
(enemy[i].alive){&
&&&drawTank ( g
, enemy[i].op , enemy[i].x , enemy[i].y , i+2);
(enemyBullet[i].flying) g.fillOval(enemyBullet[i].bx,
enemyBullet[i].by, 10, 10);
&//坦克前行
&public void stepForward(MyTank3 ref){
&&if (tankStep &
0){//为对齐格子,每次必须行进25像素
&&&switch (op)
&&&case 0 :
= ref.y - perS
&&&&ref.tankStep
&&&case 1 :
= ref.x + perS
&&&&ref.tankStep
&&&case 2 :
= ref.y + perS
&&&&ref.tankStep
&&&case 3 :
= ref.x - perS
&&&&ref.tankStep
&public void run() {
&&int j = 0 , i = 0;
&&//将地图四周设置成最高的阻塞等级
&&for ( i=0; i&18
&&&o.ground[0][i]
&&&o.ground[17][i]
&&&o.ground[i][0]
&&&o.ground[i][17]
&&//我方坦克出生点,坦克的阻塞等级为坦克标号,即1
&&o.ground[(int)((x+20)/25)][(int)((y+20)/25)]=1;
&&o.ground[(int)((x+45)/25)][(int)((y+20)/25)]=1;
&&o.ground[(int)((x+20)/25)][(int)((y+45)/25)]=1;
&&o.ground[(int)((x+45)/25)][(int)((y+45)/25)]=1;//由像素坐标转到游戏坐标
&&//大循环
&&for (int a = 0;
a&60000; a++){
&&&stepForward(this);//行进
(tankStep==13){//行进一半时移动格子的阻塞属性以配合坦克移动
&&&&switch
&&&&&i=(int)((x+20)/25);
&&&&&j=(int)((y+32)/25);
&&&&&o.ground[i][j-1]
&&&&&o.ground[i+1][j-1]
&&&&&o.ground[i][j+1]
&&&&&o.ground[i+1][j+1]
&&&&&i=(int)((x+8)/25);
&&&&&j=(int)((y+20)/25);
&&&&&o.ground[i+2][j]
&&&&&o.ground[i+2][j+1]
&&&&&o.ground[i][j]
&&&&&o.ground[i][j+1]
&&&&&i=(int)((x+20)/25);
&&&&&j=(int)((y+8)/25);
&&&&&o.ground[i][j+2]
&&&&&o.ground[i+1][j+2]
&&&&&o.ground[i][j]
&&&&&o.ground[i+1][j]
&&&&&i=(int)((x+32)/25);
&&&&&j=(int)((y+20)/25);
&&&&&o.ground[i-1][j]
&&&&&o.ground[i-1][j+1]
&&&&&o.ground[i+1][j]
&&&&&o.ground[i+1][j+1]
&&&}// if step
//sleep,否则游戏太快
&&&&Thread.sleep(sleepTime)
&&&}catch(Exception
&&&&e.printStackTrace()
&&&//以下是敌军回合
&&&if (enemyNum
& enemyMax) {//若场上坦克数未达到最大
= 5+175*(int)(3*Math.random());//三个随即出生点
if (enemy[k] != null)
&&&&//若该出生点未被堵塞
o.ground[(int)((i+20)/25)][1]+o.ground[(int)((i+45)/25)][1]+o.ground[(int)((i+20)/25)][2]+o.ground[(int)((i+45)/25)][2]
( int k = 0 ; k & enemyM k++)
&&&&&&//坦克少或坦克死了,则出生
((k&=enemyNum)||(enemy[k].alive==false))
&&&&&&&groundData
a1 = new groundData();
&&&&&&&enemy[k]
= new EnemyTank( 2 , i , j , a1 , k
);//k是坦克数组的标号,k+2即为坦克及其地面标号
&&&&&&&this.o.ground[(int)((i+20)/25)][(int)((j+20)/25)]=k+2;
&&&&&&&this.o.ground[(int)((i+45)/25)][(int)((j+20)/25)]=k+2;
&&&&&&&this.o.ground[(int)((i+20)/25)][(int)((j+45)/25)]=k+2;
&&&&&&&this.o.ground[(int)((i+45)/25)][(int)((j+45)/25)]=k+2;&
//出生点阻塞
&&&&&&&new
Thread( enemy[k] ).start();//开始活动
&&&&&&&enemy[k].getGroundData(this);//敌军载入全局地图
&&&&&&&enemyNum++;//敌军数加1
&&&&&&&//跳出循环,一次只出生一辆坦克
&&&for ( int k =
0 ; k & enemyN k++)
(enemy[k].alive)//如果活动
&&&&enemy[k].getGroundData(this);//刷新全局地图
&&&&//将自己的位置写入全局地图
(( enemy[k].tankStep == 13
)&&(enemy[k].stepping)&&(!enemy[k].stuck))
regGround( enemy[k].op , enemy[k].x , enemy[k].y , this , k
&&&&//判断自己的子弹是否击中阻塞
((enemyBullet[k].flying)&&((enemyBullet[k].bx+5)%&=4)&&((enemyBullet[k].by+5)%&=4))
bulletHit( enemyBullet[k] , o , enemyBullet[k].bk );
&&&&//己方坦克是否击中阻塞
((bullet.flying)&&((bullet.bx+5)%&=4)&&((bullet.by+5)%&=4))
bulletHit( bullet , o , bullet.bk );
&&&this.repaint();
&//敌军坦克对地图的刷新(注册)
&public void regGround(int op , int x , int y ,
MyTank3 ref , int k ) {
&&ref.enemy[k].stepping =
//stepping为真时,进行地面阻塞移动,移动后将stepping置为false,即一次移动只注册一次
&&switch (op) {
&&case 0 : {
&&&i=(int)((x+20)/25);
&&&j=(int)((y+32)/25);
&&&ref.o.ground[i][j-1]
&&&ref.o.ground[i+1][j-1]
&&&ref.o.ground[i][j+1]
&&&ref.o.ground[i+1][j+1]
&&case 1 : {
&&&i=(int)((x+8)/25);
&&&j=(int)((y+20)/25);
&&&ref.o.ground[i+2][j]
&&&ref.o.ground[i+2][j+1]
&&&ref.o.ground[i][j]
&&&ref.o.ground[i][j+1]
&&case 2 : {
&&&i=(int)((x+20)/25);
&&&j=(int)((y+8)/25);
&&&ref.o.ground[i][j+2]
&&&ref.o.ground[i+1][j+2]
&&&ref.o.ground[i][j]
&&&ref.o.ground[i+1][j]
&&case 3 : {
&&&i=(int)((x+32)/25);
&&&j=(int)((y+20)/25);
&&&ref.o.ground[i-1][j]
&&&ref.o.ground[i-1][j+1]
&&&ref.o.ground[i+1][j]
&&&ref.o.ground[i+1][j+1]
&//按键功能
&public void keyPressed(KeyEvent e) {
&&int i,j;
&&i = (int)((x+20))/25;
&&j = (int)((y+20))/25;
&&if(e.getKeyCode() ==
KeyEvent.VK_UP) {
&&&if (tankStep
&&&&tankStep
&&&&if((o.ground[i][j-1]&0)||(o.ground[i+1][j-1]&0))
{ //转弯后判断是否阻塞
&&&&&stuck
&&&&&tankStep
= 0 ;//如果阻塞则不移动
&&if(e.getKeyCode() ==
KeyEvent.VK_RIGHT) {
&&&if (tankStep
&&&&tankStep
&&&&if((o.ground[i+2][j]&0)||(o.ground[i+2][j+1]&0))
&&&&&stuck
&&&&&tankStep
&&if(e.getKeyCode() ==
KeyEvent.VK_DOWN) {
&&&if (tankStep
&&&&tankStep
&&&&if((o.ground[i][j+2]&0)||(o.ground[i+1][j+2]&0))
&&&&&stuck
&&&&&tankStep
&&if(e.getKeyCode() ==
KeyEvent.VK_LEFT) {
&&&if (tankStep
&&&&tankStep
&&&&if((o.ground[i-1][j]&0)||(o.ground[i-1][j+1]&0))
&&&&&stuck
&&&&&tankStep
&&if(e.getKeyCode() ==
KeyEvent.VK_SPACE){
(bullet.flying == false ){//若炮弹在飞则发不出第二发
Thread(bullet).start();
&&&&bullet.bx
&&&&bullet.by
&&&&bullet.bop
&&&&bullet.flying
&&//esc直接退出
&&if(e.getKeyCode() ==
KeyEvent.VK_ESCAPE){
&&&System.exit(0);
&&this.repaint();
&public void keyReleased(KeyEvent arg0)
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&public void keyTyped(KeyEvent arg0) {
&//判断子弹是否击中
&public void bulletHit( MyBullet3 ref , groundData
o , int k ){
&&i = (int)((ref.bx+5)/25);
&&j = (int)((ref.by+5)/25);
//&&System.out.print("hit: i
"+i+" , j "+j+"& \n");
&&if (k == 1) {//我方击中
(o.ground[i][j]&1){
&&&&ref.flying
(o.ground[i][j]&100) killTank( o.ground[i][j]-2 ,
(o.ground[i+1][j]&1){
&&&&ref.flying
(o.ground[i+1][j]&100) killTank( o.ground[i+1][j]-2
(o.ground[i][j+1]&1){
&&&&ref.flying
(o.ground[i][j+1]&100) killTank( o.ground[i][j+1]-2
(o.ground[i+1][j+1]&1){
&&&&ref.flying
(o.ground[i+1][j+1]&100) killTank(
o.ground[i+1][j+1]-2 ,this );
1){//敌方击中
((o.ground[i][j]&0)&&(o.ground[i][j]!=k)){
&&&&ref.flying
( o.ground[i][j] == 1 ) life = life -
((o.ground[i+1][j]&0)&&(o.ground[i+1][j]!=k)){
&&&&ref.flying
(o.ground[i+1][j] == 1 ) life = life -
((o.ground[i][j+1]&0)&&(o.ground[i][j+1]!=k)){
&&&&ref.flying
(o.ground[i][j+1] == 1 ) life = life -
((o.ground[i+1][j+1]&0)&&(o.ground[i+1][j+1]!=k)){
&&&&ref.flying
(o.ground[i+1][j+1] == 1 ) life = life -
&&&if ( life
&&&&//&弹出对话框
&&&&JOptionPane.showMessageDialog(null,&
&&&&&&"你的得分&
: " + score,
&&&&&&"游戏结束!",
&&&&&&JOptionPane.ERROR_MESSAGE);
&&&&//&结束游戏&
&&&&System.exit(0)
&//击毁敌方坦克
&public void killTank( int k , MyTank3 ref
&&int i , j , m ,
&&if (ref.enemy[k].alive) {
&&&ref.enemyNum--;
&&&ref.enemy[k].alive
&&score = score + 100 ;
(int)((ref.enemy[k].x+20)/25);
(int)((ref.enemy[k].y+20)/25);
//&&System.out.print("explose:&
i "+i+" , j "+j+" , k"+k +" \n");
&&for ( n = i-1 ; n
& i+3 ; n++ )
&&&for ( m = j-1
; m & j+3 ; m++ )
((m&0)&&(m&18)&&(n&0)&&(n&18))
( ref.o.ground[n][m] == k+2 )
&&&&{&ref.o.ground[n][m]
= 0 ; //消除地面阻塞
//&&&&System.out.print("m
"+m+", n "+n+"& \n") ;
&class MyBullet3 extends Thread {
&int bx = 0 , by = 0& , bop = 0 ,
speed = 8, bk = 1;//bk为射出当前炮弹的坦克标号
&boolean flying =
&public void run() {
&&flying =
&&if (bk & 1)
speed = 6;
&&for (int a = 0;
a&60000; a++){
&&&if (flying)
&&&&switch
((bx&0)||(bx&400)||(by&0)||(by&400))
//&&&&System.out.print("
Bullet out of Frame!");
&&&&flying
(flying==false)&
&&&&Thread.sleep(25)
&&&}catch(Exception
&&&&e.printStackTrace()
&&}// end of for
&}// end of run
}// end of class
&//敌方坦克类
&class EnemyTank extends Thread {
&int x = 0, y = 0 , op = 0 ,tk = 0;
&boolean alive = false , stuck = false ,stepping =
&int tankStep = 0 , perStep = 1;
&//重构方法
&EnemyTank(int top,int tx, int ty, groundData to ,
&&this.x =
&&this.y =
&&this.o =
&&this.op =
&&this.alive =
&&this.tk =
&&this.o.ground[(int)((x+20)/25)][(int)((y+20)/25)]=k+2;
&&this.o.ground[(int)((x+45)/25)][(int)((y+20)/25)]=k+2;
&&this.o.ground[(int)((x+20)/25)][(int)((y+45)/25)]=k+2;
&&this.o.ground[(int)((x+45)/25)][(int)((y+45)/25)]=k+2;&
&public void run(){
&&for (int a = 0;
a&60000; a++){
&&&if (alive)
( tankStep == 0 ){
((stuck)||(Math.random()&0.1)) turnAround(this);
//遇到阻塞或者随机 转弯&&
&&&&&tankStep
&&&&&stepping
&&&&&judgeStuck(this);&
//判断是否被堵塞
&&&&proceed
((Math.random()&0.3)&&(enemyBullet[tk].flying
== false )) shootBullet();//未发射炮弹情况下随即发射
&&&} else return
&&&&Thread.sleep(20)
&&&}catch(Exception
&&&&e.printStackTrace()
&&}//end of for
&}//end of run
&void shootBullet( ){
&&//申请新的炮弹
Thread(enemyBullet[tk]).start();
&&enemyBullet[tk].speed =
&&enemyBullet[tk].bx = x +
&&enemyBullet[tk].by = y +
&&enemyBullet[tk].bop =
&&enemyBullet[tk].bk =
&&enemyBullet[tk].flying =
&void judgeStuck( EnemyTank ref ){
&&int i,j;
&&i = (int)((x+20))/25;
&&j = (int)((y+20))/25;
&&switch (op){
&&case 0 :
if((o.ground[i][j-1]&0)||(o.ground[i+1][j-1]&0))
&&&ref.stuck =
&&case 1 :
if((o.ground[i+2][j]&0)||(o.ground[i+2][j+1]&0))
&&&ref.stuck =
&&case 2 :
if((o.ground[i][j+2]&0)||(o.ground[i+1][j+2]&0))
&&&ref.stuck =
&&case 3 :
if((o.ground[i-1][j]&0)||(o.ground[i-1][j+1]&0))
&&&ref.stuck =
&void turnAround( EnemyTank ref){
(int)(Math.random()*2)+1;//i= 1 2
3&& 中的随机数
&&ref.op = ( op + i ) % 4
;//随机转弯
&void getGroundData ( MyTank3 d ){
&&this.o = d.o;&
//载入地图
&void proceed( EnemyTank ref ) {
&&if (tankStep
&&&if( stuck ==
&&&&switch
&&&&&ref.y
= ref.y - perS
&&&&&ref.tankStep
&&&&&ref.x
= ref.x + perS
&&&&&ref.tankStep
&&&&&ref.y
= ref.y + perS
&&&&&ref.tankStep
&&&&&ref.x
= ref.x - perS
&&&&&ref.tankStep
&&&else tankStep
--;//遇到堵塞后停止一会再转弯
}//end of class
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。匿名用户不能发表回复!|→ java进阶教程《坦克大战》中,创建敌方坦克后,敌方坦克就和我的坦克重叠在了一起,移动也跟着我的坦克移动,这是什么问题,我找了一个下午这个错误出在哪也没找到,求大神啊
选取类型:
观点标题:
观点内容:(不支持HTML)
请以客观、真实地作出评论,并注意语言文明;
观点发表后不能作出更改;
您是本帖的第 1360 个阅读者
java进阶教程《坦克大战》中,创建敌方坦克后,敌方坦克就和我的坦克重叠在了一起,移动也跟着我的坦克移动,这是什么问题,我找了一个下午这个错误出在哪也没找到,求大神啊
等级:幼儿园
java进阶教程《坦克大战》中,创建敌方坦克后,敌方坦克就和我的坦克重叠在了一起,移动也跟着我的坦克移动,这是什么问题,我找了一个下午这个错误出在哪也没找到,求大神啊
package TanKeDa;//package com.bfd.util.新建文件夹;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.Vclass MyPanel_N extends JPanel implements KeyListener,Runnable{&MyTanke tk =&Vector&DTanke& dtk=new Vector&DTanke&();&int dtsl=3;&&&MyPanel_N() {&&tk = new MyTanke(250, 250);// 构造方法中的参数为绘图中使用的横坐标和纵坐标;&&&&for(int i=0;i&i++){&&&DTanke dt=new DTanke((i)*10+5,10);&&&dtk.add(dt);&&}&&&}&public void paint(Graphics g) {// 重写的父类方法,作用为创建一个画板;&&super.paint(g);&&g.fillRect(0, 0, );&&&this.drawTk(g,tk.getX(),tk.getY(),0,tk.fx);&&for(int i=0;i&dtk.size();i++){//敌人坦克&&DTanke dt=dtk.get(i);&&if(dt.shengming){&&this.drawTk(g,dt.getX(), dt.getY(), 1, 2);&&}&}&for(int i=0;i&tk.zzdd.size();i++){//子弹连发&&Zidan zd=tk.zzdd.get(i);&&&if(tk.zd!=null&&tk.zd.shengming==true){&&g.setColor(Color.WHITE);//设置子弹参数;&&g.fill3DRect(zd.x+ 45, zd.y+45, 7, 7, false);&&if(zd.shengming==false){&&&tk.zzdd.remove(zd);&&}&&this.repaint();&}&&}&}&public void drawTk(Graphics g, int x, int y, int leixing, int fangxiang) {&&switch (leixing) {&&case 0:// 我的坦克;黄色&&&g.setColor(Color.yellow);&&&&&case 1:// 敌人的坦克;绿色&&&g.setColor(Color.green);&&&&&}&&switch (fangxiang) {&&case 1:// 坦克面朝上; 使用绘图制作的简易坦克&&&g.fill3DRect(tk.getX(), tk.getY(), 25, 100, false);&&&g.fill3DRect(tk.getX() + 75, tk.getY(), 25, 100, false);&&&g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);&&&g.fillOval(tk.getX() + 40, tk.getY() + 45, 20, 20);&&&g.fillRect(tk.getX() + 47, tk.getY(), 7, 65);&&&&&case 2:// 坦克面朝下&&&g.fill3DRect(tk.getX(), tk.getY(), 25, 100, false);&&&g.fill3DRect(tk.getX() + 75, tk.getY(), 25, 100, false);&&&g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);&&&g.fillOval(tk.getX() + 40, tk.getY() + 34, 20, 20);&&&g.fillRect(tk.getX() + 47, tk.getY()+50, 7, 55);&&&&&case 3:// 坦克面朝左&&&g.fill3DRect(tk.getX(), tk.getY(),& 100,25, false);&&&g.fill3DRect(tk.getX() , tk.getY()+ 75,100 , 25, false);&&&g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);&&&g.fillOval(tk.getX() + 40, tk.getY() + 41, 20, 20);&&&g.fillRect(tk.getX() + -5, tk.getY()+46, 65,7);&&&&&case 4:// 坦克面朝右&&&g.fill3DRect(tk.getX(), tk.getY(), 100, 25, false);&&&g.fill3DRect(tk.getX(), tk.getY()+75, 100, 25, false);&&&g.fill3DRect(tk.getX()+ 25,tk.getY() + 25, 50, 50, false);&&&g.fillOval(tk.getX()+40,tk.getY()+41, 20, 20);&&&g.fillRect(tk.getX()+47,tk.getY()+46, 65,7);&&&&&&&}&&this.repaint();&}&public void keyPressed(KeyEvent e) {&&if(e.getKeyCode()==KeyEvent.VK_W){&&&this.tk.setFx(1);&&&this.tk.sy();&&}else if(e.getKeyCode()==KeyEvent.VK_S){&&&this.tk.setFx(2);&&&this.tk.xy();&&}else if(e.getKeyCode()==KeyEvent.VK_A){&&&this.tk.setFx(3);&&&this.tk.zy();&&}else if(e.getKeyCode()==KeyEvent.VK_D){&&&this.tk.setFx(4);&&&this.tk.yy();&&}&&if (e.getKeyCode()==KeyEvent.VK_M){&&&if(tk.zzdd.size()&8){&&&this.tk.fszd();&&&}&&}&}&public void keyReleased(KeyEvent e) {}&public void keyTyped(KeyEvent e){}&public void run() {&&while(true){&&&try{&&&&Thread.sleep(100);&&&}catch(Exception e){}&&&&&&for(int i=0;i&tk.zzdd.size();i++){//使用嵌套循环的作用是可以让打出的每发子弹都可以和敌人作比较;&&&&Zidan zd=tk.zzdd.get(i);&&&&if(zd.shengming){&&&&&for(int j=0;j&dtk.size();j++){&&&&&&DTanke dt=dtk.get(j);&&&&&&if(dt.shengming){&&&&&&&this.jztk(zd, dt);&&&&&&}&&&&&}&&&&}&&&}&&&&&&this.repaint();&&}&&&}&&public void jztk(Zidan zd,DTanke dt){//判断子弹是否击中坦克,击中子弹及坦克均消失;&&switch(dt.fx){&&case 1:&&case 2:&&&if(zd.x&dt.x&&zd.x&dt.x+20&&zd.y&dt.y&&zd.y&dt.y+30){&&&&zd.shengming=&&&&dt.shengming=&&&}&&&&&case 3:&&case 4:&&&if(zd.x&dt.x&&zd.x&dt.x+30&&zd.y&dt.y&&zd.y&dt.y+20){&&&&zd.shengming=&&&&dt.shengming=&&&}&&&&&}&}}public class Tank extends JFrame {&MyPanel_N mpn =&Tank() {&&mpn = new MyPanel_N();&&// 添加进窗口&&this.add(mpn);&&this.addKeyListener(mpn);&&// 设置窗口属性;&&this.setTitle("坦克大战");&&this.setSize(680, 580);&&this.setLocation(380, 50);&&this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&&this.setVisible(true);&}&public static void main(String[] args) {&&Tank k = new Tank();&&//vMyPanel_N b = new MyPanel_N();&}}
等级:幼儿园
package TanKeDa;import java.util.Vclass Tanke {&public int x,&&int sd=5;&boolean shengming=&public int getFx() {&&&}&public void setFx(int fx) {&&this.fx =&}&public int getSd() {&&&}&public void setSd(int sd) {&&this.sd =&}&public Tanke() {&&super();&}&&public Tanke(int x, int y) {&&&this.x =&&this.y =&}&public int getX() {&&&}&public void setX(int x) {&&this.x =&}&public int getY() {&&&}&public void setY(int y) {&&this.y =&}}class MyTanke extends Tanke {&Vector&Zidan& zzdd=new Vector&Zidan&();&Zidan zd=&//&public MyTanke() {//&&super();//&}&MyTanke(int x, int y) {&&super(x, y);&&&}&&public void fszd(){&&switch(this.fx){&&case 1:&&&zd=new Zidan(x+10,y,1);&&&zzdd.add(zd);&&&&&case 2:&&&zd=new Zidan(x+10,y+30,2);&&&zzdd.add(zd);&&&&&case 3:&&&zd=new Zidan(x,y+10,3);&&&zzdd.add(zd);&&&&&case 4:&&&zd=new Zidan(x+30,y+10,4);&&&zzdd.add(zd);&&&&&&&&}&&&&Thread t=new Thread(zd);&&t.start();&}&public void sy(){//向上移动&&y-=&}&public void xy(){//向下移动&&y+=&}&public void zy(){//向左移动&&x-=&}&public void yy(){//向右移动&&x+=&}}class DTanke extends Tanke{&//Vector&DTanke& dtk=new Vector&DTanke&();&DTanke(int x,int y){&&super(x,y);&}}class Zidan implements Runnable{&&&&int sd=5;&boolean shengming=&Zidan(int x,int y,int fx){&&this.x=x;&&this.y=y;&&this.fx=&}&public void run() {&&while(true){&&&try{&&&&Thread.sleep(50);&&&}catch(Exception e){}&&&&&&switch(fx){&&&case 1:&&&&y-=&&&&&&&case 2:&&&&y+=&&&&&&&case 3:&&&&x-=&&&&&&&case 4:&&&&x+=&&&&&&&}&&&&if(x&1150||y&550){//子弹超出边界自动消失&&&&shengming=&&&}&&}&&&}}
等级:幼儿园
找了一个下午啊,真是没办法了。走过路过的大神多花几分钟帮我看看吧,跪谢
等级:管理员
文章:13910
经验:112635
金钱:105370
已将问题反映给相关老师
http://www.51zxw.net我要自学网,打造专业软件视频教程
等级:初生婴儿
 你传入的变量成了X,Y   但是case里面引用的依然是MyTank的X,Y   g.fill3DRect(tk.getX(), tk.getY(), 25, 100, false);改成   g.fill3DRect(X,Y, 25, 100, false);下面是你的原代码 你都改成XY后再试试?public void drawTk(Graphics g, int x, int y, int leixing, int fangxiang) {  switch (leixing) {  case 0:// 我的坦克;黄色   g.setColor(Color.yellow);     case 1:// 敌人的坦克;绿色   g.setColor(Color.green);     }  switch (fangxiang) {  case 1:// 坦克面朝上; 使用绘图制作的简易坦克   g.fill3DRect(tk.getX(), tk.getY(), 25, 100, false);   g.fill3DRect(tk.getX() + 75, tk.getY(), 25, 100, false);   g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);   g.fillOval(tk.getX() + 40, tk.getY() + 45, 20, 20);   g.fillRect(tk.getX() + 47, tk.getY(), 7, 65);     case 2:// 坦克面朝下   g.fill3DRect(tk.getX(), tk.getY(), 25, 100, false);   g.fill3DRect(tk.getX() + 75, tk.getY(), 25, 100, false);   g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);   g.fillOval(tk.getX() + 40, tk.getY() + 34, 20, 20);   g.fillRect(tk.getX() + 47, tk.getY()+50, 7, 55);     case 3:// 坦克面朝左   g.fill3DRect(tk.getX(), tk.getY(),  100,25, false);   g.fill3DRect(tk.getX() , tk.getY()+ 75,100 , 25, false);   g.fill3DRect(tk.getX() + 25, tk.getY() + 25, 50, 50, false);   g.fillOval(tk.getX() + 40, tk.getY() + 41, 20, 20);   g.fillRect(tk.getX() + -5, tk.getY()+46, 65,7);     case 4:// 坦克面朝右   g.fill3DRect(tk.getX(), tk.getY(), 100, 25, false);   g.fill3DRect(tk.getX(), tk.getY()+75, 100, 25, false);   g.fill3DRect(tk.getX()+ 25,tk.getY() + 25, 50, 50, false);   g.fillOval(tk.getX()+40,tk.getY()+41, 20, 20);   g.fillRect(tk.getX()+47,tk.getY()+46, 65,7);       }
[此贴子已经被作者于 19:06:07编辑过]
等级:学前班
有老师号没,我的子弹击中坦克后,都不消失,找不出问题来
本论坛言论纯属发表者个人意见,与本站立场无关,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! 粤ICP备号
Copyright © 2007
Powered By
页面执行时间 0.14063 秒, 4 次数据查询

我要回帖

更多关于 手机里那串神秘的代码到底是什么 的文章

 

随机推荐