JavaSwing坦克大战游戏的设计和实现

目录
  • 需求分析:
  • 功能设计:
  • 具体设计:
    • 图形用户界面
    • 界面中的元素
  • 游戏截图:

还记得传说中的经典90坦克大战吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目。现在好了,再也不用担心敌人坦克了,可以横冲直撞,横扫敌人坦克了。作为程序员的我刚好可以利用所学的Java相关知识来完成一个坦克大战游戏、一起来看看是如何设计完成的吧。

需求分析:

首先游戏要有图形用户界面,界面能够反映游戏所有的细节。

界面中要有坦克,墙,树林,河流。

界面中要有一个“家”,“家”被攻击中则输了游戏。

坦克分两种,敌方和我方。

墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙。

树和河流均只有一种,树林坦克可以通过。

坦克可以发射子弹,敌我方的子弹属性一样。

我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死。

敌方之间不可以杀死对方。

子弹击中坦克要有爆炸,但击中墙不能爆炸。

我方可以吃血包增加生命。

游戏可以暂停,重新开始,游戏帮助等功能。如下图

功能设计:

1. 首页设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。用户可以选择重新开始游戏,退出游戏,暂停游戏和游戏帮助。

2. 界面中包含坦克,树,河流,阻挡墙和游戏用户所要保护的“家”。

3. 坦克:坦克分为两种,敌方坦克和用户控制的坦克。用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。坦克之间不能穿越,碰撞到后自动调换方向。

4. 树:界面中要包括树林,作为遮掩物体和修饰物体,以便增加游戏的元素,使得游戏更加贴切人性化。树的数目不限,以游戏整体界面清晰美观来决定数目。

5. 河流:界面中要包括河流,河流作用与树林相同,同样河流的数目不限,以游戏界面整体美观度来决定数目。

6. 墙:墙体分为两种,普通的墙和铁墙,普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越。两方的坦克均不能穿越两种墙体,但都可以摧毁普通墙体。普通墙体的数目配合其他元素合理安排,铁墙则不宜过多,不然游戏难度太低甚至因为坦克不能穿越铁墙而使得游戏无法进行下去。

7. “家”:用户方除了有一辆自己的坦克外还有一个要保护的家,家由普通墙体包围,家受到子弹攻击后游戏立即结束,用户方则输了本局游戏。

8. 子弹:子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。

9. 爆炸:当子弹射击到坦克身上时,要产生爆炸效果。

10. 方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。

具体设计:

图形用户界面

图形用户界面要用到Java相关知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。

坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。

在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计。

界面中的元素

界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。

坦克

坦克主要由Tank类来实现。坦克的属性:速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。

在设计过程中,坦克出现的位置由坐标而定。用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。

坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。

Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。

由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。

树林

树林主要是用来做修饰物体的,具有不透明性。由一个Tree类来描述,Tree有两个属性,位置和长宽。树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。

河流

河流的作用与树林类似。

墙体

墙体分为普通墙和铁墙。普通墙可以被子弹损坏,而铁墙则不会。

普通墙

普通墙有以下几个属性:墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。

金属墙

金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。

家是由Home类来抽象的,具体的属性有:家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。

子弹

子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。如:imgs.put("L", bulletImages[0]);类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接return true就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。

具体代码:

public boolean hitTanks(List<Tank> tanks) {//当子弹打到坦克时
		for (int i = 0; i < tanks.size(); i++) {
			if (hitTank(tanks.get(i))) {     //对每一个坦克,调用hitTank
				return true;
			}
		}
		return false;
	}

子弹打到其他坦克上时用hitTank(Tank t) 方法,子弹打到墙上时用hitWall(CommonWall w)方法,打到金属墙上hitWall(MetalWall w),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。

实现如下:

public boolean hitHome() {   //当子弹打到家时
		if (this.live && this.getRect().intersects(tc.home.getRect())) {
			this.live = false;
			this.tc.home.setLive(false); //当家接受一枪时就死亡
			return true;
		}
		return false;
	}

