java代码实现坦克大战

时间: 2023-10-04 22:14:43 浏览: 42
坦克大战是经典的游戏,以下是一个简单的 Java 代码实现: ```java import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.*; public class TankWar extends JFrame { private static final long serialVersionUID = 1L; // 窗口大小 public static final int WIDTH = 800; public static final int HEIGHT = 600; private MyPanel mp; public static void main(String[] args) { new TankWar(); } public TankWar() { mp = new MyPanel(); this.add(mp); this.setTitle("坦克大战"); this.setSize(WIDTH, HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setResizable(false); } private class MyPanel extends JPanel implements KeyListener { private static final long serialVersionUID = 1L; private Tank myTank; private ArrayList<Tank> enemyTanks; private ArrayList<Missile> missiles; private ArrayList<Explode> explodes; public MyPanel() { myTank = new Tank(400, 500, true); enemyTanks = new ArrayList<Tank>(); missiles = new ArrayList<Missile>(); explodes = new ArrayList<Explode>(); for (int i = 0; i < 5; i++) { enemyTanks.add(new Tank(i * 150, 0, false)); } this.setFocusable(true); this.addKeyListener(this); new Thread(new EnemyTankThread()).start(); new Thread(new MissileThread()).start(); new Thread(new ExplodeThread()).start(); } @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); myTank.draw(g); for (int i = 0; i < enemyTanks.size(); i++) { enemyTanks.get(i).draw(g); } for (int i = 0; i < missiles.size(); i++) { missiles.get(i).draw(g); } for (int i = 0; i < explodes.size(); i++) { explodes.get(i).draw(g); } g.setColor(Color.WHITE); g.drawString("Missiles: " + missiles.size(), 10, 30); } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { myTank.move(Tank.UP); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { myTank.move(Tank.DOWN); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { myTank.move(Tank.LEFT); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { myTank.move(Tank.RIGHT); } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { missiles.add(myTank.fire()); } repaint(); } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } private class EnemyTankThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < enemyTanks.size(); i++) { enemyTanks.get(i).move((int) (Math.random() * 4)); if (Math.random() < 0.2) { missiles.add(enemyTanks.get(i).fire()); } } repaint(); } } } private class MissileThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); if (missile.isAlive()) { missile.move(); for (int j = 0; j < enemyTanks.size(); j++) { Tank enemyTank = enemyTanks.get(j); if (enemyTank.isAlive() && missile.hit(enemyTank)) { explodes.add(new Explode(enemyTank.getX(), enemyTank.getY())); enemyTank.setAlive(false); missile.setAlive(false); } } if (myTank.isAlive() && missile.hit(myTank)) { explodes.add(new Explode(myTank.getX(), myTank.getY())); myTank.setAlive(false); missile.setAlive(false); } } else { missiles.remove(i); i--; } } repaint(); } } } private class ExplodeThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < explodes.size(); i++) { Explode explode = explodes.get(i); if (explode.isAlive()) { explode.nextStep(); } else { explodes.remove(i); i--; } } repaint(); } } } } } class Tank { public static final int UP = 0; public static final int DOWN = 1; public static final int LEFT = 2; public static final int RIGHT = 3; private static final int SIZE = 30; private static final int SPEED = 5; private int x; private int y; private boolean good; private boolean alive; private int direction; public Tank(int x, int y, boolean good) { this.x = x; this.y = y; this.good = good; this.alive = true; this.direction = UP; } public void draw(Graphics g) { if (alive) { g.setColor(good ? Color.GREEN : Color.YELLOW); g.fillOval(x, y, SIZE, SIZE); g.setColor(good ? Color.DARK_GRAY : Color.LIGHT_GRAY); switch (direction) { case UP: g.fillRect(x + SIZE / 2 - 5, y, 10, SIZE / 2); break; case DOWN: g.fillRect(x + SIZE / 2 - 5, y + SIZE / 2, 10, SIZE / 2); break; case LEFT: g.fillRect(x, y + SIZE / 2 - 5, SIZE / 2, 10); break; case RIGHT: g.fillRect(x + SIZE / 2, y + SIZE / 2 - 5, SIZE / 2, 10); break; } } } public void move(int direction) { this.direction = direction; switch (direction) { case UP: y -= SPEED; if (y < 0) { y = 0; } break; case DOWN: y += SPEED; if (y > TankWar.HEIGHT - SIZE) { y = TankWar.HEIGHT - SIZE; } break; case LEFT: x -= SPEED; if (x < 0) { x = 0; } break; case RIGHT: x += SPEED; if (x > TankWar.WIDTH - SIZE) { x = TankWar.WIDTH - SIZE; } break; } } public Missile fire() { int missileX = x + SIZE / 2 - Missile.SIZE / 2; int missileY = y + SIZE / 2 - Missile.SIZE / 2; return new Missile(missileX, missileY, direction, good); } public int getX() { return x; } public int getY() { return y; } public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; } } class Missile { public static final int SIZE = 10; public static final int SPEED = 10; private int x; private int y; private boolean good; private boolean alive; private int direction; public Missile(int x, int y, int direction, boolean good) { this.x = x; this.y = y; this.direction = direction; this.good = good; this.alive = true; } public void draw(Graphics g) { if (alive) { g.setColor(good ? Color.BLUE : Color.RED); g.fillOval(x, y, SIZE, SIZE); } } public void move() { switch (direction) { case Tank.UP: y -= SPEED; break; case Tank.DOWN: y += SPEED; break; case Tank.LEFT: x -= SPEED; break; case Tank.RIGHT: x += SPEED; break; } if (x < 0 || x > TankWar.WIDTH || y < 0 || y > TankWar.HEIGHT) { alive = false; } } public boolean hit(Tank tank) { if (good == tank.good) { return false; } if (x >= tank.getX() && x <= tank.getX() + Tank.SIZE && y >= tank.getY() && y <= tank.getY() + Tank.SIZE) { return true; } return false; } public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; } } class Explode { private static final int SIZE = 50; private static final int STEPS = 5; private int x; private int y; private boolean alive; private int step; public Explode(int x, int y) { this.x = x - SIZE / 2; this.y = y - SIZE / 2; this.alive = true; this.step = 0; } public void draw(Graphics g) { if (alive) { Color color = g.getColor(); g.setColor(Color.ORANGE); g.fillOval(x, y, SIZE - step * 10, SIZE - step * 10); g.setColor(color); nextStep(); } } public void nextStep() { step++; if (step == STEPS) { alive = false; } } public boolean isAlive() { return alive; } } ``` 这个代码实现了基本的游戏功能,包括坦克移动、开火、子弹碰撞、爆炸效果等。你可以尝试添加更多的功能来完善这个游戏。

