该坦克大战运用了JavaGUI图形库,多线程,文件IO,反射等Java高级编程中的知识,用来巩固Java语法非常合适。 我在韩老师原版的设计上做了一些改变,敌方坦克会永远保持三个,你每杀死一辆敌方坦克,并会在屏幕内随机生成一个敌方坦克以此来增加游戏乐趣,其他内容与原版无异。下面是展示图:
该项目总共九个类,包含近1000行代码。
这是我第一次分享项目,有其他问题或不足的欢迎大家在评论区讨论,也可以私聊问我哦。





以上是基本的运行内容,下面是源代码实现:
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
public class TankGame06 extends JFrame {
static Scanner scanner=new Scanner(System.in);
private Mypanel mp=null;
public static void main(String[] args) {
new TankGame06();
}
public TankGame06(){
System.out.println("请输入你的选择>:");
System.out.println("1. 开启新游戏 2. 继续上局游戏");
String key=scanner.next();
mp=new Mypanel(key);
Thread thread=new Thread(mp);
thread.start();
this.add(mp);
this.setSize(1300,800);
this.addKeyListener(mp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
Recorder.keepRecord();
System.exit(0);
}
});
}
}public class Tank {
private int x;
private int y;
private int direct;
private int speed;
boolean isLive=true;
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 void moveUp(){
direct=0;
this.y=this.y-speed;
}
public void moveDown(){
direct=2;
y=y+speed;
}
public void moveLeft(){
direct=3;
x=x-speed;
}
public void moveRight(){
direct=1;
x=x+speed;
}
public Tank(int x, int y,int direct,int speed) {
this.x = x;
this.y = y;
this.direct=direct;
this.speed=speed;
}
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 class Shot implements Runnable {
int x;
int y;
int direct=0;
int speed=5;
boolean isLive =true;
public Shot(int x,int y,int direct){
this.x=x;
this.y=y;
this.direct=direct;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
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<=1000&&y>=0&&y<=750&&isLive)){
isLive=false;
break;
}
}
}
}import java.io.*;
import java.util.Vector;
public class Recorder {
private static int allEnemyTankNum=0;
private static BufferedWriter bw=null;
private static BufferedReader br=null;
private static String recordFile="src\\myRecord.txt";
private static Vector<Enemy> enemyTanks =null;
private static Hero hero=null;
private static Vector<Node> nodes=new Vector<>();
public static Vector<Node> getNodesAndEnemyTankRec(){
try {
br=new BufferedReader(new FileReader(recordFile));
allEnemyTankNum = Integer.parseInt(br.readLine());
String line=null;
while ((line =br.readLine())!=null){
String[] xyd=line.split(" ");
if(xyd.length>=3){
Node node=new Node(Integer.parseInt(xyd[0]),Integer.parseInt(xyd[1]),Integer.parseInt(xyd[2]));
nodes.add(node);
} else if (xyd.length==1) {
Node node=new Node(Integer.parseInt(xyd[0]));
nodes.add(node);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if(br!=null){
br.close();}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return nodes;
}
public static void setEnemyTanks(Vector<Enemy> enemyTanks) {
Recorder.enemyTanks = enemyTanks;
}
//当游戏退出时,保存击毁敌方坦克数以及敌人坦克的坐标和方向。
public static void keepRecord() {
try {
bw=new BufferedWriter(new FileWriter(recordFile));
bw.write(allEnemyTankNum+"\r\n");
if(enemyTanks!=null){
for(int i=0;i<enemyTanks.size();i++){
Enemy enemyTank=enemyTanks.get(i);
if(enemyTank.isLive){
String record=enemyTank.getX()+" "+enemyTank.getY()+" "+enemyTank.getDirect();
bw.write(record+"\r\n");
}
}
}
if(hero!=null){
if(hero.isLive==true) {
String record = hero.getX() + " " + hero.getY() + " " + hero.getDirect();
bw.write(record + "\r\n");
}else if(hero.isLive==false) {
bw.write("-1");
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
bw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static int getAllEnemyTankNum() {
return allEnemyTankNum;
}
public static void setAllEnemyTankNum(int allEnemyTankNum) {
Recorder.allEnemyTankNum = allEnemyTankNum;
}
public static void addAllEnemyTankNum(){
Recorder.allEnemyTankNum++;
}
public static Hero getHero() {
return hero;
}
public static void setHero(Hero hero) {
Recorder.hero = hero;
}
}public class Node {
private int x;
private int y;
private int direct;
private int button=0;
public Node(int x,int y,int direct){
this.x=x;
this.y=y;
this.direct=direct;
}
public Node(int button){
this.button=button;
}
public int getButton() {
return button;
}
public void setButton(int button) {
this.button = button;
}
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;
}
}import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
public class Mypanel extends JPanel implements KeyListener,Runnable {
Hero hero=null;
Vector<Enemy> vector=new Vector<>();
Vector<Bomb> bombs=new Vector<>();
Vector<Node> nodes=new Vector<>();
int Enemysize=3;
private Graphics g;
Image image1=null;
Image image2=null;
Image image3=null;
public Mypanel(String key){
//初始化图片对象
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image1.png"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image2.png"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image3.png"));
switch (key){
case "1":
for(int i=0;i<Enemysize;i++){
vector.add(new Enemy(100*(1+i),0,2,1));
Enemy enemytank=vector.get(i);
enemytank.setEnemytanks(vector);
Recorder.setEnemyTanks(vector);
new Thread(enemytank).start();
Shot shot=new Shot(enemytank.getX()+20,enemytank.getY()+60,enemytank.getDirect());
enemytank.shots.add(shot);
new Thread(shot).start();
}
hero=new Hero(750,600,0,10);
Recorder.setHero(hero);
break;
//继续上局游戏
case "2":
nodes=Recorder.getNodesAndEnemyTankRec();
Node nodebutton=nodes.get(3);
if(nodebutton.getButton()==-1){
for(int i=0;i<Enemysize;i++){
vector.add(new Enemy(100*(1+i),0,2,1));
Enemy enemytank=vector.get(i);
enemytank.setEnemytanks(vector);
Recorder.setEnemyTanks(vector);
new Thread(enemytank).start();
Shot shot=new Shot(enemytank.getX()+20,enemytank.getY()+60,enemytank.getDirect());
enemytank.shots.add(shot);
new Thread(shot).start();
}
hero=new Hero(750,600,0,10);
Recorder.setHero(hero);
break;
}
for(int i=0;i<nodes.size()-1;i++) {
Node node = nodes.get(i);
vector.add(new Enemy(node.getX(), node.getY(), node.getDirect(), 1));
Enemy enemytank = vector.get(i);
enemytank.setEnemytanks(vector);
Recorder.setEnemyTanks(vector);
new Thread(enemytank).start();
Shot shot = new Shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());
enemytank.shots.add(shot);
new Thread(shot).start();
}
Node nodehero = nodes.get(3);
hero=new Hero(nodehero.getX(),nodehero.getY(),nodehero.getDirect(),10);
Recorder.setHero(hero);
break;
default:
System.out.println("输入数据不合法!");
}
}
public void showInfo(Graphics g){
g.setColor(Color.black);
Font font=new Font("宋体",Font.BOLD,25);
g.setFont(font);
g.drawString("您累计击毁敌方坦克",1020,30);
drawTank(1020,60,g,0,0);
g.setColor(Color.black);
g.drawString(Recorder.getAllEnemyTankNum()+"",1080,100);
}
@Override
public void paint(Graphics g) {
super.paint(g);
showInfo(g);
g.fillRect(0,0,1000,750);
if(hero.isLive) {
drawTank(hero.getX(), hero.getY(), g, 1, hero.getDirect());
}
for(int i=0;i<hero.shots.size();i++){
g.draw3DRect(hero.shots.get(i).x,hero.shots.get(i).y,1,1,false);
}
for(int i=0;i<bombs.size();i++){
Bomb bomb=bombs.get(i);
if(bomb.life>6){
g.drawImage(image1,bomb.x,bomb.y,60,60,this);
}else if(bomb.life>3){
g.drawImage(image2,bomb.x,bomb.y,60,60,this);
} else {
g.drawImage(image3,bomb.x,bomb.y,60,60,this);
}
bomb.lifeDown();
if(bomb.life==0){
bombs.remove(bomb);
}
}
for(int i=0;i<vector.size();i++){
if(vector.get(i).isLive){
Enemy enemy=vector.get(i);
drawTank(enemy.getX(),enemy.getY(),g,0,enemy.getDirect());
for(int j=0;j<enemy.shots.size();j++){
Shot shot=enemy.shots.get(j);
if(shot.isLive){
g.draw3DRect(shot.x,shot.y,2,2,false);
}else {
enemy.shots.remove(shot);
}
}
}
}
}
public void drawTank(int x,int y,Graphics g,int type,int direct){
switch (type){
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
switch (direct){
case 0:
g.fill3DRect(x, y,10,60,false);
g.fill3DRect(x+30,y,10,60,false);
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y,x+20,y+30);
break;
case 1:
g.fill3DRect(x, y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x+30,y+20,x+60,y+20);
break;
case 2:
g.fill3DRect(x, y,10,60,false);
g.fill3DRect(x+30,y,10,60,false);
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y+60);
break;
case 3:
g.fill3DRect(x, y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x,y+20,x+30,y+20);
break;
}
}
//编写方法,判断我方坦克是否击中敌人坦克
public void hiteTank(Shot s,Tank enemytank){
switch (enemytank.getDirect()){
case 0:
case 2:
if(s.x>enemytank.getX()&&s.x<enemytank.getX()+40 &&
s.y>enemytank.getY()&&s.y<enemytank.getY()+60&& enemytank.isLive){
s.isLive=false;
enemytank.isLive=false;
vector.remove(enemytank);
if(enemytank instanceof Enemy){
Recorder.addAllEnemyTankNum();
if(vector.size()<3){
vector.add(new Enemy((int)(Math.random()*900),(int)(Math.random()*700),2,1));
Enemy enemytank1=vector.get(2);
enemytank1.setEnemytanks(vector);
Recorder.setEnemyTanks(vector);
new Thread(enemytank1).start();
Shot shot=new Shot(enemytank1.getX()+20,enemytank1.getY()+60,enemytank1.getDirect());
enemytank1.shots.add(shot);
new Thread(shot).start();
}
}
if(enemytank instanceof Hero){
System.out.println("游戏结束,你累计击毁了"+Recorder.getAllEnemyTankNum()+"个坦克");
Recorder.setAllEnemyTankNum(0);
Recorder.keepRecord();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.exit(0);
}
Bomb bomb=new Bomb(enemytank.getX(),enemytank.getY());
bombs.add(bomb);
}
break;
case 1:
case 3:
if(s.x>enemytank.getX()&&s.x< enemytank.getX()+60&&
s.y>enemytank.getY()&&s.y<enemytank.getY()+40&&enemytank.isLive){
s.isLive=false;
enemytank.isLive=false;
vector.remove(enemytank);
if(enemytank instanceof Enemy){
Recorder.addAllEnemyTankNum();
if(vector.size()<3){
vector.add(new Enemy((int)(Math.random()*400)+100,(int)(Math.random()*200)+100,2,1));
Enemy enemytank1=vector.get(2);
enemytank1.setEnemytanks(vector);
Recorder.setEnemyTanks(vector);
new Thread(enemytank1).start();
Shot shot=new Shot(enemytank1.getX()+20,enemytank1.getY()+60,enemytank1.getDirect());
enemytank1.shots.add(shot);
new Thread(shot).start();
}
}
if(enemytank instanceof Hero){
System.out.println("游戏结束,你累计击毁了"+Recorder.getAllEnemyTankNum()+"个坦克");
Recorder.setAllEnemyTankNum(0);
Recorder.keepRecord();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.exit(0);
}
Bomb bomb=new Bomb(enemytank.getX(),enemytank.getY());
bombs.add(bomb);
}
break;
}
}
public void hiteEnemyTank(){
//判断是否击中敌人坦克
for(int i=0;i<hero.shots.size();i++){
Shot shot=hero.shots.get(i);
if(shot.isLive&&shot!=null){
for(int j=0;j<vector.size();j++){
Enemy enemyTank=vector.get(j);
hiteTank(shot,enemyTank);
}
}else{
hero.shots.remove(i);
}
}
}
public void hiteHeroTank(){
for(int i=0;i<vector.size();i++){
Enemy enemytank=vector.get(i);
for (int j=0;j<enemytank.shots.size();j++){
Shot shot=enemytank.shots.get(j);
if(shot!=null&&shot.isLive){
hiteTank(shot,hero);
}else {
enemytank.shots.remove(j);
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W){
if(hero.getY()>0){
hero.moveUp();}
this.repaint();
} else if (e.getKeyCode()==KeyEvent.VK_D) {
if(hero.getX()<940){
hero.moveRight();}
this.repaint();
} else if (e.getKeyCode()==KeyEvent.VK_S) {
if(hero.getY()<690){
hero.moveDown();}
this.repaint();
} else if (e.getKeyCode()==KeyEvent.VK_A) {
if(hero.getX()>0){
hero.moveLeft();}
this.repaint();
}
if(e.getKeyCode()==KeyEvent.VK_J){
hero.shotEnemyTank();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
for(int l=0;l<vector.size();l++){
Enemy enemytank=vector.get(l);
if(!enemytank.isLive){
vector.remove(enemytank);
}
}
hiteEnemyTank();
hiteHeroTank();
this.repaint();
}
}
}import java.util.Vector;
public class Hero extends Tank {
boolean islive=true;
Shot shot=null;
Vector<Shot> shots=new Vector<>();
public Hero(int x, int y,int direct,int speed ) {
super(x, y,direct,speed);
}
public void shotEnemyTank(){
switch (getDirect()){
case 0:
if(shots.size()<5){
shot=new Shot(getX()+20,getY(),0);
new Thread(shot).start();
shots.add(shot);
}
break;
case 1:
if(shots.size()<5) {
shot = new Shot(getX() + 60, getY() + 20, 1);
new Thread(shot).start();
shots.add(shot);
}
break;
case 2:
if(shots.size()<5) {
shot = new Shot(getX() + 20, getY() + 60, 2);
new Thread(shot).start();
shots.add(shot);
}break;
case 3:
if(shots.size()<5){
shot=new Shot(getX(),getY()+20,3);
new Thread(shot).start();
shots.add(shot);
}
break;
}
}
}import java.util.Vector;
public class Enemy extends Tank implements Runnable{
Vector<Shot> shots=new Vector<>();
Vector <Enemy> enemytanks=new Vector<>();
public void setEnemytanks(Vector<Enemy> enemytanks) {
this.enemytanks = enemytanks;
}
public boolean isTouchEnemyTank(){
switch (this.getDirect()){
case 0:
for(int i=0;i<enemytanks.size();i++){
Enemy enemyTank=enemytanks.get(i);
if(enemyTank!=this){
if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+40
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if(this.getX()+40>=enemyTank.getX()
&&this.getX()+40<=enemyTank.getX()+40
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
}
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+60
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if(this.getX()+40>=enemyTank.getX()
&&this.getX()+40<=enemyTank.getX()+60
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
}
}
}
break;
case 1:
for(int i=0;i<enemytanks.size();i++){
Enemy enemyTank=enemytanks.get(i);
if(enemyTank!=this){
if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
if(this.getX()+60>=enemyTank.getX()
&&this.getX()+60<=enemyTank.getX()+40
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if(this.getX()+60>=enemyTank.getX()
&&this.getX()+60<=enemyTank.getX()+40
&&this.getY()+40>=enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+60){
return true;
}
}
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
if(this.getX()+60>=enemyTank.getX()
&&this.getX()+60<=enemyTank.getX()+60
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if(this.getX()+60>=enemyTank.getX()
&&this.getX()+60<=enemyTank.getX()+60
&&this.getY()+40>=enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+40){
return true;
}
}
}
}
break;
case 2:
for(int i=0;i<enemytanks.size();i++){
Enemy enemyTank=enemytanks.get(i);
if(enemyTank!=this){
if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+40
&&this.getY()+60>=enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+60){
return true;
}
if(this.getX()+40>=enemyTank.getX()
&&this.getX()+40<=enemyTank.getX()+40
&&this.getY()+60>=enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+60){
return true;
}
}
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+60
&&this.getY()+60>=enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+40){
return true;
}
if(this.getX()+40>=enemyTank.getX()
&&this.getX()+40<=enemyTank.getX()+60
&&this.getY()+60>=enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+40){
return true;
}
}
}
}
break;
case 3:
for(int i=0;i<enemytanks.size();i++){
Enemy enemyTank=enemytanks.get(i);
if(enemyTank!=this){
if(enemyTank.getDirect()==0||enemyTank.getDirect()==2){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+40
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+40
&&this.getY()+40>=enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+60){
return true;
}
}
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+60
&&this.getY()>=enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if(this.getX()>=enemyTank.getX()
&&this.getX()<=enemyTank.getX()+60
&&this.getY()+40>=enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+40){
return true;
}
}
}
}
break;
}
return false;
}
public Enemy(int x, int y,int direct,int speed) {
super(x, y,direct,speed);
}
@Override
public void run() {
while(true){
if(shots.size()<=3){
Shot shot=null;
switch (getDirect()){
case 0:
shot=new Shot(getX()+20,getY(),0);
shots.add(shot);
new Thread(shot).start();
break;
case 1:
shot=new Shot(getX()+60,getY()+20,1);
shots.add(shot);
new Thread(shot).start();
break;
case 2:
shot=new Shot(getX()+20,getY()+60,2);
shots.add(shot);
new Thread(shot).start();
break;
case 3:
shot=new Shot(getX(),getY()+20,3);
shots.add(shot);
new Thread(shot).start();
break;
}
}
switch ((int)(Math.random()*4)){
case 0:
for (int i=0;i<30;i++){
if(getY()>0&&!isTouchEnemyTank()){
moveUp();}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 1:
for (int i=0;i<30;i++) {
if(getX()+60<1000&&!isTouchEnemyTank()){
moveRight();}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 2:
for(int i=0;i<30;i++){
if(getY()+60<750&&!isTouchEnemyTank()){
moveDown();}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 3:
for(int i=0;i<30;i++){
if(getX()>0&&!isTouchEnemyTank()){
moveLeft();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
}
if(isLive==false){
break;
}
}
}
}public class Bomb {
int x,y;
int life=18;
boolean isLive=true;
public Bomb(int x,int y){
this.x=x;
this.y=y;
}
public void lifeDown(){
if(life >0){
life--;
}else{
isLive=false;
}
}
}