还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行 t.setLife(t.getLife() - 50); // 受一粒子弹寿命减少50,接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。

爆炸

坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小异。

菜单功能

菜单功能包括游戏的重新开始,暂停,退出等。这些功能的用户界面放在了TankClient的构造方法里,用到的是面板类和相应的监听功能,实现出来很简单。

游戏截图:

菜单模块

菜单项可以选择开始新游戏,退出,暂停,继续,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!

菜单效果图:

开始新游戏:

 

当点击确认后开始新游戏,当点击取消后恢复到原来的页面

游戏暂停:

帮助模块:

 

退出模块:

游戏信息模块 

游戏标题栏相关信息

子弹射击到对方坦克后爆炸效果:

 

弹撞击到普通墙后,会使得墙消失一块、图中画红箭头的地方时受到子弹攻击后的效果。墙体被破坏。

金属墙受到子弹攻击

金属墙都到子弹的攻击后不会被损毁,但是当在把程序中子弹碰撞金属墙的语句改变后,会损毁金属墙!

原来的代码段:

public boolean hitWall(MetalWall w) {       //子弹打到金属墙上
		if (this.live && this.getRect().intersects(w.getRect())) {
			this.live = false;
			return true;
		}
		return false;
	}

修改后的代码段:

public boolean hitWall(MetalWall w) {       //子弹打到金属墙上
		if (this.live && this.getRect().intersects(w.getRect())) {
			this.live = false;
			return true;
		}
		return false;
	}

 修改后效果测试:修改后金属墙也可以被摧毁

血包效果图:血包会随机的移动,以下是血包所在的两次不同位置:

位置1

       

位置2

坦克吃血包增加生命值

吃完血包后加满生命值:

当家被攻击后血条耗完结束游戏

总结:

到这里游戏整个流程和功能设计就介绍的差不多了、这个坦克大战项目适合同学们用来作为Java毕设或课程设计学习参考使用。

通过本次的游戏实验课程设计、使原来一窍不通对Java的我对Java知识的了解掌握、在这次实验中也有一些问题还未解决或需要完整的功能需要解决、比如可以为游戏加入声音,由于在尝试的时候失败了,所以程序中就没有来实现这些功能。存储游戏结果等功能后面可以优化或加上、做到最后、更加觉得Java语言的强大、也被它的魅力持续吸引。

完整源码下载地址

JavaSwing系列项目推荐:

基于JavaSwing ATM取款机系统的设计和实现

基于JavaSwing+mysql的图书管理系统设计和实现

基于JavaSwing+mysql的学生社团管理系统设计和实现

