JAVA—坦克
Java综合编程——坦克大战(15.1.5)
子弹类中的run()方法中
ActionEvent e
实现事件监听三步:
1. 2. 3.
确定事件源 确定监听类 监听对象的注册
举例——练习1
1. 2.tton,当该 按钮被按下后,系统给出提示 事件源JButton对象 监听器:
单独创建一个类负责监听 让JFrame负责监听
3.
把监听器加入到事件源中(注册监听) *事件对象,系统自动产生
坦克有方向, 画出所有方向的坦克
3、形成Tank类的子类
敌人坦克(EnemyTank)和我方坦克 (MyTank) 在这两个方法中覆盖父类的构造方法 将敌人坦克的颜色设置成蓝色 我方坦克设置成红色
4、
在MyPanel中绘制出一辆我方坦克,方向 向上 绘制出五辆敌人坦克,方向向下
在paint方法中用System.out.println(“调用 paint");
画直线:g.drawLine(10, 10, 40, 40); 画矩形边框:g.drawRect(60, 60, 100, 200); 画填充矩形:g.fill3DRect(50, 50, 30, 30, true); 设置颜色:g.setColor(Color.red);
基础知识
1. 2.
图形用户界面 Java绘图技术
1、图形用户界面
创建一个用户界面JFrame,取名为MainFrame 在其上添加一个JPanel,显示一个圆。
编程思路
(构建坦克大战主窗口)
坦克大战的主窗口是由一个JFrame构成的,因 为需要在上面作图,但是JFrame没有这个功能, 所以我们要在JFrame上再加上一个JPanel,在 JPanel上绘图。 我们在这里没有直接用JFrame和JPanel类,而 是定义另外两个类MainFrame和MainPanel,这 个两个类分别继承了JFrame和JPanel,然后再 由这两个类分别生成对象mf和mp,我们要在mp 对象上作图
JAVA课程设计 坦克大战
得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
减少内存占用:优 化数据结构,减少 不必要的内存分配
提高渲染效率: 优化渲染算法, 减少渲染时间
优化网络通信:减 少网络延迟,提高 网络通信效率
优化AI算法:提高 AI算法的效率和准 确性,提高游戏体 验
界面布局:合 理规划界面布 局,提高用户
玩家需要控制坦克,消灭敌 人,保护自己的基地
游戏支持多人在线对战,玩 家可以与朋友一起挑战
玩家控制 坦克,在 战场上与 敌人战斗
坦克可以 发射炮弹, 摧毁敌人 或障碍物
玩家需要 躲避敌人 的攻击, 保护自己 的坦克
游戏有各 种关卡, 难度逐渐 增加
玩家可以 通过升级 坦克,提 高战斗力
游戏支持 多人在线 对战,增 加游戏乐 趣
生命值耗尽:当 玩家的生命值降 至0时,游戏结束
时间耗尽:当游 戏时间耗尽时, 游戏结束
胜利条件:当玩 家达到胜利条件 时,游戏结束
失败条件:当玩 家达到失败条件 时,游戏结束
得分规则:击毁敌 方坦克得分,被敌 方坦克击毁扣分
得分方式:根据击 毁敌方坦克的数量 和难度计算得分
得分限制:得分上 限为1000分,达到 上限后不再增加得 分
,a click to unlimited possibilities
汇报人:
01
02
03
04
05
06
游戏类型:坦克大战
游戏背景:二战时期
游戏目标:摧毁敌方坦克,保 护自己的基地
游戏玩法:玩家控制坦克,通 过射击和躲避来消灭敌方坦克
游戏包含多个关卡,每个关 卡有不同的难度和挑战
设计一款坦克大战游戏
游戏界面:包括 菜单、地图、角 色、道具等元素
JAVA课程设计坦克大战含代码
游戏结束判断
生命值耗尽:当坦克的生命值降至0时,游戏结束 游戏时间结束:当游戏时间达到预设值时,游戏结束 胜利条件达成:当一方达到预设的胜利条件时,游戏结束 玩家主动退出:当玩家主动选择退出游戏时,游戏结束
游戏得分计算
得分规则:击毁敌 方坦克、保护己方 坦克、完成特定任 务等
得分方式:根据击 毁敌方坦克的数量、 保护己方坦克的数 量、完成任务的难 度等计算得分
得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
得分记录:游戏结 束后,记录玩家的 分情况,方便玩 家查看历史成绩
游戏优化与扩展
游戏性能优化
优化算法: 使用更高 效的算法, 如动态规 划、贪心 算法等
减少内存 占用:优 化数据结 构,减少 不必要的 内存占用
优化渲染: 使用更高 效的渲染 技术,如 OpenGL、 DirectX 等
优化网络 传输:使 用更高效 的网络传 输协议, 如TCP、 UDP等
优化AI: 使用更高 效的AI算 法,如神 经网络、 遗传算法 等
优化资源 管理:合 理分配系 统资源, 避免资源 浪费
游戏扩展功能实现
增加新的坦克类型:如重型坦克、轻 型坦克等
增加新的地图:如沙漠地图、雪地地 图等
增加新的游戏模式:如团队模式、生 存模式等
音效类型:背景音乐、战斗音效、 胜利音效等
音效处理:音量调节、音效混合、 音效剪辑等
添加标题
添加标题
添加标题
添加标题
音效来源:自行创作、购买版权、 网络下载等
音效与游戏场景的结合:根据游戏 场景选择合适的音效,增强游戏体 验
游戏实体设计
坦克类设计
坦克属性:生命值、攻击 力、防御力、速度等
Java坦克大战项目
Java坦克大战项目创建一个完整的Java坦克大战项目是一个庞大的任务,无法在一个简短的回答中完成。
不过,我可以为你提供一个项目的基本框架和一些关键概念,以帮助你入门。
你可以根据这些提示逐步构建项目。
游戏引擎选择:首先,你需要选择一个Java游戏引擎或库,用于处理游戏的图形渲染、事件处理和物理模拟。
一些常见的选择包括LibGDX、JavaFX、Slick2D等。
根据你的经验和需求选择一个适合的引擎。
游戏窗口:创建一个游戏窗口,用于显示游戏画面。
这个窗口将包含游戏中的所有元素。
坦克和地图设计:设计坦克和游戏地图的图形。
你可以使用图像编辑工具创建坦克、障碍物和地图背景。
确保这些图像在游戏中能够被加载和渲染。
坦克控制:实现玩家和敌方坦克的控制。
你需要编写代码来处理玩家输入,例如上、下、左、右键来移动坦克,并且能够射击。
碰撞检测:编写碰撞检测逻辑,以便坦克能够检测到障碍物和敌方坦克,以及子弹能够击中目标。
当两个物体相撞时,需要处理相应的行为,如坦克的爆炸效果。
游戏逻辑:实现游戏规则,包括分数、关卡切换、游戏结束等。
考虑添加一些额外的元素,如道具、敌方AI等,以增加游戏的趣味性。
音效和音乐:为游戏添加音效和背景音乐,增强游戏体验。
用户界面:创建游戏的用户界面,包括开始菜单、游戏界面和游戏结束画面。
游戏循环:实现游戏循环,确保游戏画面能够以恒定的帧率更新,通常是30或60帧每秒。
测试和调试:在开发过程中进行测试和调试,确保游戏运行稳定并且没有严重的bug。
发布:一旦你的游戏完成,你可以将其打包为可执行文件或部署到Web上,以供其他人玩。
创建一个完整的Java坦克大战项目需要大量的代码和资源,不可能在这里提供所有的代码,但我可以为你提供一个简单的示例,涵盖了一些基本的概念,你可以基于这个示例来扩展你的项目。
首先,你需要创建一个Java类,来表示坦克:import java.awt.Color;import java.awt.Graphics;public class Tank {private int x, y; // 坦克的坐标private int speed; // 坦克的移动速度public Tank(int x, int y) {this.x = x;this.y = y;this.speed = 5;}public void move(String direction) {if (direction.equals("UP")) {y -= speed;} else if (direction.equals("DOWN")) {y += speed;} else if (direction.equals("LEFT")) {x -= speed;} else if (direction.equals("RIGHT")) {x += speed;}}public void draw(Graphics g) {g.setColor(Color.RED);g.fillRect(x, y, 30, 30); // 画一个红色的坦克}}接下来,你需要创建一个Java主类,用于处理游戏循环和用户输入:import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;public class TankGame extends JPanel implements ActionListener { private Tank playerTank;public TankGame() {playerTank = new Tank(100, 100);// 添加键盘事件监听器addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_W) {playerTank.move("UP");} else if (key == KeyEvent.VK_S) {playerTank.move("DOWN");} else if (key == KeyEvent.VK_A) {playerTank.move("LEFT");} else if (key == KeyEvent.VK_D) {playerTank.move("RIGHT");}}});setFocusable(true);Timer timer = new Timer(100, this); // 创建一个定时器timer.start();}@Overridepublic void actionPerformed(ActionEvent e) {repaint();}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);playerTank.draw(g);}public static void main(String[] args) {JFrame frame = new JFrame("Tank Game");TankGame tankGame = new TankGame();frame.add(tankGame);frame.setSize(800, 600);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}这只是一个简单的开始,你可以在此基础上继续扩展和改进你的坦克大战项目。
java坦克大战实训步骤过程
java坦克大战实训步骤过程随着计算机科技的不断发展,软件工程技术也随之受到了广泛的关注。
在计算机专业的学习中,实训课程是非常重要的一部分。
本文主要介绍了java坦克大战实训的过程和步骤,为读者提供了一定的参考。
步骤一:学习java相关知识在进行java坦克大战实训之前,需要学习java编程语言、集合框架、线程、图像处理等相关知识。
在深刻理解了这些知识后,才能更好地理解和掌握java坦克大战的开发。
步骤二:了解java坦克大战游戏规则在实际操作前,需要对java坦克大战的规则进行了解,游戏的画面分为地图区和状态栏区,游戏的主角是坦克,在游戏中要避开敌方坦克的攻击,同时击败敌人,完成任务。
步骤三:进行开发环境的配置在学习掌握了这些知识之后,就要进行具体的开发了。
首先需要搭建java开发环境,下载jdk和eclipse等开发工具,实现本地环境的搭建。
步骤四:进行源代码的编写在配置好开发环境之后,需要着手编写源代码。
根据游戏规则,需要编写坦克、地图、子弹、爆炸等功能模块。
在实现各个模块的基础上,要进行各种功能的测试和优化,并将各个模块进行整合。
步骤五:进行调试和优化在编写源代码之后,需要进行调试和优化,确保游戏的功能模块全部实现,游戏的效果流畅,同时具备足够的可玩性。
步骤六:进行游戏的发布和测试在游戏的开发和优化完成后,需要将游戏发布出来,并进行实际测试。
在游戏的测试过程中,需要检验游戏的各种功能和操作是否正确,同时也要考虑到游戏的容错性。
总结:在进行java坦克大战实训的过程中,需要充分学习和理解java 的相关知识,进行开发环境的配置,编写源代码并进行调试和优化,最终进行游戏的发布和测试。
实训过程既考验了学生的编程能力,也对学生的逻辑思维能力和团队协作能力提出了更高的要求。
可以说,从中学生学会了如何将理论知识转化为实际操作技能,为后续的职业发展打下了重要的基础。
java课设报告坦克大战
java课设报告坦克大战什么是Java课设报告坦克大战?Java课设报告坦克大战是一个基于Java编程语言开发的游戏项目。
它模拟了坦克战争的场景,玩家需要操控一辆坦克,与其他玩家或者电脑控制的敌人进行战斗,完成各种任务。
这个项目旨在提高学生的Java编程能力和团队协作能力。
第一步:需求分析和设计在开始编写代码之前,我们需要进行需求分析和设计。
首先,确定游戏的功能和玩法。
例如,游戏应该具有地图、坦克、子弹等基本元素,玩家可以使用键盘控制坦克的移动和攻击,坦克和子弹应该有相应的属性和行为,坦克应该能够与其他坦克进行交互等等。
其次,我们需要设计游戏的界面和用户交互方式,包括游戏的开始菜单、游戏画面、得分、生命值等界面元素。
最后,我们应该考虑游戏的可扩展性,使得我们能够在后续的开发过程中添加更多的功能和元素。
第二步:编写代码在设计完成后,我们开始编写Java代码。
首先,我们创建一个Java项目,并进行必要的配置,例如添加游戏所需的外部库和资源文件。
然后,我们开始编写代码。
我们可以将游戏的不同元素,例如地图、坦克、子弹等,抽象成不同的类,并为每个类定义相应的属性和方法。
我们还可以使用设计模式和面向对象的编程思想,使得代码更加清晰和可维护。
同时,我们需要为游戏添加适当的事件处理器,以响应用户的操作和更新游戏状态。
我们还可以使用Java图形库或者相关的游戏引擎,使游戏具有更好的视觉效果和用户体验。
第三步:测试和调试在代码编写完成后,我们需要进行测试和调试。
我们可以编写一些测试用例,验证游戏的各个功能和元素是否正常工作。
同时,我们需要定期检查并修复可能存在的bug和错误,确保游戏的稳定性和可玩性。
在这个过程中,我们可以与团队成员合作,互相交流和帮助,提高解决问题的效率和质量。
第四步:项目上线和发布在完成测试和调试后,我们可以将游戏部署到服务器上,并发布给玩家。
我们可以选择通过应用商店或者网站进行发布,或者将游戏打包成可执行文件,供玩家下载和安装。
坦克大战【java项目】
坦克⼤战【java项⽬】坦克⼤战(JAVA项⽬)1.项⽬简介复刻童年经典⼩游戏——坦克⼤战:⽤户进⼊游戏界⾯后,通过键盘上的数字1,2键选择游戏模式,选择1并按回车键进⼊单⼈模式;选择2并按回车键进⼊双⼈模式。
玩家1可通过按键WASD控制坦克⽅向及移动,并且按空格发射⼦弹。
玩家2通过⽅向键控制坦克⽅向移动,并且按K键发射⼦弹。
⼦弹碰到围墙后消失,⼦弹碰到坦克后产⽣爆炸特效。
左上⾓记录敌⽅坦克的实时数量。
玩家击败所有敌⽅坦克,游戏胜利;若所有我⽅坦克被击败,或者我⽅基地被摧毁,则游戏失败。
2.⼩组成员及分⼯成员负责任务组长黄抒鸿博客撰写,游戏规则的制定,碰撞检测,爆炸特效的实现,随机事件的编写组员雷正伟前期调研,⾯向对象设计,窗体绘制,闪动问题的解决,键盘事件的编写3.项⽬功能架构图与主要功能流程图3.1项⽬功能架构图3.2主要功能流程图3.3⾯向对象类设计图4.功能详解4.1 窗体绘制及添加键盘事件4.1.1 创建窗⼝·创建类继承JFrame·创建启动⽅法launch()4.1.2 为窗⼝上⾊·重写paint()⽅法,设置图形颜⾊和⼤⼩4.1.3 添加选项⽂字4.1.4 为窗⼝添加键盘事件添加内部类,实现KeyAdapter类,重写keyPressed⽅法,写⼊键盘事件,1选择单⼈模式,2选择双⼈模式窗⼝添加键盘监视器添加指针图⽚在项⽬⽂件夹下创建⽂件夹images,关于项⽬的图⽚,插件都放在这个⽂件夹内创建图⽚对象在launch()⽅法中重绘图形4.2双缓冲解决闪动问题创建⼀个图⽚Image offScreemImage = null;重写paint()⽅法创建⼀个和弹出窗⼝宽⾼相同的图⽚,获取该图⽚的图形对象,把所有内容添加到该图⽚中//创建和容器⼀样⼤⼩的Image图⽚if(offScreemImage == null) {offScreemImage = this.createImage(width,height);}//获的该图⽚的图形Graphics gImage = offScreemImage.getGraphics();gImage.setColor(Color.GRAY);gImage.fillRect(0, 0, width, height);//添加游戏选项gImage.setColor(Color.BLUE);gImage.setFont(new Font("仿宋", Font.BOLD, 50));if (state == 0 ) {gImage.drawString("选择游戏模式", 220, 100);gImage.drawString("单⼈模式", 220, 200);gImage.drawString("双⼈模式", 220, 300);//绘制指针gImage.drawImage(select, 160, y, null);} else if (state ==1 || state ==2) {gImage.drawString("游戏开始", 220, 100);if (state ==1) {gImage.drawString("单⼈模式", 220, 200);} else if(state ==2) {gImage.drawString("双⼈模式", 220, 200);}}4.3⾯向对象设计游戏⽗类:坦克类:玩家⼀和玩家⼆玩家2和玩家1的⽅法都是⼀样的,只需要修改键盘事件。
JAVA课程设计坦克大战(含代码)
Java程序课程设计任务书项目名称:坦克大战游戏的设计与开发英文名:Tank Battle1、主要内容:1、基于java的游戏开发与设计的分析;2、坦克大战游戏的架构搭建与设计实现;3、游戏可以通过用户可以注册新用户,修改自己的密码、个人资料。
2、具体要求1、系统的功能要求:(一)实现玩家试玩游戏功能,屏蔽用户注册和登陆功能(空功能)(二)玩家具备一个或者两个备选坦克战车(三)玩家可以选择一个到两个关卡进行作战(四)玩家可以选择两个敌对阵营中的一个加入,与其他AI战车坦克并肩作战(五)胜利判定条件为:时间制、全杀制(可选)(六)至少提供两个可以自由切换的视角(七)至少提供一种炮弹类型(八)假定项目:如果用户注册,登陆功能能够顺利做好,则提供一个玩家分数上传和排行榜功能。
2、学习并掌握以下技术:数据库的JDBC连接,JA V A编程语言,MySQL数据库的应用;JSP的开发与运用3、熟练使用以下开发工具:JCreator,Myeclipse ,MySQL ,PowerDesigner 等3、进度安排:12月28日~ 12 月29 日:查阅资料,完成文献综述,任务书;12月29 日~ 12月31日:进行系统的需求分析与设计;1月1日~ 1月3日:根据分析进行各个模块程序的设计与创建;1月4日~ 1 月6日:完成各个模块的程序编写;1月7 日~ 1 月8 日:完成全部程序的编写及系统测试;1月9日~ 1 月10日:完成课程设计报告的编写,答辩;摘要随着Java语言的不断发展和壮大,现在的Java已经广泛的应用于各个领域,包括医药,汽车工业,手机行业,游戏,等等地方。
Java游戏的开发为满足人们娱乐所需而设计。
本游戏为坦克大战游戏,是基于Java的图形用户界面而开发的,可以放松心情的小游戏。
游戏从系统操作简便、界面友好、灵活、上手即会的基本要求出发,完成整款游戏的开发。
游戏更设置了暂停、计分、音乐、速度,用户信息保存等功能,可以根据自己的爱好,挑战更高难度,为用户带来愉悦的体验。
基于J2ME的Java游戏--坦克大战的开发
摘要Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。
Java语言面向对象的优势也使得开发游戏变得非常容易。
随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序——坦克大战。
本程序的界面和运作方式继承于日本任天堂公司在20世纪80年代开发的Battle City游戏,将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
本论文介绍了任天堂红白机的软硬件特性、J2ME的相关技术及本程序的结构分析和具体功能的实现。
[关键字]:J2ME,手机游戏,Java,坦克大战ABSTRACTJava has an advantage of running in different platforms that shows its power in developing for the mobile device. The advantage of object-oriented of Java makes development of games easily.When cell phone is getting ever more popular nowadays, with the implementation of Java technology on mobile equipment, increment of capital on communication service exhibits its force on people’s everyday life, providing them ever fast information just in hand. This dissertation focuses on implementation ofJ2ME technology and has developed a commercial game suite run on mobile phones—Tank. This application inherits many characters of the old fashioned game Battle City which developed by Nintendo in 1980s. It transports the classical product to mobile phones, offering corresponding software for such more popular hardware platform.This dissertation introduces the characteristic of Nintendo FC machine and its software, J2ME and its relative technology as well as this program’s structure and analysis of implementation in details.[Keywords]: J2ME, mobile game, Java, tank, Battle City.引言自从Java问世以来,Sun公司已经成功的将Java平台技术推广到台式计算机与服务器。
java坦克大战算法题
java坦克大战算法题Java坦克大战算法题坦克大战是一款经典的游戏,在这个游戏中,玩家需要操控一辆坦克,并通过消灭敌人来获取胜利。
为了让游戏更有趣味性,我们可以通过编写一些算法来实现更智能化的敌人AI,提高游戏体验。
1. 随机移动在游戏中,敌人一般都是会四处移动的,我们可以通过编写一个随机移动的算法来实现。
具体实现方式如下:先定义一个移动范围,防止敌人跑出游戏界面。
接下来,根据一个随机数生成器,随机生成四个方向上的移动,比如1代表向上移动,2代表向下移动,3代表向左移动,4代表向右移动。
接着,判断随机生成的方向是否可以移动,如果可以,则执行移动操作;如果不行,则继续随机方向。
2. 追踪敌人除了随机移动,敌人也需要能够追踪玩家的操作,并采取相应的行动。
具体实现方式如下:首先,我们需要定义一个敌人的视野范围,用来检测玩家的位置。
然后,每隔一段时间,敌人会检测一次玩家的位置,并计算出与玩家的距离。
如果玩家距离敌人较远,则敌人继续随机移动;如果玩家距离较近,则敌人会判断是否能够发射子弹攻击玩家,如果可以,则发射子弹攻击,否则继续追踪玩家。
3. 攻击优先级在游戏中,不同的敌人拥有不同的攻击方式和智能程度,攻击优先级也不同。
比如说,攻击力强的敌人会先攻击玩家,攻击力较弱的敌人则会先攻击其他敌人。
实现方式如下:定义每个敌人的攻击优先级,根据优先级进行攻击。
例如,一个敌人可以攻击玩家、敌人1、敌人2和敌人3,那么优先攻击玩家,如果玩家不在视野范围内,则攻击敌人1,满足条件的前提下,尽量攻击攻击力强的敌人。
总结通过这些算法的实现,我们可以为敌人AI添加更多智能的行为,让游戏更具挑战性和趣味性。
当然,这些算法只是一个开始,我们还可以继续优化和改进,创造出更加强大的敌人AI,为玩家带来更好的游戏体验。
坦克大战Java代码Tank
import java.awt.*;import java.awt.event.*;import java.util.*;//定义坦克类public class Tank {public static final int XSPEED = 5; //坦克水平速度public static final int YSPEED = 5; //坦克垂直速度public static final int WIDTH = 30; //坦克宽度public static final int HEIGHT = 30; //坦克高度private boolean live = true; //初始化生命为trueprivate BloodBar bb = new BloodBar();//声明血块变量private int life = 100; //初始化生命值为100TankClient tc;//生命坦克客户端变量private boolean good;//设置区分敌我两方标志private int x, y; //声明两个整型私有变量x,y坐标private int oldX, oldY;//记录上一步的坐标private static Random r = new Random(); //创建一个随机数r对象//声明方向变量private boolean bL=false, bU=false, bR=false, bD = false;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};/*坦克的八个方向和一个stop 状态*/private Direction dir = Direction.STOP;private Direction ptDir = Direction.D;private int step = r.nextInt(12) + 3;//整数step在[3,14]间随机取值//构造方法public Tank(int x, int y, boolean good) {this.x = x;this.y = y;this.oldX = x;this.oldY = y;this.good = good;}//重写构造方法public Tank(int x, int y, boolean good, Direction dir, TankClient tc) { this(x, y, good);this.dir = dir;this.tc = tc;}//画出坦克public void draw(Graphics g) {if(!live) {if(!good) {tc.tanks.remove(this);}return;}Color c = g.getColor();//获取颜色if(good) g.setColor(Color.RED);//我方坦克颜色设置为红色else g.setColor(Color.BLUE);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);//画出子弹if(good) bb.draw(g);switch(ptDir) {case L:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);break;case LU:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);break;case U:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);break;case RU:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);break;case R:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);break;case RD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);break;case D:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Tank.HEIGHT);break;case LD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);break;}move();}//移动方法void move() {//记录上一次坐标this.oldX = x;this.oldY = y;switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(this.dir != Direction.STOP) {this.ptDir = this.dir;}//控制坦克不出界if(x < 0) x = 0;if(y < 30) y = 30;if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;if(!good) {Direction[] dirs = Direction.values();if(step == 0) {step = r.nextInt(12) + 3;int rn = r.nextInt(dirs.length);//改变方向dir = dirs[rn];}step --;if(r.nextInt(40) > 38) this.fire();}}private void stay() {x = oldX;y = oldY;}//键按下的消息处理public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch(key) {case KeyEvent.VK_Q :if(!this.live) {this.live = true;this.life = 100;}break;case KeyEvent.VK_LEFT :bL = true;break;case KeyEvent.VK_UP :bU = true;break;case KeyEvent.VK_RIGHT :bR = true;break;case KeyEvent.VK_DOWN :bD = true;break;}locateDirection();}//设定方向void locateDirection() {if(bL && !bU && !bR && !bD) dir = Direction.L;else if(bL && bU && !bR && !bD) dir = Direction.LU;else if(!bL && bU && !bR && !bD) dir = Direction.U;else if(!bL && bU && bR && !bD) dir = Direction.RU;else if(!bL && !bU && bR && !bD) dir = Direction.R;else if(!bL && !bU && bR && bD) dir = Direction.RD;else if(!bL && !bU && !bR && bD) dir = Direction.D;else if(bL && !bU && !bR && bD) dir = Direction.LD;else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;}//键抬起的消息处理public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch(key) {case KeyEvent.VK_CONTROL:fire();break;case KeyEvent.VK_LEFT :bL =true;break;case KeyEvent.VK_UP :bU = true;break;case KeyEvent.VK_RIGHT :bR = true;break;case KeyEvent.VK_DOWN :bD = true;break;case KeyEvent.VK_A ://按下A开火superFire();break;}locateDirection();}//开火发射方法public Missile fire() {if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, ptDir, this.tc);tc.missiles.add(m);return m;}public Missile fire(Direction dir) {if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, dir, this.tc);tc.missiles.add(m);return m;}//看坦克是否与子弹碰撞public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}//判断坦克是否还活着public boolean isLive() {return live;}//设定坦克的生死状态public void setLive(boolean live) {this.live = live;}//判断坦克状态是否良好public boolean isGood() {return good;}//坦克与墙相撞public boolean collidesWithWall(Wall w) {if(this.live && this.getRect().intersects(w.getRect())) {this.stay();return true;}return false;}//坦克与坦克相撞public boolean collidesWithTanks(java.util.List<Tank> tanks) {for(int i=0; i<tanks.size(); i++) {Tank t = tanks.get(i);if(this != t) {if(this.live && t.isLive() && this.getRect().intersects(t.getRect())) {this.stay();t.stay();return true;}}}return false;}//发射超级子弹private void superFire() {Direction[] dirs = Direction.values();for(int i=0; i<8; i++) {fire(dirs[i]);}}//返回坦克的生命值public int getLife() {return life;}//设置坦克的生命值public void setLife(int life) {this.life = life;}//创建生命值private class BloodBar {//在坦克上方画出生命条public void draw(Graphics g) {Color c = g.getColor();g.setColor(Color.RED);g.drawRect(x, y-10, WIDTH, 10);int w = WIDTH * life/100 ;g.fillRect(x, y-10, w, 10);g.setColor(c);}}//判断坦克是否吃到东西public boolean eat(Blood b) {if(this.live && b.isLive() && this.getRect().intersects(b.getRect())) { this.life = 100;b.setLive(false);return true;}return false;}}。
Java课程设计——坦克大战
Java课程设计——坦克⼤战坦克⼤战——坦克类⼀. 团队课程设计博客链接⼆.个⼈负责模块和任务说明模块:坦克类(玩家坦克类+电脑坦克类),代码整合三.代码的提交记录截图四.负责模块和任务详细说明玩家坦克继承VisibleImage类,电脑坦克类继承⾃玩家坦克类,UML如下:1.玩家坦克类构造⽅法:设置坐标位置(坦克出⽣的位置),坦克的图⽚,坦克的类型(玩家还是电脑),⾯板(可将坦克放置于当前⾯板中),代码截图如下:移动⽅向:(上下左右)左移思路:若当前⽅向不是左移,则将图⽚更改为左移图⽚,并且更新⽅向为左。
若经过碰撞检测发现不会产⽣碰撞,则改变坐标,并且要判断坐标是否在边界。
其他⽅向同理,代码截图如下:碰撞检测:(墙与电脑坦克)思路:获取当前坐标周围⼀定范围内的矩形边框,同时获取当前⾯板内的所有墙体对象,将其存放于数组中。
将获得的矩形范围与所有墙体互相匹配,若符合则说明会产⽣碰撞。
注意草地例外。
坦克碰撞检测同理,注意要将⾃⼰除外,并且要查看当前坦克是否存活,代码截图如下:获得⼦弹:根据上下左右的⽅向判断坦克头的位置,即⼦弹发射的⽅向的预设,以保证之后⼦弹朝预设⽅向移动(⼦弹的移动在⼦弹类⾥)攻击⽅法:获得⼦弹,将⼦弹添加⾄⾯板(因为⼦弹有四个⽅向),启动攻击冷却线程。
触碰边界⽅法:根据屏幕与主窗体之间的⼤⼩关系,进⽽判断坦克是否移动到边界。
冷却线程:使⽤sleep()⽅法,经过休眠之后,要注意改变线程的状态,将其改为可攻击。
其余setter,getter⽅法则不进⾏详细描述。
2.电脑坦克类构造⽅法:继承⾃⽗类玩家坦克类,设置好初始⽅向,攻击冷却时间移动⽅向:在⽗类的基础上,改变了⽗类的⼿动产⽣新⽅向,⽽是随机产⽣新⽅向,并且在该⽅向的移动时间是设置好的,检测是否达到边界同理:碰撞检测,攻击⽅法的思路都与玩家坦克类相似,不同之处在于,玩家坦克类的⽅向是⼈为改动的,⽽电脑坦克类的⽅向是随机产⽣的,故要重写⽗类的这两个⽅法。
java坦克大战实训总结
java坦克大战实训总结
本次 java 坦克大战实训让我收获颇丰,简单总结如下:
一、了解了游戏设计的基本流程
在实训中,我通过分析需求,设计游戏逻辑,编写代码实现游戏逻辑,制作游戏素材等环节,了解了游戏开发的整个流程。
二、提高了编程能力
在实训中,我巩固了 java 和面向对象编程的基础知识,并通过编写坦克在地图上的运动、射击等功能代码,增强了自己的编程能力。
三、锻炼了沟通协作能力
在与组内成员的沟通中,我学会了向他人清晰地表达自己的想法,并且听取不同意见和建议,不断改进和完善自己的设计方案。
在实现代码时,我与组内成员紧密协作,分工合作,力争在规定的时间内完成实训任务。
四、了解了团队协作开发中的版本控制
在团队协作开发中,版本控制是一项非常重要的工作。
在实训中,我们采用了GitHub 来管理版本。
通过使用各种 Git 命令,我掌握了代码的远程上传和下载、版本合并等操作,提高了我的团队协作开发能力。
总的来说,这次实训让我更深入地了解了 java 编程以及坦克大战游戏的设计流程。
同时,它也是一个很好的锻炼自己编程能力和团队协作能力的机会,让我更加自信和熟练地应对未来的工作和生活。
Java坦克游戏
super(power,sp);
this.dir=dir;
}
public String getDir(){
return dir(String dir){
if(dir.equals("上")||dir.equals("下")||dir.equals("左")||dir.equals("右")){
}
}
public class test {
public static void main(String[] args) {
Tank tk=new Tank(100,50,"右");
tk.Attack();
}
}
代码结果:我是坦克,向右方向运动,速度50,攻击力100
Process finished with exit code 0
学习心得:
1.类的创建
2.类的继承
3.类的实例化
代码:package武器类;
class Weapon{
int power;
int sp;
public Weapon(){
}
public Weapon(int power,int sp){
this.power=power;
this.sp=sp;
}
}
class Tank extends Weapon{
private String dir;
Java坦克游戏
学院名称:
姓名:
日期:
实验内容:
创建一个武器类Weapen,具有攻击力Power(public),速度sp(public)字段,并实现构造方法
人工智能Java-坦克机器人系列-遗传算法
人工智能Java 坦克机器人系列: 遗传算法Robo cool (robocool@), 编程游戏爱好者, 自由撰稿人2006 年6 月30 日遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法。
本文将讲解这种算法,并介绍如何Robocode Java 坦克机器人中采用此算法以实现机器人进化。
遗传算法遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法。
1962年霍兰德(Holland)教授首次提出了GA算法的思想,它借用了仿真生物遗传学和自然选择机理,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。
从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。
这一点体现了自然界中"物竞天择、适者生存"进化过程。
与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体,并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会。
在算法中也即是以二进制编码的串。
并且,在执行遗传算法之前,给出一群染色体,也即是假设解。
然后,把这些假设解置于问题的“环境”中,也即一个适应度函数中来评价。
并按适者生存的原则,从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体,再通过交叉,变异过程产生更适应环境的新一代染色体群。
对这个新种群进行下一轮进化,至到最适合环境的值。
遗传算法已用于求解带有应用前景的一些问题,例如遗传程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和机器人运动规划等。
术语说明由于遗传算法是由进化论和遗传学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识,下面是我们将会用来的一些术语说明:一、染色体(Chronmosome)染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。
java坦克游戏双人对战版
坦克大战双人对战版班级:姓名:yangxixi 学号:任务:游戏设计,代码书写,调试班级:姓名:学号:任务:代码调试,美工一、游戏介绍:本游戏实现坦克大战双人对战,添加了超级炮弹,增加友军数量,复活等选项。
目前是单机版,网络版代码目前已实现联网对战。
P1玩家:WASD控制移动方向,F发射子弹,G发射超级炮弹,Q复活E增加5个友军,B清空;P2玩家:上下左右方向键控制移动方向,Ctrl发射子弹,I发射超级炮弹,O 复活P增加5个友军,B清空;二.设计思路:1.画出主窗口,坦克,实现自己坦克八个方向的移动:通过对按键监听,判断出坦克移动方向,再根据方向改变坦克位置,实现坦克的移动;2.产生敌人坦克:改变坦克好坏变量,增加敌人坦克;3.加入子弹,能够打击敌人:增加子弹类,封装所需信息,在合适位置创建子弹类对象;4.让敌人能够移动:用随机数产生器给坦克增加随机的方向,子弹;5.加入爆炸:增加爆炸类,在合适的地方创建对象;6.加入墙,解决碰撞问题:增加墙类,在合适的地方创建对象;7.加入血块:增加血块类,在合适的地方创建对象;加入血量显示:在我的坦克位置上方画出血量;8.添加超级炮弹,加入键位控制。
9.加入图片:加入图片让游戏更加美观。
10.加入另一两主战坦克,实现双人对战:产生另一辆坦克,以your变量区分,增加键盘控制;三.关键代码TankClient.java,Tank.java, Wall.java,Missile.java,Explode.java Blood.java一共6个java文件,其他每个类都拿到一个TankClient类的引用,方便对其变量,常量,方法的调用。
1.首先添加窗口关闭事件处理信息,固/*** 这个方法画出游戏的主窗口*/publicvoid launchFrame() {for(int i=0;i<5;i++){this.tanks.add(newTank(50+(i+1)*40,50,false,false,false,this));}this.setBounds(Startx, Starty,Image_Width,Image_LENGTH);this.setTitle("TankWar");this.setBackground(Color.black);this.setVisible(true);this.setResizable(false);/*** 添加窗口关闭监听*/this.addWindowListener(new WindowAdapter() {publicvoid windowClosing(WindowEvent e) {sw=false;System.exit(0);}重写paint方法,负责画出坦克,画出时只需调用坦克的draw方法(体现面向对象思维),意味着新建tank类,用于封装坦克信息,暂时用实心圆表示坦克,重写update方法,将坦克图像先画到一张图片上再画到屏幕上:myTank.draw(g);yourTank.draw(g);w1.draw(g);w2.draw(g);w3.draw(g);w4.draw(g);b.draw(g);publicvoid update(Graphics g) {if(offScreenImage==null){offScreenImage=this.createImage(Image_Width,Image_LENGTH);}Graphics goffScreen=offScreenImage.getGraphics();Color c=goffScreen.getColor();goffScreen.setColor(new Color(139, 139, 0));goffScreen.fillRect(0, 0, Image_Width,Image_LENGTH);paint(goffScreen);g.drawImage(offScreenImage, 0, 0, null);}接下来创建一个新的线程类,每隔80ms重画一次,当坦克的位置改变时,画面中就会出现坦克的移动,repaint方法会自动调用paint方法:publicclass PaintThread implements Runnable{/*** 重写run方法*/publicvoid run() {while(sw){repaint();try {Thread.sleep(80);} catch (InterruptedException e) {e.printStackTrace();}}接下来让坦克听从我们的指挥移动,添加键盘监听器类KeyMonitor,在tank 类中添加move方法及方向属性,move方法根据坦克方向改变坦克位置:case L:x -= x_SPEED;break;case LU:x -= x_SPEED;y -= y_SPEED;break;case U:y -= y_SPEED;break;case UR:x += x_SPEED;y -= y_SPEED;break;case R:x += x_SPEED;break;case RD:x += x_SPEED;y += y_SPEED;break;case D:y += y_SPEED;break;case LD:x -= x_SPEED;y += y_SPEED;break;case STOP:break;default:而在监听类中,先根据键盘读出上下左右(由keypressed方法完成),再判断是否有两个方向同时被按下(locateDirections方法完成):publicvoid keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_CONTROL:fire();break;case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;default:break;}locateDirections();publicvoid locateDirections() {if (bL&& !bU&& !bR&& !bD)dir = Directions.L;if (bL&&bU&& !bR&& !bD)dir = Directions.LU;if (!bL&&bU&& !bR&& !bD)dir = Directions.U;if (!bL&&bU&&bR&& !bD)dir = Directions.UR;if (!bL&& !bU&&bR&& !bD)dir = Directions.R;if (!bL&& !bU&&bR&&bD)dir = Directions.RD;if (!bL&& !bU&& !bR&&bD)dir = Directions.D;if (bL&& !bU&& !bR&&bD)dir = Directions.LD;if (!bL&& !bU&& !bR&& !bD)dir = Directions.STOP;TankCient添加键盘监听器,针对不同的键改变坦克的位置,与重画线程结合产生不同方向运动:publicvoid keyPressed(KeyEvent e) {myTank.keyPressed(e);yourTank.keyPressed1(e);addEnemTanks(e);addMyTanks(e);addMineTanks(e);cleanAll(e);superMissile(e);}这样我们就实现流坦克根据键盘按键向八个方向移动。
用java做坦克游戏
第一次课一、要做的工作1、产生一个800*600的窗口,背景色为绿色。
窗口可以被关闭,但不允许改变大小2、在窗口里画出一个红色的圆代表坦克3、让坦克动起来改变坦克的位置就相当于坦克移动了,因此首先需要把坦克的位置描述改为变量每重画一次坦克就动一次,让坦克不断的动就要不断的重画,我们用线程来控制二、知识点1、使用eclipse建立项目,创建包和类的方法2、变量命名规则:所有命名要求见名知义;类名首字母大小,变量和方法首字母小写;驼峰标识(比如类名:TankWar)3、事件机制●事件包括三个方面:监听器类,注册事件,覆盖方法●监听器类经常写成内部类(包括匿名内部类)或是类本身实现事件接口●事件接口包括actionListener接口、窗口事件接口、鼠标事件接口、键盘事件接口等等●使用事件接口要求把接口的所有方法都写出,但不一定都实现●窗口事件和鼠标键盘事件接口还提供了较为简洁的适配器类3、匿名内部类类可以分为如下几种:●主类:包含主方法的类●内部类:在一个类内部定义的类为内部类⏹实例内部类:在一个类内部独立存在,不属于类的成员变量和方法⏹静态内部类:用static修饰的实例内部类⏹局部内部类:在一个类的方法内定义的类⏹匿名内部类:没有名字的局部内部类●外部类:包含内部类的类,外部类也可能是其他类的内部类●顶层类:不是任何类的内部类为顶层类设计内部类的主要目标是“封装”。
●顶层类只能用public修饰或者不修饰(即默认修饰方式),内部类可以用public,protected,private,默认四种方式修饰,局部内部类只能用默认修饰●局部内部类和匿名内部类只在方法内可见,即该类只为该方法提供服务●实例内部类只在一个类内可见,只为该类提供服务4、利用eclipse重写父类的方法在eclipse中单击右键,源代码,生成覆盖方法。
此时会列出当前类的所有父类,当前类可以直接继承父类的方法。
5、图形的重画机制在frame上画出的图形每次刷新时会重画,重画的过程是:系统自动调用repaint 方法,repaint调用update方法,update调用paint方法,从而完成重画。
【java版坦克大战--事件处理】坦克动起来了
【java版坦克⼤战--事件处理】坦克动起来了折腾了这么久,坦克总算能动了。
只贴代码编辑不给上⾸页,花了半个⼩时的时间写了n多注释。
再顺便把绘图的原理发在这⾥:绘图原理Component类提供了两个和绘图有关的重要⽅法:① paint(Graphics g)绘制组件的外观.② repaint()刷新组件的外观当组件第⼀次在屏幕显⽰的时候,程序会⾃动调⽤paint()⽅法绘制组件.类 Paneljava.awt.Panel在上⼀节种public MyPanel extends Panel{public void paint(Graphics g){super.paint(g);g.drawRect();…}}现在可以为什么MyPanel继承了Panel就会有paint⽅法,可以画图了.在以下情况下paint()⽅法将会被调⽤.1.窗⼝最⼩化,再最⼤化.2.窗⼝⼤⼩发⽣变化.3.repaint函数被调⽤.事件监听的步骤:⼀个类实现监听的步骤:1. 实现相应的接⼝(KeyListener,MouseListener,ActionListener,WindowListener)2. 实现对事件的处理⽅法3. 在事件源上注册监听MyTankGame21/**2 * 坦克游戏的2.0版3 * 1.画出坦克4 * 2.我的坦克可以上下左右移动5*/6package com.test5;78import java.awt.*;9import java.awt.event.*;10import javax.swing.*;1112public class MyTankGame2 extends JFrame {1314 MyPanel mp = null;15public static void main(String[] args) {16 MyTankGame2 myTankGame2 = new MyTankGame2();17 }18//构造函数19public MyTankGame2(){20 mp = new MyPanel();21this.add(mp);22//c)在事件源上注册监听,mp为监听器23this.addKeyListener(mp);2425this.setSize(400,300);26this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);27this.setVisible(true);28 }29 }30/*31 * 我的⾯板,不清楚为什么MyPanel继承Panel监听没有效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
坦克大战package坦克大战4;import java.awt.*;import java.awt.event.*;import java.util.*; import javax.swing.*;public class MyTankGame_4 extends JFrame{MyPanel mp=null;public static void main(String[] args) {MyTankGame_4 mtg=new MyTankGame_4();}public MyTankGame_4(){mp=new MyPanel();//启动mp线程Thread t=new Thread(mp);t.start();this.add(mp);this.addKeyListener(mp);this.setTitle("韩雄-坦克大战");this.setSize(400,300);this.setLocation(700,300);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭格式this.setVisible (true);}}//我的面板class MyPanel extends JPanel implements KeyListener,Runnable{int a=100,b=100;Hero hero=null; //定义一个我的坦克Vector<EnemyTank> ets=new Vector<EnemyTank>();//定义敌人的坦克Vector<Bomb> bombs=new Vector<Bomb>();//定义一个炸弹集合int enSize=6;//定义三张图片,一颗炸弹!Image imagge1=null; Image imagge2=null; Image imagge3=null;//构造public MyPanel(){hero=new Hero(100, 100);//初始化敌人的坦克for (int i = 0; i < enSize; i++) {//创建敌人坦克的对象EnemyTank et=new EnemyTank((i+1)*50, 100);et.setColor(0);int a=(int)(Math.random()*4);et.setDirect(a); //加入Thread t=new Thread(et);t.start();//给敌人坦克加入子弹Shot s=new Shot(et.getX()+10, et.getY()+10, 2);et.ss.add(s);Thread t2=new Thread(s); t2.start(); ets.add(et);}//初始化图片imagge1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/捕获3.PNG"));imagge2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/捕获2.PNG"));imagge3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/捕获1.PNG")); }@Overridepublic void run() {//每隔一百毫秒重绘while(true){try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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.bitTank(myshot, et);}}}}//重绘this.repaint();}}public void paint(Graphics g){//1、调用父类完成初始化super.paint(g);g.fillRect(0, 0, 400, 300);//画出自己的坦克this.drawTank(hero.getX(), hero.getY(), g, hero.getDirect(),1);//从ss中取出每颗子弹并画出for(int i=0;i<this.hero.ss.size();i++){//取出Shot myshot=hero.ss.get(i);//画出一颗子弹if(myshot!=null&&myshot.islive==true){g.draw3DRect(myshot.x-1 , myshot.y, 1, 1, false);}if(myshot.islive==false){hero.ss.remove(myshot);}}//画出炸弹for(int i=0;i<bombs.size();i++){//取出炸弹Bomb b=bombs.get(i);if(b.life>12) {g.drawImage(imagge1, b.x, b.y, 30, 30, this);}else if(b.life>6){g.drawImage(imagge2, b.x, b.y, 30, 30, this);}else if(b.life>0){g.drawImage(imagge3, b.x, b.y, 30, 30, this);}//让b的生命值减小b.lifeDown();//如果炸弹生命值为0,就把炸弹从bombs中去掉if(b.life==0){bombs.remove(b);}}//画出敌人的坦克for(int i=0;i<ets.size();i++){EnemyTank et=ets.get(i);if(et.isLive) {this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 0);//画出敌人的炮弹for(int j=0;j<et.ss.size();j++){//取出子弹Shot enemyShot=et.ss.get(j);if(enemyShot.islive){g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1, false);}else{//如果敌人的子弹死亡后就将其删除et.ss.remove(enemyShot);}}}}}//判断子弹是否击中坦克public void bitTank(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;//创建一颗炸弹,放入VoctorBomb b=new Bomb(et.x, et.y);bombs.add(b);} break;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;//创建一颗炸弹,放入VectorBomb b=new Bomb(et.x, et.y);bombs.add(b);} break;}}//画出坦克的函数public void drawTank(int x,int y,Graphics g,int direct,int type){ //判断是什么类型的坦克if(type==0) g.setColor(Color.cyan);else if(type==1) g.setColor(Color.yellow);else g.setColor(Color.red);//判断方向switch(direct){//向上case 0://画出坦克(到时再封装成一个函数)//1.画出左边的矩形g.fill3DRect(x, y, 5, 30,false);//2.画出右边的矩形g.fill3DRect(x+15, y, 5, 30,false);//3.画出中间矩形g.fill3DRect(x+5, y+5, 10, 20,false);//4.画出圆形g.fillOval(x+4, y+10, 10, 10);//画出线g.drawLine(x+10, y, x+10, y+15);break;//向右case 1://画出坦克(到时再封装成一个函数)//1.画出上边的矩形g.fill3DRect(x, y, 30, 5,false);//2.画出下边的矩形g.fill3DRect(x, y+15, 30, 5,false);//3.画出中间矩形g.fill3DRect(x+5, y+5, 20, 10,false);//4.画出圆形g.fillOval(x+10, y+5, 10, 10);//画出线g.drawLine(x+20, y+10, x+30, y+10); break;//向下case 2://画出坦克(到时再封装成一个函数)//1.画出左边的矩形g.fill3DRect(x, y, 5, 30,false);//2.画出右边的矩形g.fill3DRect(x+15, y, 5, 30,false);//3.画出中间矩形g.fill3DRect(x+5, y+5, 10, 20,false);//4.画出圆形g.fillOval(x+4, y+10, 10, 10);//画出线g.drawLine(x+10, y+15, x+10, y+30);break;//向右case 3://画出坦克(到时再封装成一个函数)//1.画出上边的矩形g.fill3DRect(x, y, 30, 5,false);//2.画出下边的矩形g.fill3DRect(x, y+15, 30, 5,false);//3.画出中间矩形g.fill3DRect(x+5, y+5, 20, 10,false);//4.画出圆形g.fillOval(x+10, y+5, 10, 10);//画出线g.drawLine(x, y+10, x+10, y+10);break;}}@Override//键按下处理 a 向左 s 向下 w 向上 d 向右public void keyPressed(KeyEvent arg0) {if(arg0.getKeyCode()==KeyEvent.VK_W) {//设置我的坦克的方向this.hero.setDirect(0);this.hero.moveUp();}else if(arg0.getKeyCode()==KeyEvent.VK_D){ //设置我的坦克的方向this.hero.setDirect(1);this.hero.moveRigjt();}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.moveLife();}else if(arg0.getKeyCode()==KeyEvent.VK_B){ this.hero.setSpeed(1); //加速1}else if(arg0.getKeyCode()==KeyEvent.VK_V){ this.hero.setSpeed(2); //加速2}else if(arg0.getKeyCode()==KeyEvent.VK_C){ this.hero.setSpeed(3); //加速3}if(arg0.getKeyCode()==KeyEvent.VK_J){//判断是否按J键//开火System.out.println(""+this.hero.ss.size());if(this.hero.ss.size()<=5)this.hero.shotEnemy();}//必须重新绘制Panelthis.repaint();}@Overridepublic void keyReleased(KeyEvent arg0) {}@Overridepublic void keyTyped(KeyEvent arg0) {}}//炸弹类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{this.isLive=false;}}}//子弹类class Shot implements Runnable{protected int x;protected int y;protected int direct;protected int speed=1;//是否还活着protected boolean islive=true;public Shot(int x, int y,int direct) {this.x = x; this.y = y; this.direct=direct;}@Overridepublic void run() {while(true){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}switch(direct){case 0://上y-=speed; break;case 1://右x+=speed; break;case 2://下y+=speed; break;case 3://左x-=speed; break;}//子弹何时死亡??//判断该子弹是否碰到边缘if(x<0||x>400||y<0||y>300) {this.islive=false; break;}}}}//坦克类class Tank{protected int x=0;//坦克的横坐标protected int y=0;//坦克的纵坐标//设置坦克的速度protected int speed=1;//坦克方向//0表示向上 1表示右2表示下3表示左protected int direct=0;//坦克的颜色protected int color;public int getColor() {return color;}public void setColor(int color) { this.color = color;}public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}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 Tank(int x,int y){this.x=x;this.y=y;}}//敌人的坦克,并做成线程class EnemyTank extends Tank implements Runnable{ boolean isLive=true;int times=0;//敌人的子弹Vector<Shot> ss=new Vector<Shot>();//敌人添加子弹,应刚刚创建坦克和敌人的坦克子弹死亡后public EnemyTank(int x,int y){super(x,y);}@Overridepublic void run() {while(true){switch(this.direct) {case 0://向上for(int i=0;i<30;i++){if(y>0)y-=speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 1://向右for(int i=0;i<30;i++){if(x<360)x+=speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2://向下for(int i=0;i<30;i++){if(y<240){y+=speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 3://向左for(int i=0;i<30;i++){if(x>0){x-=speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;}this.times++;if(times%2==0){if(isLive){if(ss.size()<5){Shot s=null;//没有子弹//添加switch(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();}}}//让坦克产生一个新的方向this.direct=(int)(Math.random()*4);//判断坦克是否死亡if(this.isLive==false){//让坦克死亡后推出break;}}}}//我的坦克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.getDirect()){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();}//坦克向上移动public void moveUp(){if(y>0)y-=speed;}//坦克向右移动public void moveRigjt(){if(x<360)x+=speed;}//坦克向下移动public void moveDown(){if(y<240)y+=speed;}//坦克向左移动public void moveLife(){if(x>0)x-=speed;}}。