相关推荐

最新推荐

recommend-type

java坦克大战代码分析

Java 坦克大战代码分析 Java 坦克大战是一款基于 Java 语言开发的小游戏,旨在帮助学生学习 Java 基础知识和面向对象编程思想。本资源为 Java 坦克大战的代码分析,涵盖了面向对象、Swing 和线程等多方面的知识点。...
recommend-type

java语言的单机版坦克大战源代码

《Java语言实现的单机版坦克大战源代码解析》 在计算机编程领域,尤其是游戏开发中,使用Java语言实现的单机版坦克大战是一个经典的案例,它涉及到图形用户界面(GUI)、事件处理、对象和类的运用等多个核心知识点...
recommend-type

用java 做坦克大战 系统

【Java 坦克大战系统开发】是一个富有实践性的项目,旨在帮助学习者在实际操作中加深对Java语言的理解,尤其是其图形化用户界面GUI、多线程(Thread)以及事件处理等方面的应用。该项目的设计和实现涉及到以下几个核心...
recommend-type

java编写的坦克大战[毕业设计]

这是一个用java编写的坦克大战的游戏毕业设计! 目 录 摘 要 - I - Abstract - II - 引 言 - 3 - 第一章 绪 论 - 1 - 1.1 手机软件现状 - 1 - 1.2 游戏业务及J2ME概况 - 1 - 1.3 任天堂(Nintendo)的8位FC机器和...
recommend-type

电力电子系统建模与控制入门

