坦克大战单机版总结

本文是作者学习JAVA后的首个项目——坦克大战单机版的总结。通过项目,作者深化了面向对象的理解,探讨了坦克移动的原理,并解决了重画过程中闪烁的问题。此外,还涉及到了List、ArrayList的使用以及按键监听实现坦克和炮弹的控制。项目存在改进空间,例如敌我坦克和子弹的独立控制。文章提供了代码下载链接,以及游戏的操作说明。
摘要由CSDN通过智能技术生成
       这几天跟着马士兵的视频写出了《坦克大战》单机版,在此基础上我还修改了几个小版块,比如敌方的坦克全部被我军歼灭后,战争级数上升一级,我军的战斗值恢复到满值,自动生成一批坦克,每次敌军新增的坦克数量也随着级数的上升而增多,有点级数越高越难打的味道,另外还增加了一个若不同敌军子弹相撞则爆炸的效果。

       这是我学习JAVA一个多月以来,首次做的一个小项目,由于之前学过别的语言,所以做起来并不觉得困难。通过这个小项目,让我更深的了解了面向对象,同时也更深入的了解了一些新的知识点,稍作总结:

       对象能够移动的本质是:改变对象的坐标,再对对象重画。由于重画的速度很快,我们的肉眼无法察觉,因此就以为是移动了。根据坦克的起始坐标,根据坦克的方向设一个变量相应的改变坦克的起始坐标。然后在通过重画,就达到了运动的效果。

       其次在不断的重画的过程中,由于刷新的频率大于重画的频率,导致会闪烁,可以通过加入一个线程不断的刷新来消除闪烁问题,具体实现方法:

private class PaintThread implements Runnable{
		public void run() {
			while(true){
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}	
	}

到网上一查,发现还有其他方法,这个待研究。

      还有通过构造子弹以及坦克,初步了解了ListArrayList等的用法,当然此个项目也有一些不足之处,比如说我军子弹和敌军子弹、以及我军坦克和敌军坦克没有分开控制,这样子导致无法完成我军子弹碰到敌军子弹可以爆炸等问题。

知道怎么通过按键监听来实现按键控制操作,如使坦克和炮弹按八个方向跑,可以参看Tank.java和Missile.java里的内容。

···

     总的来说,这个项目使我对JAVA的兴趣又增添几分,因为每做出一步,都会让我有点小成就感,然后是到最终完成,又想去做它的升级版···

 效果如图:

下面贴出代码:

CSDN下载地址:http://download.csdn.net/detail/yanghai0321/3766202

说明:我军战死后按“F2”键可以重生一辆,按“Ctrl”键发射炮弹,按“A”键发射超级炮弹(可以向八个方向同时发射)!

主窗口:TankClient.java

package com.yanghai.tankwar;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;

/**
 * 这个类的作用是坦克游戏的主窗口
 * @author Yanghai
 *
 */
public class TankClient extends Frame{
	public static final int GAME_WIDTH=800;
	public static final int GAME_HEIGHT=600;
	Tank myTank=new Tank(750,550,true,Tank.Direction.STOP,this);
	Wall w1=new Wall(250,200,20,150,this);
	Wall w2=new Wall(500,300,150,20,this);
	Blood b=new Blood();
	int level=1;
	int init=10;
	
	List<Missile> missiles=new ArrayList<Missile>();
	List<Explode> explodes=new ArrayList<Explode>();
	List<Tank> tanks=new ArrayList<Tank>();
	
	Image offScreenImage =null;//设置一张背后的图片
	
	public void paint(Graphics g) {
		g.drawString("missiles count:"+missiles.size(), 8, 45);
		g.drawString("explodes count:"+explodes.size(), 8, 65);
		g.drawString("tanks    count:"+tanks.size(), 8, 85);
		g.drawString("myTank's  life:"+myTank.getLife(), 8, 105);
		g.drawString("Fighting level:"+level, 700, 65);
		if(tanks.size()<=0){
			init++;
			for(int i=0;i<init;i++){
				tanks.add(new Tank(30*(i+1),3*(i+20)+5,false,Tank.Direction.D,this));
			}
			level++;
			myTank.setLife(myTank.HP);
		}
		for(int i=0;i<missiles.size();i++){
			Missile m=missiles.get(i);
			m.h
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值