Java实现的经典坦克大战小游戏

先看一下游戏结构:

有点多,没有耐心的可以不用看,这里先给出链接吧!
云链接:经典坦克大战
提取码:s9ai

这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自己去看吧:

废话不多说,给出代码:
BombTank.java

import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import javax.swing.JOptionPane;public class TankClient extends Frame implements ActionListener {/*** */private static final long serialVersionUID = 1L;public static final int Fram_width = 800; // 静态全局窗口大小public static final int Fram_length = 600;public static boolean printable = true;MenuBar jmb = null;Menu jm1 = null, jm2 = null, jm3 = null, jm4 = null;MenuItem jmi1 = null, jmi2 = null, jmi3 = null, jmi4 = null, jmi5 = null,jmi6 = null, jmi7 = null, jmi8 = null, jmi9 = null;Image screenImage = null;Tank homeTank = new Tank(300, 560, true, Direction.STOP, this);// 实例化坦克GetBlood blood = new GetBlood(); // 实例化生命Home home = new Home(373, 545, this);// 实例化homeList<River> theRiver = new ArrayList<River>();List<Tank> tanks = new ArrayList<Tank>();List<BombTank> bombTanks = new ArrayList<BombTank>();List<Bullets> bullets = new ArrayList<Bullets>();List<Tree> trees = new ArrayList<Tree>();List<CommonWall> homeWall = new ArrayList<CommonWall>(); // 实例化对象容器List<CommonWall> otherWall = new ArrayList<CommonWall>();List<MetalWall> metalWall = new ArrayList<MetalWall>();public void update(Graphics g) {screenImage = this.createImage(Fram_width, Fram_length);Graphics gps = screenImage.getGraphics();Color c = gps.getColor();gps.setColor(Color.GRAY);gps.fillRect(0, 0, Fram_width, Fram_length);gps.setColor(c);framPaint(gps);g.drawImage(screenImage, 0, 0, null);}public void framPaint(Graphics g) {Color c = g.getColor();g.setColor(Color.green); // 设置字体显示属性Font f1 = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 20));g.drawString("区域内还有敌方坦克: ", 200, 70);g.setFont(new Font("TimesRoman", Font.ITALIC, 30));g.drawString("" + tanks.size(), 400, 70);g.setFont(new Font("TimesRoman", Font.BOLD, 20));g.drawString("剩余生命值: ", 500, 70);g.setFont(new Font("TimesRoman", Font.ITALIC, 30));g.drawString("" + homeTank.getLife(), 650, 70);g.setFont(f1);if (tanks.size() == 0 && home.isLive() && homeTank.isLive()) {Font f = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 60)); // 判断是否赢得比赛this.otherWall.clear();g.drawString("你赢了! ", 310, 300);g.setFont(f);}if (homeTank.isLive() == false) {Font f = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 40));tanks.clear();bullets.clear();g.setFont(f);}g.setColor(c);for (int i = 0; i < theRiver.size(); i++) { // 画出河流River r = theRiver.get(i);r.draw(g);}for (int i = 0; i < theRiver.size(); i++) {River r = theRiver.get(i);homeTank.collideRiver(r);r.draw(g);}home.draw(g); // 画出homehomeTank.draw(g);// 画出自己家的坦克homeTank.eat(blood);// 充满血--生命值for (int i = 0; i < bullets.size(); i++) { // 对每一个子弹Bullets m = bullets.get(i);m.hitTanks(tanks); // 每一个子弹打到坦克上m.hitTank(homeTank); // 每一个子弹打到自己家的坦克上时m.hitHome(); // 每一个子弹打到家里是for (int j = 0; j < metalWall.size(); j++) { // 每一个子弹打到金属墙上MetalWall mw = metalWall.get(j);m.hitWall(mw);}for (int j = 0; j < otherWall.size(); j++) {// 每一个子弹打到其他墙上CommonWall w = otherWall.get(j);m.hitWall(w);}for (int j = 0; j < homeWall.size(); j++) {// 每一个子弹打到家的墙上CommonWall cw = homeWall.get(j);m.hitWall(cw);}m.draw(g); // 画出效果图}for (int i = 0; i < tanks.size(); i++) {Tank t = tanks.get(i); // 获得键值对的键for (int j = 0; j < homeWall.size(); j++) {CommonWall cw = homeWall.get(j);t.collideWithWall(cw); // 每一个坦克撞到家里的墙时cw.draw(g);}for (int j = 0; j < otherWall.size(); j++) { // 每一个坦克撞到家以外的墙CommonWall cw = otherWall.get(j);t.collideWithWall(cw);cw.draw(g);}for (int j = 0; j < metalWall.size(); j++) { // 每一个坦克撞到金属墙MetalWall mw = metalWall.get(j);t.collideWithWall(mw);mw.draw(g);}for (int j = 0; j < theRiver.size(); j++) {River r = theRiver.get(j); // 每一个坦克撞到河流时t.collideRiver(r);r.draw(g);// t.draw(g);}t.collideWithTanks(tanks); // 撞到自己的人t.collideHome(home);t.draw(g);}blood.draw(g);for (int i = 0; i < trees.size(); i++) { // 画出treesTree tr = trees.get(i);tr.draw(g);}for (int i = 0; i < bombTanks.size(); i++) { // 画出爆炸效果BombTank bt = bombTanks.get(i);bt.draw(g);}for (int i = 0; i < otherWall.size(); i++) { // 画出otherWallCommonWall cw = otherWall.get(i);cw.draw(g);}for (int i = 0; i < metalWall.size(); i++) { // 画出metalWallMetalWall mw = metalWall.get(i);mw.draw(g);}homeTank.collideWithTanks(tanks);homeTank.collideHome(home);for (int i = 0; i < metalWall.size(); i++) {// 撞到金属墙MetalWall w = metalWall.get(i);homeTank.collideWithWall(w);w.draw(g);}for (int i = 0; i < otherWall.size(); i++) {CommonWall cw = otherWall.get(i);homeTank.collideWithWall(cw);cw.draw(g);}for (int i = 0; i < homeWall.size(); i++) { // 家里的坦克撞到自己家CommonWall w = homeWall.get(i);homeTank.collideWithWall(w);w.draw(g);}}public TankClient() {// printable = false;// 创建菜单及菜单选项jmb = new MenuBar();jm1 = new Menu("游戏");jm2 = new Menu("暂停继续");jm3 = new Menu("帮助");jm4 = new Menu("游戏级别");jm1.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm2.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm3.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm4.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jmi1 = new MenuItem("重新开始");jmi2 = new MenuItem("退出");jmi3 = new MenuItem("暂停");jmi4 = new MenuItem("继续");jmi5 = new MenuItem("游戏说明");jmi6 = new MenuItem("级别 Ⅰ");jmi7 = new MenuItem("级别 Ⅱ");jmi8 = new MenuItem("级别 Ⅲ");jmi9 = new MenuItem("级别 Ⅳ");jmi1.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi2.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi3.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi4.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi5.setFont(new Font("TimesRoman", Font.BOLD, 15));jm1.add(jmi1);jm1.add(jmi2);jm2.add(jmi3);jm2.add(jmi4);jm3.add(jmi5);jm4.add(jmi6);jm4.add(jmi7);jm4.add(jmi8);jm4.add(jmi9);jmb.add(jm1);jmb.add(jm2);jmb.add(jm4);jmb.add(jm3);jmi1.addActionListener(this);jmi1.setActionCommand("NewGame");jmi2.addActionListener(this);jmi2.setActionCommand("Exit");jmi3.addActionListener(this);jmi3.setActionCommand("Stop");jmi4.addActionListener(this);jmi4.setActionCommand("Continue");jmi5.addActionListener(this);jmi5.setActionCommand("help");jmi6.addActionListener(this);jmi6.setActionCommand("leve Ⅰ");jmi7.addActionListener(this);jmi7.setActionCommand("level Ⅱ");jmi8.addActionListener(this);jmi8.setActionCommand("level Ⅲ");jmi9.addActionListener(this);jmi9.setActionCommand("level Ⅳ");this.setMenuBar(jmb);// 菜单Bar放到JFrame上this.setVisible(true);for (int i = 0; i < 10; i++) { // 家的格局if (i < 4)homeWall.add(new CommonWall(350, 580 - 21 * i, this));else if (i < 7)homeWall.add(new CommonWall(372 + 22 * (i - 4), 517, this));elsehomeWall.add(new CommonWall(416, 538 + (i - 7) * 21, this));}for (int i = 0; i < 32; i++) {if (i < 16) {otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墙布局otherWall.add(new CommonWall(500 + 20 * i, 180, this));otherWall.add(new CommonWall(200, 400 + 20 * i, this));otherWall.add(new CommonWall(500, 400 + 20 * i, this));} else if (i < 32) {otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this));otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this));otherWall.add(new CommonWall(220, 400 + 20 * (i - 16), this));otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this));}}for (int i = 0; i < 20; i++) { // 金属墙布局if (i < 10) {metalWall.add(new MetalWall(140 + 30 * i, 150, this));metalWall.add(new MetalWall(600, 400 + 20 * (i), this));} else if (i < 20)metalWall.add(new MetalWall(140 + 30 * (i - 10), 180, this));elsemetalWall.add(new MetalWall(500 + 30 * (i - 10), 160, this));}for (int i = 0; i < 4; i++) { // 树的布局if (i < 4) {trees.add(new Tree(0 + 30 * i, 360, this));trees.add(new Tree(220 + 30 * i, 360, this));trees.add(new Tree(440 + 30 * i, 360, this));trees.add(new Tree(660 + 30 * i, 360, this));}}theRiver.add(new River(85, 100, this));for (int i = 0; i < 20; i++) { // 初始化20辆坦克if (i < 9) // 设置坦克出现的位置tanks.add(new Tank(150 + 70 * i, 40, false, Direction.D, this));else if (i < 15)tanks.add(new Tank(700, 140 + 50 * (i - 6), false, Direction.D,this));elsetanks.add(new Tank(10, 50 * (i - 12), false, Direction.D,this));}this.setSize(Fram_width, Fram_length); // 设置界面大小this.setLocation(280, 50); // 设置界面出现的位置this.setTitle("※TanKeWar※ 《∷∷∷∷∷》 ReStart--R  Fire--F");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 static void main(String[] args) {new TankClient(); // 实例化}private class PaintThread implements Runnable {public void run() {// TODO Auto-generated method stubwhile (printable) {repaint();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}private class KeyMonitor extends KeyAdapter {public void keyReleased(KeyEvent e) { // 监听键盘释放homeTank.keyReleased(e);}public void keyPressed(KeyEvent e) { // 监听键盘按下homeTank.keyPressed(e);}}public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("NewGame")) {printable = false;Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确定开始新游戏!", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {printable = true;this.dispose();new TankClient();} else {printable = true;new Thread(new PaintThread()).start(); // 线程启动}} else if (e.getActionCommand().endsWith("Stop")) {printable = false;} else if (e.getActionCommand().equals("Continue")) {if (!printable) {printable = true;new Thread(new PaintThread()).start(); // 线程启动}// System.out.println("继续");} else if (e.getActionCommand().equals("Exit")) {printable = false;Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {System.out.println("退出");System.exit(0);} else {printable = true;new Thread(new PaintThread()).start(); // 线程启动}} else if (e.getActionCommand().equals("help")) {printable = false;JOptionPane.showMessageDialog(null, "用  ↑ ↓ ← → 控制方向,F键--开火,R键--重新开始!","提示!", JOptionPane.INFORMATION_MESSAGE);this.setVisible(true);printable = true;new Thread(new PaintThread()).start(); // 线程启动} else if (e.getActionCommand().equals("level Ⅰ")) {Tank.count = 12;Tank.speedX = 6;Tank.speedY = 6;Bullets.speedX = 10;Bullets.speedY = 10;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅱ")) {Tank.count = 12;Tank.speedX = 10;Tank.speedY = 10;Bullets.speedX = 12;Bullets.speedY = 12;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅲ")) {Tank.count = 20;Tank.speedX = 14;Tank.speedY = 14;Bullets.speedX = 16;Bullets.speedY = 16;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅳ")) {Tank.count = 20;Tank.speedX = 16;Tank.speedY = 16;Bullets.speedX = 18;Bullets.speedY = 18;this.dispose();new TankClient();}}
}