"该资源是关于电力电子系统建模及控制的课程介绍,包含了课程的基本信息、教材与参考书目,以及课程的主要内容和学习要求。" 电力电子系统建模及控制是电力工程领域的一个重要分支,涉及到多学科的交叉应用,如功率变换技术、电工电子技术和自动控制理论。这门课程主要讲解电力电子系统的动态模型建立方法和控制系统设计,旨在培养学生的建模和控制能力。 课程安排在每周二的第1、2节课,上课地点位于东12教401室。教材采用了徐德鸿编著的《电力电子系统建模及控制》,同时推荐了几本参考书,包括朱桂萍的《电力电子电路的计算机仿真》、Jai P. Agrawal的《Powerelectronicsystems theory and design》以及Robert W. Erickson的《Fundamentals of Power Electronics》。 课程内容涵盖了从绪论到具体电力电子变换器的建模与控制,如DC/DC变换器的动态建模、电流断续模式下的建模、电流峰值控制,以及反馈控制设计。还包括三相功率变换器的动态模型、空间矢量调制技术、逆变器的建模与控制,以及DC/DC和逆变器并联系统的动态模型和均流控制。学习这门课程的学生被要求事先预习,并尝试对书本内容进行仿真模拟,以加深理解。 电力电子技术在20世纪的众多科技成果中扮演了关键角色,广泛应用于各个领域,如电气化、汽车、通信、国防等。课程通过列举各种电力电子装置的应用实例,如直流开关电源、逆变电源、静止无功补偿装置等,强调了其在有功电源、无功电源和传动装置中的重要地位,进一步凸显了电力电子系统建模与控制技术的实用性。 学习这门课程,学生将深入理解电力电子系统的内部工作机制,掌握动态模型建立的方法,以及如何设计有效的控制系统,为实际工程应用打下坚实基础。通过仿真练习,学生可以增强解决实际问题的能力,从而在未来的工程实践中更好地应用电力电子技术。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

图像写入的陷阱:imwrite函数的潜在风险和规避策略,规避图像写入风险,保障数据安全

![图像写入的陷阱:imwrite函数的潜在风险和规避策略,规避图像写入风险,保障数据安全](https://static-aliyun-doc.oss-accelerate.aliyuncs.com/assets/img/zh-CN/2275688951/p86862.png) # 1. 图像写入的基本原理与陷阱 图像写入是计算机视觉和图像处理中一项基本操作,它将图像数据从内存保存到文件中。图像写入过程涉及将图像数据转换为特定文件格式,并将其写入磁盘。 在图像写入过程中,存在一些潜在陷阱,可能会导致写入失败或图像质量下降。这些陷阱包括: - **数据类型不匹配:**图像数据可能与目标文
recommend-type

protobuf-5.27.2 交叉编译

protobuf(Protocol Buffers)是一个由Google开发的轻量级、高效的序列化数据格式,用于在各种语言之间传输结构化的数据。版本5.27.2是一个较新的稳定版本,支持跨平台编译,使得可以在不同的架构和操作系统上构建和使用protobuf库。 交叉编译是指在一个平台上(通常为开发机)编译生成目标平台的可执行文件或库。对于protobuf的交叉编译,通常需要按照以下步骤操作: 1. 安装必要的工具:在源码目录下,你需要安装适合你的目标平台的C++编译器和相关工具链。 2. 配置Makefile或CMakeLists.txt:在protobuf的源码目录中,通常有一个CMa
recommend-type

SQL数据库基础入门:发展历程与关键概念

本文档深入介绍了SQL数据库的基础知识,首先从数据库的定义出发,强调其作为数据管理工具的重要性,减轻了开发人员的数据处理负担。数据库的核心概念是"万物皆关系",即使在面向对象编程中也有明显区分。文档讲述了数据库的发展历程,从早期的层次化和网状数据库到关系型数据库的兴起,如Oracle的里程碑式论文和拉里·埃里森推动的关系数据库商业化。Oracle的成功带动了全球范围内的数据库竞争,最终催生了SQL这一通用的数据库操作语言,统一了标准,使得关系型数据库成为主流。 接着,文档详细解释了数据库系统的构成,包括数据库本身(存储相关数据的集合)、数据库管理系统(DBMS,负责数据管理和操作的软件),以及数据库管理员(DBA,负责维护和管理整个系统)和用户应用程序(如Microsoft的SSMS)。这些组成部分协同工作,确保数据的有效管理和高效处理。 数据库系统的基本要求包括数据的独立性,即数据和程序的解耦,有助于快速开发和降低成本;减少冗余数据,提高数据共享性,以提高效率;以及系统的稳定性和安全性。学习SQL时,要注意不同数据库软件可能存在的差异,但核心语言SQL的学习是通用的,后续再根据具体产品学习特异性。 本文档提供了一个全面的框架,涵盖了SQL数据库从基础概念、发展历程、系统架构到基本要求的方方面面,对于初学者和数据库管理员来说是一份宝贵的参考资料。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依