【课程设计】基于java的坦克大战小游戏,附源码+报告,适合大作业、大实验或者课程设计

本文详细介绍了使用Java开发的一个坦克大战游戏项目,涉及GUI、多线程、碰撞检测等内容,旨在锻炼学生的编程技能和问题解决能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、项目介绍

本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。

玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。若玩家将敌方坦克全部打掉并保证自己的老家不被打掉则视为玩家获胜;若期间由玩家控制的主坦克被打掉,或者自己的老家被打掉则视为玩家失败。游戏中有金属墙,普通墙,河水等障碍物,玩家无法穿越它们;但是玩家可以将普通墙打掉。游戏中的森林可以将坦克隐身,药箱可以将坦克的血加满。

2、演示视频

基于java的坦克大战小游戏

3、项目截图

4、文档截图

5、代码示例

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;

public class TankClient extends Frame {

	public static final int GAME_WIDTH = 800;
	public static final int GAME_HEIGHT = 600;

	Tank myTank = new Tank(380, 480, true, Direction.STOP, this);
	BloodBox b = new BloodBox();
	Home home = new Home(373, 545, this);

	List<River> rivers = new ArrayList<River>();
	List<OrdinaryWall> wallsHome = new ArrayList<OrdinaryWall>();
	List<OrdinaryWall> walls = new ArrayList<OrdinaryWall>();
	List<MetalWall> metalWalls = new ArrayList<MetalWall>();
	List<Explode> explodes = new ArrayList<Explode>();
	List<Missile> missiles = new ArrayList<Missile>();
	List<Tank> tanks = new ArrayList<Tank>();
	List<Tree> trees = new ArrayList<Tree>();
	Image screenImage = null;

	public void paint(Graphics g) {

		Color c = g.getColor();
		g.setColor(Color.red);
		g.drawString("Restart the game: F2", 10, 50);
		g.drawString("Fire:       J", 10, 70);
		g.drawString("Super Fire: K", 10, 90);
		g.drawString("The key control direction: A W D S", 10, 110);

		Font f1 = g.getFont();
		g.setFont(new Font("aaa", Font.BOLD, 25));
		g.drawString("The number of enemy tanks: ", 210, 70);
		g.setFont(new Font("aaa", Font.BOLD, 40));
		g.drawString("" + tanks.size(), 550, 70);
		g.setFont(f1);

		if (tanks.size() == 0 && home.isLive()&&myTank.isLive()) {
			Font f = g.getFont();
			g.setFont(new Font("aaa", Font.BOLD, 40));
			g.drawString("YOU WIN! ", 310, 300);
			g.setFont(f);
		}
		if (myTank.isLive() == false) {
			Font f = g.getFont();
			g.setFont(new Font("aaa", Font.BOLD, 40));
			tanks.clear();
			missiles.clear();
			g.drawString("GAME OVER! ", 270, 300);
			g.setFont(f);
		}
		g.setColor(c);

		for (int i = 0; i < rivers.size(); i++) {
			River r = rivers.get(i);
			r.draw(g);
		}
		for (int i = 0; i < rivers.size(); i++) {
			River r = rivers.get(i);
			myTank.collidesRiver(r);
			r.draw(g);
		}

		home.draw(g);
		myTank.draw(g);
		myTank.eat(b);
		for (int i = 0; i < tanks.size(); i++) {
			Tank t = tanks.get(i);
			for (int j = 0; j < wallsHome.size(); j++) {
				OrdinaryWall w = wallsHome.get(j);
				t.collidesWithWall(w);
				w.draw(g);
			}
			for (int a = 0; a < walls.size(); a++) {
				OrdinaryWall w = walls.get(a);
				t.collidesWithWall(w);
				w.draw(g);
			}
			for (int a = 0; a < metalWalls.size(); a++) {
				MetalWall w = metalWalls.get(a);
				t.collidesWithWall(w);
				w.draw(g);
			}
			for (int a = 0; a < rivers.size(); a++) {
				River r = rivers.get(a);
				t.collidesRiver(r);
				r.draw(g);
			}

			t.collidesWithTanks(tanks);
			t.collidesHome(home);
			t.draw(g);
		}
		for (int i = 0; i < missiles.size(); i++) {
			Missile m = missiles.get(i);
			m.hitTanks(tanks);
			m.hitTank(myTank);
			m.hitHome();
			for (int j = 0; j < metalWalls.size(); j++) {
				MetalWall w = metalWalls.get(j);
				m.hitWall(w);
			}
			for (int j = 0; j < walls.size(); j++) {
				OrdinaryWall w = walls.get(j);
				m.hitWall(w);
			}
			for (int j = 0; j < wallsHome.size(); j++) {
				OrdinaryWall w = wallsHome.get(j);
				m.hitWall(w);
			}
			m.draw(g);
			// if(!m.isLive()) missiles.remove(m); // else m.draw(g);
		}

		for (int i = 0; i < walls.size(); i++) {
			OrdinaryWall w = walls.get(i);
			w.draw(g);
		}
		for (int i = 0; i < metalWalls.size(); i++) {
			MetalWall w = metalWalls.get(i);
			w.draw(g);
		}
		for (int i = 0; i < trees.size(); i++) {
			Tree tree = trees.get(i);
			tree.draw(g);
		}
		for (int i = 0; i < explodes.size(); i++) {
			Explode e = explodes.get(i);
			e.draw(g);
		}

		myTank.collidesWithTanks(tanks);
		myTank.collidesHome(home);

		for (int i = 0; i < walls.size(); i++) {
			OrdinaryWall w = walls.get(i);
			myTank.collidesWithWall(w);
			w.draw(g);
		}
		for (int i = 0; i < wallsHome.size(); i++) {
			OrdinaryWall w = wallsHome.get(i);
			myTank.collidesWithWall(w);
			w.draw(g);
		}
		for (int i = 0; i < metalWalls.size(); i++) {
			MetalWall w = metalWalls.get(i);
			myTank.collidesWithWall(w);
			w.draw(g);
		}

		b.draw(g);
	}