到此这篇关于JavaSwing坦克大战游戏的设计和实现的文章就介绍到这了,更多相关JavaSwing游戏的设计和体现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL连接控制插件介绍

    目录 1.连接控制(connection_control)插件介绍 1.1 动态安装 connection_control 插件 1.2  验证插件状态 1.3 安装完成后 可以看到相关系统变量 2.连接控制实验 2.1 初始状态 2.2  故意输错密码 2.3  查看失败记录 1.连接控制(connection_control)插件介绍 MySQL 服务端包含一个插件库,可以自定义安装各类插件.connection_control 插件也是其中一种,主要用来控制客户端在登录操作连续失败一定次数

  • MySQL中limit对查询语句性能的影响

    一,前言  首先说明一下MySQL的版本: mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.17 | +-----------+ 1 row in set (.00 sec) 表结构: mysql> desc test; +--------+---------------------+------+-----+---------+----------------+ | Field | Type |

  • JavaSwing后台播放音乐mp3

    本文为大家分享了用Java来播放mp3的具体代码,使用jl1.0.1.jar,供大家参考,具体内容如下 代码: import java.io.BufferedInputStream; import java.io.FileInputStream; import javazoom.jl.player.Player; /** * @author Brandon B. Lin * 2013-1-25 */ public class MP3Player { public MP3Player(String

  • JavaSwing基础之Layout布局相关知识详解

    一.View layout方法 首先,还是从ViewRootImpl说起,界面的绘制会触发performMeasure.performLayout方法,而在performLayout方法中就会调用mView的layout方法开始一层层View的布局工作. private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight) { final View ho

  • 基于JavaSwing设计和实现的酒店管理系统

    目录 前言: 引言 主要技术和工具: 功能截图: 登录管理: 酒店管理信息: 开房: 退房: 房间信息: 顾客信息: 关键代码: 主入口: 开房入住: 数据库设计: 用户表: 入住信息表: 房间信息表 : 总结: 前言: 项目是使用Java swing开发,可实现基础数据维护用户登录.系统首页酒店信息管理.主要模块是开房管理.退房管理.房间信息管理.顾客信息管理等功能.界面设计比较简介.适合作为Java课设设计以及学习技术使用.获取源码 引言 在信息高度发达的今天, 酒店业务涉及的各个工作环节已

  • MySQL深分页问题解决的实战记录

    目录 前言 limit深分页为什么会变慢? 通过子查询优化 回顾B+ 树结构 把条件转移到主键索引树 INNER JOIN 延迟关联 标签记录法 使用between...and... 手把手实战案例 一般思路的实现方式 实战优化方案 总结 前言 我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下.本文将分4个方案,讨论如何优化MySQL百万数据的深分页问题,并附上最近优化生产慢SQL的实战案例. limit深分页为什么会变慢? 先看下表结构哈: CREAT

  • 基于Mysql+JavaSwing的超市商品管理系统设计与实现

    目录 2.关键代码 2.1 主页功能 2.2 添加商品信息 2.3 数据库设计 商品表 前言: 随着小超市规模的发展不断扩大, 商品数量急剧增加, 有关商品的各种信息量也成倍增长. 超市时时刻刻都需要对商品各种信息进行统计分析. 而大型的超市管理系统功能过于强大而造成操作繁琐降低了小超市的工作效率. 超市管理系统是市场上最流行的超市上常用的系统之一, 由于刚学Java知识.所有功能设计的比较简单.只有商品信息的增删改查.实现对商品信息全面. 动态.及时的管理.本文系统的分析了软件开发的背景以过程

  • 基于JavaSwing+mysql开发一个学生社团管理系统设计和实现

    前言: 项目是使用Java swing+mysql开发,可实现基础数据维护.用户登录注册.社团信息列表查看.社团信息添加.社团信息修改.社团信息删除以及退出注销等功能.界面设计比较简单易学.适合作为Java课设设计以及学习技术使用. 引言 随着全球信息化的迅猛发展,高效规模不断壮大,协会人数急剧增加,有必要开发一个学生社团管理系统来提高社联对社团的管理效率,学生社团管理系统将逐渐取代传统的人工管理模式.本文采用Java+swing+mysql作为开发技术,以Java为编程语言,开发一个基java

  • JavaSwing坦克大战游戏的设计和实现

    目录 需求分析: 功能设计: 具体设计: 图形用户界面 界面中的元素 游戏截图: 还记得传说中的经典90坦克大战吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目.现在好了,再也不用担心敌人坦克了,可以横冲直撞,横扫敌人坦克了.作为程序员的我刚好可以利用所学的Java相关知识来完成一个坦克大战游戏.一起来看看是如何设计完成的吧. 需求分析: 首先游戏要有图形用户界面,界面能够反映游戏所有的细节. 界面中要有坦克,墙,树林,河流. 界面中要有

  • 基于python实现坦克大战游戏

    本文实例为大家分享了python实现坦克大战游戏的具体代码,供大家参考,具体内容如下 游戏界面 pygame游戏引擎的安装 pip安装 windows + R --> cmd --> 命令行输入 pip install 模块名==版本号 pycharm中安装 File --> setting --> Project --> Project Interpreter --> 右侧 + install --> 搜索框输入pygame --> 下方 installP

  • Vue3+Canvas实现坦克大战游戏

    目录 前言 架构搭建 Canvas构造函数 画布绘制 文本渲染 画布重绘前的clear 核心:绘制函数 BattleCity构造函数 实现坦克的移动 坦克发射子弹的逻辑 总结 前言 记得几年前刚做前端开发的时候,跟着师傅用纯 es5 实现了这款坦克大战,可以说我入行前端是从 javaScript 小游戏开始的,时间已匆匆过去了数年,前端发展日新月异,各种新框架.新概念层出不穷,很容易就迷失在对各种新技术的盲目学习和应用中,真正的编程是什么呢?值得思考的问题. 我准备用 vue3 重新实现一下这款

  • Vue3+Canvas实现坦克大战游戏(一)

    目录 前言 架构搭建 Canvas 构造函数 画布绘制 文本渲染 画布重绘前的 clear 核心:绘制函数 BattleCity 构造函数 实现坦克的移动 坦克发射子弹的逻辑 总结 前言 记得几年前刚做前端开发的时候,跟着师傅用纯 es5 实现了这款坦克大战,可以说我入行前端是从 javaScript 小游戏开始的,时间已匆匆过去了数年,前端发展日新月异,各种新框架.新概念层出不穷,很容易就迷失在对各种新技术的盲目学习和应用中,真正的编程是什么呢?值得思考的问题. 我准备用 vue3 重新实现一

  • 经典再现 基于JAVA平台开发坦克大战游戏

    一.需求描述  1.功能性需求 在功能需求分析阶段,我们的主要任务是指定系统必须提供哪些服务,定义软件完成哪些功能,提供给那些人使用,功能需求是软件开发的一项基本需求,是需求分析必不可少的一部分.坦克大战是一款经典游戏了,本游戏学习了一些前辈们的经验,整体来说讲,游戏分为敌我双方,主要参与战斗的坦克有玩家控制,敌人坦克可以智能随机出现在屏幕上,并且移动,发射一定数量的子弹:玩家可以在规定的区域内随意移动坦克,当有子弹击中玩家时,玩家死亡,游戏结束:敌人坦克智能运行,敌方坦克由于需要具有一定智能性

  • Java版坦克大战游戏源码示例

    整理文档,搜刮出一个Java版坦克大战游戏的代码,稍微整理精简一下做下分享. package tankwar; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.FileInputStream; imp

  • python使用pygame模块实现坦克大战游戏

    本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹,炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类,分别是玩家类,敌人类,炮弹类及地图类,开始游戏界面以及结束界面,血条等等. 开始coding. 主函数,new一个对象(java乱入emmm),声明一个对象. # encoding : utf-8 # anthor : comi from gameloop import * from pygame

  • js实现坦克大战游戏

    本文实例为大家分享了js实现坦克大战游戏的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <title>tank</title> <style type="text/css"> body { margin: 0px; padding: 0px; border: 0px; } .map { position: absolute; top: 30px; width: 39

  • C#实现坦克大战游戏

    本文实例为大家分享了C#实现坦克大战游戏的具体代码,供大家参考,具体内容如下 前言 该程序主要对原始的坦克大战游戏进行了简单的还原.目前程序可以做到自动生成敌方坦克且敌方能够随机发射子弹,我方坦克也能做到边发射子弹边移动.唯一的不足之处就是还没有完整通关的设置以及障碍的设置. 界面效果图 图1 部分代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u

  • java实现坦克大战游戏

    本文实例为大家分享了java实现坦克大战游戏的具体代码,供大家参考,具体内容如下 一.实现的功能 1.游戏玩法介绍 2.自定义游戏(选择游戏难度.关卡等) 3.自定义玩家姓名 4.数据的动态显示 二.程序基本结构 三.主要的界面 1)游戏首页 2)自定义游戏页面 3)游戏介绍 4)开始游戏,自定义玩家姓名 5)游戏主页面 四.主要代码 1)数据的初始化类 public class Data { public static boolean isRestart=false; public stati

随机推荐