Bullets.java

import java.awt.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Bullets {public static  int speedX = 10;public static  int speedY = 10; // 子弹的全局静态速度public static final int width = 10;public static final int length = 10;private int x, y;Direction diretion;private boolean good;private boolean live = true;private TankClient tc;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] bulletImages = null;private static Map<String, Image> imgs = new HashMap<String, Image>(); // 定义Map键值对,是不同方向对应不同的弹头static {bulletImages = new Image[] { // 不同方向的子弹tk.getImage(Bullets.class.getClassLoader().getResource("images/bulletL.gif")),tk.getImage(Bullets.class.getClassLoader().getResource("images/bulletU.gif")),tk.getImage(Bullets.class.getClassLoader().getResource("images/bulletR.gif")),tk.getImage(Bullets.class.getClassLoader().getResource("images/bulletD.gif")),};imgs.put("L", bulletImages[0]); // 加入Map容器imgs.put("U", bulletImages[1]);imgs.put("R", bulletImages[2]);imgs.put("D", bulletImages[3]);}public Bullets(int x, int y, Direction dir) { // 构造函数1,传递位置和方向this.x = x;this.y = y;this.diretion = dir;}// 构造函数2,接受另外两个参数public Bullets(int x, int y, boolean good, Direction dir, TankClient tc) {this(x, y, dir);this.good = good;this.tc = tc;}private void move() {switch (diretion) {case L:x -= speedX; // 子弹不断向左进攻break;case U:y -= speedY;break;case R:x += speedX; // 字段不断向右break;case D:y += speedY;break;case STOP:break;}if (x < 0 || y < 0 || x > TankClient.Fram_width|| y > TankClient.Fram_length) {live = false;}}public void draw(Graphics g) {if (!live) {tc.bullets.remove(this);return;}switch (diretion) { // 选择不同方向的子弹case L:g.drawImage(imgs.get("L"), x, y, null);break;case U:g.drawImage(imgs.get("U"), x, y, null);break;case R:g.drawImage(imgs.get("R"), x, y, null);break;case D:g.drawImage(imgs.get("D"), x, y, null);break;}move(); // 调用子弹move()函数}public boolean isLive() { // 判读是否还活着return live;}public Rectangle getRect() {return new Rectangle(x, y, width, length);}public boolean hitTanks(List<Tank> tanks) {// 当子弹打到坦克时for (int i = 0; i < tanks.size(); i++) {if (hitTank(tanks.get(i))) { // 对每一个坦克,调用hitTankreturn true;}}return false;}public boolean hitTank(Tank t) { // 当子弹打到坦克上if (this.live && this.getRect().intersects(t.getRect()) && t.isLive()&& this.good != t.isGood()) {BombTank e = new BombTank(t.getX(), t.getY(), tc);tc.bombTanks.add(e);if (t.isGood()) {t.setLife(t.getLife() - 50); // 受一粒子弹寿命减少50,接受4枪就死,总生命值200if (t.getLife() <= 0)t.setLive(false); // 当寿命为0时,设置寿命为死亡状态} else {t.setLive(false); }this.live = false;return true; // 射击成功,返回true}return false; // 否则返回false}public boolean hitWall(CommonWall w) { // 子弹打到CommonWall上if (this.live && this.getRect().intersects(w.getRect())) {this.live = false;this.tc.otherWall.remove(w); // 子弹打到CommonWall墙上时则移除此击中墙this.tc.homeWall.remove(w);return true;}return false;}public boolean hitWall(MetalWall w) { // 子弹打到金属墙上if (this.live && this.getRect().intersects(w.getRect())) {this.live = false;//this.tc.metalWall.remove(w); //子弹不能穿越金属墙return true;}return 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;}}

CommonWall.java

import java.awt.*;public class CommonWall {public static final int width = 20; //设置墙的固定参数public static final int length = 20;int x, y;TankClient tc;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] wallImags = null;static {wallImags = new Image[] { // 储存commonWall的图片tk.getImage(CommonWall.class.getResource("Images/commonWall.gif")), };}public CommonWall(int x, int y, TankClient tc) { // 构造函数this.x = x;this.y = y;this.tc = tc; // 获得界面控制}public void draw(Graphics g) {// 画commonWallg.drawImage(wallImags[0], x, y, null);}public Rectangle getRect() {  //构造指定参数的长方形实例return new Rectangle(x, y, width, length);}
}

Direction.java


public enum Direction {  //方向为枚举类L, U,  R,  D,  STOP
}

GetBlood.java

import java.awt.*;
import java.util.Random;public class GetBlood {public static final int width = 36;public static final int length = 36;private int x, y;TankClient tc;private static Random r = new Random();int step = 0; private boolean live = false;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] bloodImags = null;static {bloodImags = new Image[] { tk.getImage(CommonWall.class.getResource("Images/hp.png")), };}private int[][] poition = { { 155, 196 }, { 500, 58 }, { 80, 340 },{ 99, 199 }, { 345, 456 }, { 123, 321 }, { 258, 413 } };public void draw(Graphics g) {if (r.nextInt(100) > 98) {this.live = true;move();}if (!live)return;g.drawImage(bloodImags[0], x, y, null);}private void move() {step++;if (step == poition.length) {step = 0;}x = poition[step][0];y = poition[step][1];}public Rectangle getRect() { //返回长方形实例return new Rectangle(x, y, width, length);}public boolean isLive() {//判断是否还活着return live;}public void setLive(boolean live) {  //设置生命this.live = live;}}

MetalWall.java

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;public class MetalWall {public static final int width = 30; // 设置金属墙的长宽静态全局参数public static final int length = 30;private int x, y;TankClient tc;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] wallImags = null;static {wallImags = new Image[] { tk.getImage(CommonWall.class.getResource("Images/metalWall.gif")), };}public MetalWall(int x, int y, TankClient tc) {// 构造函数,传递要构造的长宽并赋值this.x = x;this.y = y;this.tc = tc;}public void draw(Graphics g) { // 画金属墙g.drawImage(wallImags[0], x, y, null);}public Rectangle getRect() { // 构造指定参数的长方形实例return new Rectangle(x, y, width, length);}
}

River.java

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;public class River {public static final int riverWidth = 40;public static final int riverLength = 100;//静态全局变量private int x, y;TankClient tc ;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] riverImags = null;static {   //存储图片riverImags = new Image[]{tk.getImage(CommonWall.class.getResource("Images/river.jpg")),};}public River(int x, int y, TankClient tc) {    //River的构造方法this.x = x;this.y = y;this.tc = tc;             //获得控制}public void draw(Graphics g) {g.drawImage(riverImags[0],x, y, null);            //在对应X,Y出画河}public static int getRiverWidth() {return riverWidth;}public static int getRiverLength() {return riverLength;}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 Rectangle getRect() {return new Rectangle(x, y, riverWidth, riverLength);}}

Tank.java

import java.awt.*;
import java.awt.event.*;
import java.util.*;public class Tank {public static  int speedX = 6, speedY =6; // 静态全局变量速度---------可以作为扩张来设置级别,速度快的话比较难public static int count = 0;public static final int width = 35, length = 35; // 坦克的全局大小,具有不可改变性private Direction direction = Direction.STOP; // 初始化状态为静止private Direction Kdirection = Direction.U; // 初始化方向为向上TankClient tc;private boolean good;private int x, y;private int oldX, oldY;private boolean live = true; // 初始化为活着private int life = 200; // 初始生命值private static Random r = new Random();private int step = r.nextInt(10)+5 ; // 产生一个随机数,随机模拟坦克的移动路径private boolean bL = false, bU = false, bR = false, bD = false;private static Toolkit tk = Toolkit.getDefaultToolkit();// 控制面板private static Image[] tankImags = null; // 存储全局静态static {tankImags = new Image[] {tk.getImage(BombTank.class.getResource("Images/tankD.gif")),tk.getImage(BombTank.class.getResource("Images/tankU.gif")),tk.getImage(BombTank.class.getResource("Images/tankL.gif")),tk.getImage(BombTank.class.getResource("Images/tankR.gif")), };}public Tank(int x, int y, boolean good) {// Tank的构造函数1this.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) {// Tank的构造函数2this(x, y, good);this.direction = dir;this.tc = tc;}public void draw(Graphics g) {if (!live) {if (!good) {tc.tanks.remove(this); // 删除无效的}return;}if (good)new DrawBloodbBar().draw(g); // 创造一个血包switch (Kdirection) {//根据方向选择坦克的图片case D:g.drawImage(tankImags[0], x, y, null);break;case U:g.drawImage(tankImags[1], x, y, null);break;case L:g.drawImage(tankImags[2], x, y, null);break;case R:g.drawImage(tankImags[3], x, y, null);break;}move();   //调用move函数}void move() {this.oldX = x;this.oldY = y;switch (direction) {  //选择移动方向case L:x -= speedX;break;case U:y -= speedY;break;case R:x += speedX;break;case D:y += speedY;break;case STOP:break;}if (this.direction != Direction.STOP) {this.Kdirection = this.direction;}if (x < 0)x = 0;if (y < 40)      //防止走出规定区域y = 40;if (x + Tank.width > TankClient.Fram_width)  //超过区域则恢复到边界x = TankClient.Fram_width - Tank.width;if (y + Tank.length > TankClient.Fram_length)y = TankClient.Fram_length - Tank.length;if (!good) {Direction[] directons = Direction.values();if (step == 0) {                  step = r.nextInt(12) + 3;  //产生随机路径int rn = r.nextInt(directons.length);direction = directons[rn];      //产生随机方向}step--;if (r.nextInt(40) > 38)//产生随机数,控制敌人开火this.fire();}}private void changToOldDir() {  x = oldX;y = oldY;}public void keyPressed(KeyEvent e) {  //接受键盘事件int key = e.getKeyCode();switch (key) {case KeyEvent.VK_R:  //当按下R时,重新开始游戏 tc.tanks.clear();  //清理tc.bullets.clear();tc.trees.clear();tc.otherWall.clear();tc.homeWall.clear();tc.metalWall.clear();tc.homeTank.setLive(false);if (tc.tanks.size() == 0) {   //当在区域中没有坦克时,就出来坦克      for (int i = 0; i < 20; i++) {if (i < 9)                              //设置坦克出现的位置tc.tanks.add(new Tank(150 + 70 * i, 40, false,Direction.R, tc));else if (i < 15)tc.tanks.add(new Tank(700, 140 + 50 * (i -6), false,Direction.D, tc));elsetc.tanks.add(new Tank(10,  50 * (i - 12), false,Direction.L, tc));}}tc.homeTank = new Tank(300, 560, true, Direction.STOP, tc);//设置自己出现的位置if (!tc.home.isLive())  //将home重置生命tc.home.setLive(true);new TankClient(); //重新创建面板break;case KeyEvent.VK_RIGHT: //监听向右键bR = true;break;case KeyEvent.VK_LEFT://监听向左键bL = true;break;case KeyEvent.VK_UP:  //监听向上键bU = true;break;case KeyEvent.VK_DOWN://监听向下键bD = true;break;}decideDirection();//调用函数确定移动方向}void decideDirection() {if (!bL && !bU && bR && !bD)  //向右移动direction = Direction.R;else if (bL && !bU && !bR && !bD)   //向左移direction = Direction.L;else if (!bL && bU && !bR && !bD)  //向上移动direction = Direction.U;else if (!bL && !bU && !bR && bD) //向下移动direction = Direction.D;else if (!bL && !bU && !bR && !bD)direction = Direction.STOP;  //没有按键,就保持不动}public void keyReleased(KeyEvent e) {  //键盘释放监听int key = e.getKeyCode();switch (key) {case KeyEvent.VK_F:fire();break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_DOWN:bD = false;break;}decideDirection();  //释放键盘后确定移动方向}public Bullets fire() {  //开火方法if (!live)return null;int x = this.x + Tank.width / 2 - Bullets.width / 2;  //开火位置int y = this.y + Tank.length / 2 - Bullets.length / 2;Bullets m = new Bullets(x, y + 2, good, Kdirection, this.tc);  //没有给定方向时,向原来的方向发火tc.bullets.add(m);                                                return m;}public Rectangle getRect() {return new Rectangle(x, y, width, length);}public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}public boolean isGood() {return good;}public boolean collideWithWall(CommonWall w) {  //碰撞到普通墙时if (this.live && this.getRect().intersects(w.getRect())) {this.changToOldDir();    //转换到原来的方向上去return true;}return false;}public boolean collideWithWall(MetalWall w) {  //撞到金属墙if (this.live && this.getRect().intersects(w.getRect())) {this.changToOldDir();     return true;}return false;}public boolean collideRiver(River r) {    //撞到河流的时候if (this.live && this.getRect().intersects(r.getRect())) {this.changToOldDir();return true;}return false;}public boolean collideHome(Home h) {   //撞到家的时候if (this.live && this.getRect().intersects(h.getRect())) {this.changToOldDir();return true;}return false;}public boolean collideWithTanks(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.changToOldDir();t.changToOldDir();return true;}}}return false;}public int getLife() {return life;}public void setLife(int life) {this.life = life;}private class DrawBloodbBar {public void draw(Graphics g) {Color c = g.getColor();g.setColor(Color.RED);g.drawRect(375, 585, width, 10);int w = width * life / 200;g.fillRect(375, 585, w, 10);g.setColor(c);}}public boolean eat(GetBlood b) {if (this.live && b.isLive() && this.getRect().intersects(b.getRect())) {if(this.life<=100)this.life = this.life+100;      //每吃一个,增加100生命点elsethis.life = 200;b.setLive(false);return true;}return false;}public int getX() {return x;}public int getY() {return y;}
}

Tree.java

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;//设置界面树和丛林
public class Tree {public static final int width = 30;public static final int length = 30;int x, y;TankClient tc ;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image[] treeImags = null;static {treeImags = new Image[]{tk.getImage(CommonWall.class.getResource("Images/tree.gif")),};}public Tree(int x, int y, TankClient tc) {  //Tree的构造方法,传递x,y和tc对象this.x = x;this.y = y;this.tc = tc;}public void draw(Graphics g) {           //画出树g.drawImage(treeImags[0],x, y, null);}}

TankClient.java 类

import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import javax.swing.JOptionPane;public class TankClient extends Frame implements ActionListener {/*** */private static final long serialVersionUID = 1L;public static final int Fram_width = 800; // 静态全局窗口大小public static final int Fram_length = 600;public static boolean printable = true;MenuBar jmb = null;Menu jm1 = null, jm2 = null, jm3 = null, jm4 = null;MenuItem jmi1 = null, jmi2 = null, jmi3 = null, jmi4 = null, jmi5 = null,jmi6 = null, jmi7 = null, jmi8 = null, jmi9 = null;Image screenImage = null;Tank homeTank = new Tank(300, 560, true, Direction.STOP, this);// 实例化坦克GetBlood blood = new GetBlood(); // 实例化生命Home home = new Home(373, 545, this);// 实例化homeList<River> theRiver = new ArrayList<River>();List<Tank> tanks = new ArrayList<Tank>();List<BombTank> bombTanks = new ArrayList<BombTank>();List<Bullets> bullets = new ArrayList<Bullets>();List<Tree> trees = new ArrayList<Tree>();List<CommonWall> homeWall = new ArrayList<CommonWall>(); // 实例化对象容器List<CommonWall> otherWall = new ArrayList<CommonWall>();List<MetalWall> metalWall = new ArrayList<MetalWall>();public void update(Graphics g) {screenImage = this.createImage(Fram_width, Fram_length);Graphics gps = screenImage.getGraphics();Color c = gps.getColor();gps.setColor(Color.GRAY);gps.fillRect(0, 0, Fram_width, Fram_length);gps.setColor(c);framPaint(gps);g.drawImage(screenImage, 0, 0, null);}public void framPaint(Graphics g) {Color c = g.getColor();g.setColor(Color.green); // 设置字体显示属性Font f1 = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 20));g.drawString("区域内还有敌方坦克: ", 200, 70);g.setFont(new Font("TimesRoman", Font.ITALIC, 30));g.drawString("" + tanks.size(), 400, 70);g.setFont(new Font("TimesRoman", Font.BOLD, 20));g.drawString("剩余生命值: ", 500, 70);g.setFont(new Font("TimesRoman", Font.ITALIC, 30));g.drawString("" + homeTank.getLife(), 650, 70);g.setFont(f1);if (tanks.size() == 0 && home.isLive() && homeTank.isLive()) {Font f = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 60)); // 判断是否赢得比赛this.otherWall.clear();g.drawString("你赢了! ", 310, 300);g.setFont(f);}if (homeTank.isLive() == false) {Font f = g.getFont();g.setFont(new Font("TimesRoman", Font.BOLD, 40));tanks.clear();bullets.clear();g.setFont(f);}g.setColor(c);for (int i = 0; i < theRiver.size(); i++) { // 画出河流River r = theRiver.get(i);r.draw(g);}for (int i = 0; i < theRiver.size(); i++) {River r = theRiver.get(i);homeTank.collideRiver(r);r.draw(g);}home.draw(g); // 画出homehomeTank.draw(g);// 画出自己家的坦克homeTank.eat(blood);// 充满血--生命值for (int i = 0; i < bullets.size(); i++) { // 对每一个子弹Bullets m = bullets.get(i);m.hitTanks(tanks); // 每一个子弹打到坦克上m.hitTank(homeTank); // 每一个子弹打到自己家的坦克上时m.hitHome(); // 每一个子弹打到家里是for (int j = 0; j < metalWall.size(); j++) { // 每一个子弹打到金属墙上MetalWall mw = metalWall.get(j);m.hitWall(mw);}for (int j = 0; j < otherWall.size(); j++) {// 每一个子弹打到其他墙上CommonWall w = otherWall.get(j);m.hitWall(w);}for (int j = 0; j < homeWall.size(); j++) {// 每一个子弹打到家的墙上CommonWall cw = homeWall.get(j);m.hitWall(cw);}m.draw(g); // 画出效果图}for (int i = 0; i < tanks.size(); i++) {Tank t = tanks.get(i); // 获得键值对的键for (int j = 0; j < homeWall.size(); j++) {CommonWall cw = homeWall.get(j);t.collideWithWall(cw); // 每一个坦克撞到家里的墙时cw.draw(g);}for (int j = 0; j < otherWall.size(); j++) { // 每一个坦克撞到家以外的墙CommonWall cw = otherWall.get(j);t.collideWithWall(cw);cw.draw(g);}for (int j = 0; j < metalWall.size(); j++) { // 每一个坦克撞到金属墙MetalWall mw = metalWall.get(j);t.collideWithWall(mw);mw.draw(g);}for (int j = 0; j < theRiver.size(); j++) {River r = theRiver.get(j); // 每一个坦克撞到河流时t.collideRiver(r);r.draw(g);// t.draw(g);}t.collideWithTanks(tanks); // 撞到自己的人t.collideHome(home);t.draw(g);}blood.draw(g);for (int i = 0; i < trees.size(); i++) { // 画出treesTree tr = trees.get(i);tr.draw(g);}for (int i = 0; i < bombTanks.size(); i++) { // 画出爆炸效果BombTank bt = bombTanks.get(i);bt.draw(g);}for (int i = 0; i < otherWall.size(); i++) { // 画出otherWallCommonWall cw = otherWall.get(i);cw.draw(g);}for (int i = 0; i < metalWall.size(); i++) { // 画出metalWallMetalWall mw = metalWall.get(i);mw.draw(g);}homeTank.collideWithTanks(tanks);homeTank.collideHome(home);for (int i = 0; i < metalWall.size(); i++) {// 撞到金属墙MetalWall w = metalWall.get(i);homeTank.collideWithWall(w);w.draw(g);}for (int i = 0; i < otherWall.size(); i++) {CommonWall cw = otherWall.get(i);homeTank.collideWithWall(cw);cw.draw(g);}for (int i = 0; i < homeWall.size(); i++) { // 家里的坦克撞到自己家CommonWall w = homeWall.get(i);homeTank.collideWithWall(w);w.draw(g);}}public TankClient() {// printable = false;// 创建菜单及菜单选项jmb = new MenuBar();jm1 = new Menu("游戏");jm2 = new Menu("暂停继续");jm3 = new Menu("帮助");jm4 = new Menu("游戏级别");jm1.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm2.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm3.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jm4.setFont(new Font("TimesRoman", Font.BOLD, 15));// 设置菜单显示的字体jmi1 = new MenuItem("重新开始");jmi2 = new MenuItem("退出");jmi3 = new MenuItem("暂停");jmi4 = new MenuItem("继续");jmi5 = new MenuItem("游戏说明");jmi6 = new MenuItem("级别 Ⅰ");jmi7 = new MenuItem("级别 Ⅱ");jmi8 = new MenuItem("级别 Ⅲ");jmi9 = new MenuItem("级别 Ⅳ");jmi1.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi2.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi3.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi4.setFont(new Font("TimesRoman", Font.BOLD, 15));jmi5.setFont(new Font("TimesRoman", Font.BOLD, 15));jm1.add(jmi1);jm1.add(jmi2);jm2.add(jmi3);jm2.add(jmi4);jm3.add(jmi5);jm4.add(jmi6);jm4.add(jmi7);jm4.add(jmi8);jm4.add(jmi9);jmb.add(jm1);jmb.add(jm2);jmb.add(jm4);jmb.add(jm3);jmi1.addActionListener(this);jmi1.setActionCommand("NewGame");jmi2.addActionListener(this);jmi2.setActionCommand("Exit");jmi3.addActionListener(this);jmi3.setActionCommand("Stop");jmi4.addActionListener(this);jmi4.setActionCommand("Continue");jmi5.addActionListener(this);jmi5.setActionCommand("help");jmi6.addActionListener(this);jmi6.setActionCommand("leve Ⅰ");jmi7.addActionListener(this);jmi7.setActionCommand("level Ⅱ");jmi8.addActionListener(this);jmi8.setActionCommand("level Ⅲ");jmi9.addActionListener(this);jmi9.setActionCommand("level Ⅳ");this.setMenuBar(jmb);// 菜单Bar放到JFrame上this.setVisible(true);for (int i = 0; i < 10; i++) { // 家的格局if (i < 4)homeWall.add(new CommonWall(350, 580 - 21 * i, this));else if (i < 7)homeWall.add(new CommonWall(372 + 22 * (i - 4), 517, this));elsehomeWall.add(new CommonWall(416, 538 + (i - 7) * 21, this));}for (int i = 0; i < 32; i++) {if (i < 16) {otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墙布局otherWall.add(new CommonWall(500 + 20 * i, 180, this));otherWall.add(new CommonWall(200, 400 + 20 * i, this));otherWall.add(new CommonWall(500, 400 + 20 * i, this));} else if (i < 32) {otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this));otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this));otherWall.add(new CommonWall(220, 400 + 20 * (i - 16), this));otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this));}}for (int i = 0; i < 20; i++) { // 金属墙布局if (i < 10) {metalWall.add(new MetalWall(140 + 30 * i, 150, this));metalWall.add(new MetalWall(600, 400 + 20 * (i), this));} else if (i < 20)metalWall.add(new MetalWall(140 + 30 * (i - 10), 180, this));elsemetalWall.add(new MetalWall(500 + 30 * (i - 10), 160, this));}for (int i = 0; i < 4; i++) { // 树的布局if (i < 4) {trees.add(new Tree(0 + 30 * i, 360, this));trees.add(new Tree(220 + 30 * i, 360, this));trees.add(new Tree(440 + 30 * i, 360, this));trees.add(new Tree(660 + 30 * i, 360, this));}}theRiver.add(new River(85, 100, this));for (int i = 0; i < 20; i++) { // 初始化20辆坦克if (i < 9) // 设置坦克出现的位置tanks.add(new Tank(150 + 70 * i, 40, false, Direction.D, this));else if (i < 15)tanks.add(new Tank(700, 140 + 50 * (i - 6), false, Direction.D,this));elsetanks.add(new Tank(10, 50 * (i - 12), false, Direction.D,this));}this.setSize(Fram_width, Fram_length); // 设置界面大小this.setLocation(280, 50); // 设置界面出现的位置this.setTitle("※TanKeWar※ 《∷∷∷∷∷》 ReStart--R  Fire--F");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 static void main(String[] args) {new TankClient(); // 实例化}private class PaintThread implements Runnable {public void run() {// TODO Auto-generated method stubwhile (printable) {repaint();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}private class KeyMonitor extends KeyAdapter {public void keyReleased(KeyEvent e) { // 监听键盘释放homeTank.keyReleased(e);}public void keyPressed(KeyEvent e) { // 监听键盘按下homeTank.keyPressed(e);}}public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("NewGame")) {printable = false;Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确定开始新游戏!", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {printable = true;this.dispose();new TankClient();} else {printable = true;new Thread(new PaintThread()).start(); // 线程启动}} else if (e.getActionCommand().endsWith("Stop")) {printable = false;} else if (e.getActionCommand().equals("Continue")) {if (!printable) {printable = true;new Thread(new PaintThread()).start(); // 线程启动}// System.out.println("继续");} else if (e.getActionCommand().equals("Exit")) {printable = false;Object[] options = { "确定", "取消" };int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,options, options[0]);if (response == 0) {System.out.println("退出");System.exit(0);} else {printable = true;new Thread(new PaintThread()).start(); // 线程启动}} else if (e.getActionCommand().equals("help")) {printable = false;JOptionPane.showMessageDialog(null, "用  ↑ ↓ ← → 控制方向,F键--开火,R键--重新开始!","提示!", JOptionPane.INFORMATION_MESSAGE);this.setVisible(true);printable = true;new Thread(new PaintThread()).start(); // 线程启动} else if (e.getActionCommand().equals("level Ⅰ")) {Tank.count = 12;Tank.speedX = 6;Tank.speedY = 6;Bullets.speedX = 10;Bullets.speedY = 10;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅱ")) {Tank.count = 12;Tank.speedX = 10;Tank.speedY = 10;Bullets.speedX = 12;Bullets.speedY = 12;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅲ")) {Tank.count = 20;Tank.speedX = 14;Tank.speedY = 14;Bullets.speedX = 16;Bullets.speedY = 16;this.dispose();new TankClient();} else if (e.getActionCommand().equals("level Ⅳ")) {Tank.count = 20;Tank.speedX = 16;Tank.speedY = 16;Bullets.speedX = 18;Bullets.speedY = 18;this.dispose();new TankClient();}}
}

home.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;public class Home {private int x, y;private TankClient tc;public static final int width = 30, length = 30; // 全局静态变量长宽private boolean live = true;private static Toolkit tk = Toolkit.getDefaultToolkit(); // 全局静态变量private static Image[] homeImags = null;static {homeImags = new Image[] { tk.getImage(CommonWall.class.getResource("Images/home.jpg")), };}public Home(int x, int y, TankClient tc) {// 构造函数,传递Home的参数并赋值this.x = x;this.y = y;this.tc = tc; // 获得控制}public void gameOver(Graphics g) {tc.tanks.clear();// 作清理页面工作tc.metalWall.clear();tc.otherWall.clear();tc.bombTanks.clear();tc.theRiver.clear();tc.trees.clear();tc.bullets.clear();tc.homeTank.setLive(false);Color c = g.getColor(); // 设置参数g.setColor(Color.green);Font f = g.getFont();g.setFont(new Font(" ", Font.PLAIN, 40));g.drawString("你输了!", 220, 250);g.drawString("  游戏结束! ", 220, 300);g.setFont(f);g.setColor(c);}public void draw(Graphics g) {if (live) { // 如果活着,则画出homeg.drawImage(homeImags[0], x, y, null);for (int i = 0; i < tc.homeWall.size(); i++) {CommonWall w = tc.homeWall.get(i);w.draw(g);}} else {gameOver(g); // 调用游戏结束}}public boolean isLive() { // 判读是否还活着return live;}public void setLive(boolean live) { // 设置生命this.live = live;}public Rectangle getRect() { // 返回长方形实例return new Rectangle(x, y, width, length);}}

有点多,主要也不是让你在页面上看的,闲得无聊,贴了一下。

Java实现的经典坦克大战小游戏相关推荐

  1. html实现经典坦克大战小游戏

    文章目录 1.设计来源 1.1 游戏主界面 1.2 游戏界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/w ...

  2. 用python做一个坦克小游戏_Python制作经典坦克大战小游戏

    image.png 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. ...

  3. 【JAVA程序设计】基于JAVA的坦克大战小游戏--入门级小游戏

    基于JAVA的坦克大战小游戏--入门级小游戏 零.项目获取 一.项目简介 二.开发环境 三.游戏玩法 四.运行截图 零.项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可以确保100 ...

  4. 《HTML5经典坦克大战》游戏(代码)

    前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...

  5. C++实用编程——坦克大战小游戏

    C++实用编程--坦克大战小游戏 Warning: 转载类 原文地址:*HTML https://yq.aliyun.com/articles/683666 改变速度的玩意坏了 我们直接看代码吧,适于 ...

  6. 【180930】坦克大战小游戏源码

    坦克大战小游戏源码程序实现了小霸王游戏机上坦克大战的功能,主要功能是开火.移动.3种不同的敌方坦克.用户自制地图等,缺点是有些小细节还处理的不好,感觉画面不够好,还没实现自动的下一关功能(主要是嫌做默 ...

  7. 一小时制作java坦克大战小游戏

    <坦克大战>是由日本南梦宫Namco游戏公司开发的一款平面射击游戏,于1985年发售.游戏以坦克战斗及保卫基地为主题,属于策略型联机类. 同时也是FC平台上少有的内建关卡编辑器的几个游戏之 ...

  8. canvas+js实现简单的坦克大战小游戏

    使用canvas和js实现经典的坦克大战并不难,坦克和炮弹的绘制可以使用canvas的里API画出,而坦克的移动和炮弹的发射可以依赖于键盘事件和定时器来实现. 在这里我要实现的坦克大战是双人模式,有木 ...

  9. python3小游戏代码教程_Python3制作仿“经典90坦克大战”小游戏|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

最新文章

  1. Python控制流---while循环
  2. linux Address already in use 端口被占用解决办法
  3. 关于Exchange Server 2010中OWA页面无法打开问题处理方法
  4. struts2的配置
  5. Chapter34 创建主窗口/实现应用程序功能
  6. JavaScript进阶4-学习笔记
  7. 马云狂炸近百亿,你的借呗额度涨了吗?
  8. 【poj2464】树状数组
  9. python怎么转到下一行_Python转到下一行并保存/编辑内容
  10. 让你在职场游刃有余的10句话
  11. spark 学习总结
  12. java的tomcat_JAVA程序获取Tomcat的运行状态
  13. R语言作图之ggplot2初识(1)
  14. 基于MATLAB步态算法仿真的六足仿生机器人
  15. 下载eclipse太慢怎么办?
  16. 使用XLSTransformer生成报表的步骤和流程
  17. 《新参者-加贺恭一郎》、《麦田里的守望者》杂记
  18. Unity官方中文版(有生之年终于等到了)
  19. 面对疫情,健身俱乐部管理者最应该做的6件事
  20. 王二是如何看到李四的《艳娘传奇》的,快来了解一下ROS2的话题机制吧!

热门文章

  1. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?
  2. #名词区别篇:alpha、alpha、alpha、stable、LTS版本后缀
  3. 牛客竞赛每日俩题 - Day11
  4. after the first ten days
  5. 2021中青杯数学建模A题思路详细分析 代码?
  6. java 数字三角形
  7. android lrc歌词解析,正则表达式练习: android 歌词解析lrc 转 txt 代码
  8. slf4j+log4j结合使用
  9. python画球轨迹图_python绘制铅球的运行轨迹代码分享
  10. MySQL数据库操作补坑(七)查询语句