	public void update(Graphics g) {
		if (screenImage == null) {
			screenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
		}
		Graphics gScreen = screenImage.getGraphics();
		Color c = gScreen.getColor();
		gScreen.setColor(Color.BLACK);
		gScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
		gScreen.setColor(c);
		paint(gScreen);
		g.drawImage(screenImage, 0, 0, null);
	}

	public void lauchFrame() {

		createFrame();
		for (int i = 0; i < 9; i++) {
			if (i < 3)
				tanks.add(new Tank(250 + 60 * i, 50, false, Direction.D, this));
			else if (i < 6)
				tanks.add(new Tank(750, 150 + 60 * (i - 3), false, Direction.D,
						this));
			else
				tanks.add(new Tank(1, 150 + 60 * (i - 6), false, Direction.D,
						this));
		}

		this.setSize(GAME_WIDTH, GAME_HEIGHT);
		this.setLocation(200, 60);
		this.setTitle("TankWar");
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		this.setResizable(false);
		this.setBackground(Color.GREEN);
		this.setVisible(true);

		this.addKeyListener(new KeyMonitor());
		new Thread(new PaintThread()).start();
	}

	public void createFrame() {

		for (int i = 0; i < 27; i++) {
			if (i < 9)
				walls.add(new OrdinaryWall(296 + 22 * i, 300, this));
			else if (i < 18)
				walls.add(new OrdinaryWall(296 + 22 * (i - 9), 320, this));
			else
				walls.add(new OrdinaryWall(296 + 22 * (i - 18), 400, this));
		}
		for (int i = 0; i < 14; i++) {
			if (i < 5)
				metalWalls.add(new MetalWall(120 + 36 * i, 110, this));
			else if (i < 10)
				metalWalls.add(new MetalWall(120 + 36 * (i - 5), 210, this));
			else
				metalWalls.add(new MetalWall(500 + 36 * (i - 10), 160, this));
		}
		for (int i = 0; i < 48; i++) {
			if (i < 8)
				trees.add(new Tree(500 + 36 * i, 300, this));
			else if (i < 16)
				trees.add(new Tree(500 + 36 * (i - 8), 337, this));
			else if (i < 24)
				trees.add(new Tree(500 + 36 * (i - 16), 403, this));
			else if (i < 32)
				trees.add(new Tree(1 + 36 * (i - 24), 300, this));
			else if (i < 40)
				trees.add(new Tree(1 + 36 * (i - 32), 337, this));
			else
				trees.add(new Tree(1 + 36 * (i - 40), 403, this));
		}
		for (int i = 0; i < 2; i++) {
			if (i < 1)
				rivers.add(new River(80, 440, this));
			else
				rivers.add(new River(670, 440, this));
		}
		home.createHomeWall();
	}

	public static void main(String[] args) {
		TankClient tc = new TankClient();
		tc.lauchFrame();
	}

	private class PaintThread implements Runnable {

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

	private class KeyMonitor extends KeyAdapter {

		public void keyReleased(KeyEvent e) {
			myTank.keyReleased(e);
		}

		public void keyPressed(KeyEvent e) {
			myTank.keyPressed(e);
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java源码集合

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值