In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-03-26 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/01 Report--
This article mainly introduces the relevant knowledge of "how to use JAVA to realize the classic game tank war". The editor shows you the operation process through the actual case, the operation method is simple and fast, and the practicality is strong. I hope this article "how to use JAVA to realize the classic game tank war" can help you solve the problem.
Main design
1. There should be difficult levels: the first, the second, the third, the fourth and the fifth; the map of the first level is the simplest, and the map of the fifth level is the most difficult
2. Tanks must have blood strips and fight many times before they will die.
The map requires me to have four of our tanks (equivalent to four lives) and several enemy tanks
4. The number of shells in our tank is fixed, set to 500
5. Basic information is displayed on the right side of the map
6. On the map, there should be bricks, iron and rivers.
Function screenshot
Game start page
Code implementation
Window layout
Public class GameFrame extends JFrame {/ * serialVersionUID * / private static final long serialVersionUID =-1176914786963603304L; public GameFrame () {super (); this.setSize (800,700); this.setTitle ("Tank Battle"); this.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE); this.setResizable (false); this.setIconImage (TankGameImages.myTankImg [0]) / / display screen size Dimension screenSizeInfo = Toolkit.getDefaultToolkit (). GetScreenSize (); int leftTopX = ((int) screenSizeInfo.getWidth ()-this.getWidth ()) / 2; int leftTopY = ((int) screenSizeInfo.getHeight ()-this.getHeight ()) / 2; / / set the display position in the middle of the screen this.setLocation (leftTopX, leftTopY);}}
Core algorithm of map rendering
@ Servicepublic class PaintService {@ Autowired private GameContext context; private Brick rightBrick = new Brick (700,50); private Iron rightIron = new Iron (700,50); private Water rightWater = new Water (700,50); / * * draw things (including tanks, obstacles). ) * * @ param g Graphics * @ param stuff object * @ the panel on which param panel is drawn * / public void drawStuff (Graphics g, Stuff stuff, JPanel panel) {switch (stuff.getType ()) {/ / enumerated switch, interesting, no need for + StuffTypeEnum.TANK case TANK: Tank tank = (Tank) stuff Switch (stuff.getDirect ()) {/ / judge the direction case NORTH: this.drawNorth (g, tank, panel); break; case SOUTH: this.drawSouth (g, tank, panel); break Case WEST: this.drawWest (g, tank, panel); break; case EAST: this.drawEast (g, tank, panel); break;} break Case BRICK:// g.setColor (new Color (216,90,49); / / g.fill3DRect (stuff.getX ()-20, stuff.getY ()-20,40,40, false) G.drawImage (TankGameImages.stuffImg [StuffTypeEnum.BRICK.getKey ()], stuff.getX ()-10, stuff.getY ()-10,20,20, panel); break; case IRON:// g.setColor (new Color (225,225,225)) / g.fill3DRect (stuff.getX ()-20 dagger / stuff.getY ()-20,40,40, false); g.drawImage (TankGameImages.stuffImg [StuffTypeEnum.IRON.getKey ()], stuff.getX ()-10, stuff.getY ()-10,20,20, panel); break Case WATER:// g.setColor (new Color (65,64,253); / / g.fillRect (stuff.getX ()-20 pound / stuff.getY ()-20,40,40) G.drawImage (TankGameImages.stuffImg [StuffTypeEnum.WATER.getKey ()], stuff.getX ()-10, stuff.getY ()-10, 20, 20, panel); break }} / * draw the explosion * * @ param g Graphics * @ param bombs bomb object container * @ param panel the panel * / public void drawBomb (Graphics g, Vector bombs, JPanel panel) {for (int I = 0; I)
< bombs.size(); i++) { int l = bombs.get(i).getL(); Bomb b = bombs.get(i); // 从炸弹容器中取出一颗炸弹 if (b.getLifeTime() >24) {/ / Health 21-25 g.drawImage (TankGameImages.bomb [0], b.getX ()-l / 2, b.getY ()-l / 2, l, l, panel) } else if (b.getLifeTime () > 18) {/ / Health 16-20 g.drawImage (TankGameImages.bomb [1], b.getX ()-l / 2, b.getY ()-l / 2, l, l, panel) } else if (b.getLifeTime () > 12) {/ / Health 11-15 g.drawImage (TankGameImages.bomb [2], b.getX ()-l / 2, b.getY ()-l / 2, l, l, panel) } else if (b.getLifeTime () > 6) {/ / Health 6-10 g.drawImage (TankGameImages.bomb [3], b.getX ()-l / 2, b.getY ()-l / 2, l, l, panel) } else {/ / Health less than 6 g.drawImage (TankGameImages.bomb [4], b.getX ()-l / 2, b.getY ()-l / 2, l, l, panel);} b.lifeDown () / / Life decays with time if (b.getLifeTime () = = 0) {/ / the bomb dies b.setLive (false) Draw enemy tanks and bullets * * @ param g Graphics * @ param enemies enemy tank capacity * @ param panel panels * / public void drawEnemyTank (Graphics g, Vector enemies, JPanel panel) {for (int I = 0; I)
< enemies.size(); i++) { this.drawStuff(g, enemies.get(i), panel); // 画出敌人的坦克 for (int j = 0; j < enemies.get(i).getBullets().size(); j++) { if (enemies.get(i).getBullets().get(j) != null) { Bullet eb = enemies.get(i).getBullets().get(j); g.drawImage(TankGameImages.bullet, eb.getX() - 2, eb.getY() - 2, 4, 4, panel); } } } } /** * 画出我的坦克和子弹 * * @param g Graphics * @param myTanks 我的坦克容量 * @param panel 被画的那个面板 */ public void drawMyTank(Graphics g, Vector myTanks, JPanel panel) { for (int m = 0; m < myTanks.size(); m++) { MyTank myTank = myTanks.get(m); // 取出我的坦克 this.drawStuff(g, myTank, panel); // 画出我的坦克 for (int i = 0; i < myTank.getBullets().size(); i++) { if (myTank.getBullets().get(i) != null) { Bullet b = myTank.getBullets().get(i); g.drawImage(TankGameImages.bullet, b.getX() - 2, b.getY() - 2, 4, 4, panel); } } } } /** * 画出地图 * * @param g Graphics * @param map 地图对象 * @param panel 被画的那个面板 */ public void drawMap(Graphics g, Map map, JPanel panel) { Vector bricks = map.getBricks(); Vector irons = map.getIrons(); Vector waters = map.getWaters(); for (int i = 0; i < bricks.size(); i++) { this.drawStuff(g, bricks.get(i), panel); } for (int i = 0; i < irons.size(); i++) { this.drawStuff(g, irons.get(i), panel); } for (int i = 0; i < waters.size(); i++) { this.drawStuff(g, waters.get(i), panel); } } /** * 画出一个面朝北的坦克 * * @param g Graphics * @param tank 东西对象 * @param panel 被画的那个面板 */ public void drawNorth(Graphics g, Tank tank, JPanel panel) {// int x = tank.getX();// int y = tank.getY(); //0.设置画笔颜色// g.setColor(Color.white);// //1.画出左边的矩形// g.fill3DRect(x - 20, y - 20, 10,// 40, false);// g.fill3DRect(x + 10, y - 20, 10, 40, false);//2.画出右边矩形// //3.更换画笔颜色// g.setColor(tank.getColor()); //4.画出轮子条纹// for (int// i = 0;// i < 20 - 1;// i++) {// g.drawLine(x - 20, y - 20 + (i + 1) * 2, x - 10 - 1, y - 20 + (i + 1) * 2);// g.drawLine(x + 10, y - 20 + (i + 1) * 2, x + 20 - 1, y - 20 + (i + 1) * 2);// } //5.画出中间1矩形// g.fill3DRect(x - 15, y - 14, 30, 28, false); //6.更换画笔颜色// g.setColor(Color.white); //7.画出中间2矩形// g.draw3DRect(x - 10, y - 9, 20,// 18, false); //8.画出中间3矩形// g.draw3DRect(x - 3, y - 5, 6, 10, false); //9.画直线// g.drawLine(x - 15, y - 14, x - 10, y - 9);// g.drawLine(x + 15, y - 14, x + 10, y - 9);// g.drawLine(x - 15, y + 14, x - 10, y + 9);// g.drawLine(x + 15, y + 14, x + 10, y + 9);// g.setColor(tank.getColor()); //10.画矩形// g.fill3DRect(x - 3, y - 12, 6, 3,// false);// g.fill3DRect(x - 2, y - 20, 4, 2, false);// g.fill3DRect(x - 1, y - 20,// 2, 11, false); Image image; if (tank.getTankType() == TankTypeEnum.MY) { g.setColor(Color.green); image = TankGameImages.myTankImg[DirectionEnum.NORTH.getKey()];// 初始化图片 } else { image = TankGameImages.enemyTankImg[DirectionEnum.NORTH.getKey()]; g.setColor(Color.gray); } g.drawImage(image, tank.getX() - 20, tank.getY() - 20, 40, 40, panel); g.fillRect(tank.getX() - 20, tank.getY() - 30, tank.getBlood() * 4, 5); } /** * 画出一个方向朝南的坦克 * * @param g Graphics * @param tank 东西对象 * @param panel 被画的那个面板 */ public void drawSouth(Graphics g, Tank tank, JPanel panel) {// int x = tank.getX();// int y = tank.getY();// g.setColor(Color.white);// g.fill3DRect(x - 20, y - 20, 10, 40, false);// g.fill3DRect(x + 10, y - 20, 10,// 40, false);// g.setColor(tank.getColor());// for (int i = 0; i < 20 - 1; i++) {// g.drawLine(x - 20, y - 20 + (i + 1) * 2, x - 10 - 1, y - 20 + (i + 1) * 2);// g.drawLine(x + 10,// y - 20 + (i + 1) * 2, x + 20 - 1, y - 20 + (i + 1) * 2);// }// g.fill3DRect(x - 15, y - 14, 30,// 28, false);// g.setColor(Color.white);// g.draw3DRect(x - 10, y - 9, 20,// 18, false);// g.draw3DRect(x - 3, y - 5, 6, 10, false);// g.drawLine(x - 15,// y - 14, x - 10, y - 9);// g.drawLine(x + 15, y - 14, x + 10, y - 9);// g.drawLine(x - 15,// y + 14, x - 10, y + 9);// g.drawLine(x + 15, y + 14, x + 10, y + 9);// g.setColor(tank.getColor());// g.fill3DRect(x - 3, y + 9, 6, 3, false);// g.fill3DRect(x - 1, y + 9, 2, 11, false);// g.fill3DRect(x - 2, y + 18, 4, 2,// false); Image image; if (tank.getTankType() == TankTypeEnum.MY) { g.setColor(Color.green); image = TankGameImages.myTankImg[DirectionEnum.SOUTH.getKey()];// 初始化图片 } else { image = TankGameImages.enemyTankImg[DirectionEnum.SOUTH.getKey()]; g.setColor(Color.gray); } g.drawImage(image, tank.getX() - 20, tank.getY() - 20, 40, 40, panel); g.fillRect(tank.getX() - 20, tank.getY() - 30, tank.getBlood() * 4, 5); } /** * 画出一个方向朝西的坦克 * * @param g Graphics * @param tank 东西对象 * @param panel 被画的那个面板 */ public void drawWest(Graphics g, Tank tank, JPanel panel) {// int x = tank.getX();// int y = tank.getY();// g.setColor(Color.white);// g.fill3DRect(x - 20, y - 20, 40, 10, false);// g.fill3DRect(x - 20, y + 10, 40,// 10, false);// g.setColor(tank.getColor());// for (int i = 0; i < 20 - 1; i++) {// g.drawLine(x - 20 + (i + 1) * 2, y - 20, x - 20 + (i + 1) * 2, y - 10 - 1);// g.drawLine(x - 20 + (i + 1) * 2, y - 20 + 30, x - 20 + (i + 1) * 2, y - 10 - 1 + 30);// }// g.fill3DRect(x - 14, y - 15, 28, 30, false);// g.setColor(Color.white);// g.draw3DRect(x - 9, y - 10, 18, 20, false);// g.draw3DRect(x - 5, y - 3, 10,// 6, false);// g.drawLine(x - 15, y - 14, x - 10, y - 9);// g.drawLine(x + 15, y - 14,// x + 10, y - 9);// g.drawLine(x - 15, y + 14, x - 10, y + 9);// g.drawLine(x + 15, y + 14,// x + 10, y + 9);// g.setColor(tank.getColor());// g.fill3DRect(x - 12, y - 3, 3,// 6, false);// g.fill3DRect(x - 20, y - 1, 11, 2, false);// g.fill3DRect(x - 20,// y - 2, 2, 4, false); Image image; if (tank.getTankType() == TankTypeEnum.MY) { image = TankGameImages.myTankImg[DirectionEnum.WEST.getKey()];// 初始化图片 g.setColor(Color.green); } else { image = TankGameImages.enemyTankImg[DirectionEnum.WEST.getKey()]; g.setColor(Color.gray); } g.drawImage(image, tank.getX() - 20, tank.getY() - 20, 40, 40, panel); g.fillRect(tank.getX() - 20, tank.getY() - 30, tank.getBlood() * 4, 5); } /** * 画出一个方向朝东的坦克 * * @param g Graphics * @param tank 东西对象 * @param panel 被画的那个面板 */ public void drawEast(Graphics g, Tank tank, JPanel panel) {// int x = tank.getX();// int y = tank.getY();// g.setColor(Color.white);// g.fill3DRect(x - 20, y - 20, 40, 10, false);// g.fill3DRect(x - 20, y + 10, 40,// 10, false);// g.setColor(tank.getColor());// for (int i = 0; i < 20 - 1; i++) {// g.drawLine(x - 20 + (i + 1) * 2, y - 20, x - 20 + (i + 1) * 2, y - 10 - 1);// g.drawLine(x - 20 + (i + 1) * 2, y - 20 + 30, x - 20 + (i + 1) * 2, y - 10 - 1 + 30);// }// g.fill3DRect(x - 14, y - 15, 28, 30, false);// g.setColor(Color.white);// g.draw3DRect(x - 9, y - 10, 18, 20, false);// g.draw3DRect(x - 5, y - 3, 10,// 6, false);// g.drawLine(x - 15, y - 14, x - 10, y - 9);// g.drawLine(x + 15, y - 14,// x + 10, y - 9);// g.drawLine(x - 15, y + 14, x - 10, y + 9);// g.drawLine(x + 15, y + 14,// x + 10, y + 9);// g.setColor(tank.getColor());// g.fill3DRect(x + 9, y - 3, 3, 6,// false);// g.fill3DRect(x + 9, y - 1, 11, 2, false);// g.fill3DRect(x + 18, y - 2,// 2, 4, false); Image image; if (tank.getTankType() == TankTypeEnum.MY) { image = TankGameImages.myTankImg[DirectionEnum.EAST.getKey()];// 初始化图片 g.setColor(Color.green); } else { image = TankGameImages.enemyTankImg[DirectionEnum.EAST.getKey()]; g.setColor(Color.gray); } g.drawImage(image, tank.getX() - 20, tank.getY() - 20, 40, 40, panel); g.fillRect(tank.getX() - 20, tank.getY() - 30, tank.getBlood() * 4, 5); } /** * 画出游戏右边的那个面板 * * @param g Graphics * @param tgp 游戏主要面板对象 */ public void drawRight(Graphics g, GamePanel tgp, RealTimeGameData data) { if (data.getMapMakingFlag().equals(Boolean.TRUE)) { g.drawString("当前选中画笔(可按C键切换)", 620, 20); if (data.getCurrentStuff() == StuffTypeEnum.IRON) { drawStuff(g, rightIron, tgp); } else if (data.getCurrentStuff() == StuffTypeEnum.BRICK) { drawStuff(g, rightBrick, tgp); } else if (data.getCurrentStuff() == StuffTypeEnum.WATER) { drawStuff(g, rightWater, tgp); } else { g.drawString("橡皮擦", 680, 50); } } else { for (int i = 0; i < data.getEnemyTankNum(); i++) { if (i >= 4) {g.drawImage (TankGameImages.enemyTankImg [DirectionEnum.NORTH.getKey ()], 402 + 50 * I, 100,40,40, tgp);} else {g.drawImage (TankGameImages.enemyTankImg [DirectionEnum.NORTH.getKey ()], 602 + 50 * I, 20,40,40, tgp) }} for (int j = 0; j < data.getMyTankNum ()) {g.drawImage (TankGameImages.myTankImg [DirectionEnum.NORTH.getKey ()], 602 + 50 * j, 400,40,40, tgp) } g.drawString ("number of my tank bullets:" + data.getMyBulletNum (), 620,500);}} public void rePaintPanel (GamePanel panel, Graphics g) {RealTimeGameData data = context.getGameData (); if (data.isStart ()) {g.setColor (Color.black) G.fillRect (0,0, GameConstants.GAME_PANEL_WIDTH, GameConstants.GAME_PANEL_HEIGHT); g.fillRect (280,600,40,40); this.drawMap (g, data.getMap (), panel); this.drawMyTank (g, data.getMyTanks (), panel); / / draw my tank (including bullets) this.drawEnemyTank (g, data.getEnemies (), panel) / draw enemy tanks (including bullets) this.drawBomb (g, data.getBombs (), panel); / / draw explosive this.drawRight (g, panel, data) If (data.getMyTankNum () = = 0) {/ / if my tank number is 0 g.drawImage (TankGameImages.gameOver, 250, data.getDy (), 100,100, panel) } if (data.getEnemyTankNum () = 0) {/ / if the number of enemy tanks is 0 g.drawImage (TankGameImages.gameWin, 250, data.getDy (), 100,100, panel);} if (data.getDy () = = 250) {g.fillRect (0,0800,600) G.setColor (Color.BLUE); if (data.getMyTankNum () = = 0) {g.drawString ("failed!!" , 300220);} else {g.drawString ("challenge succeeds, please wait a moment", 300220);} g.drawString (("enemy tank deaths:" (8-data.getEnemyTankNum (), 300,260) G.drawString ("Total death toll of my tanks:" + data.getBeKilled (), 300,280) G.drawString ("my total shell consumption:" + (GameConstants.MY_TANK_INIT_BULLET_NUM-data. GetMyBulletNum ()), 300,300) G.drawString ("enemy tank surplus:" + data.getEnemyTankNum (), 300,320); g.drawString ("Total number of my tanks remaining:" + data.getMyTankNum (), 300,340) G.drawString ("my total number of shells remaining:" + data.getMyBulletNum (), 300,360);}} else {g.drawImage (TankGameImages.startImage, 0,0,800,700, panel); / / g.drawImage (TankGameImages.font, 0, data.getKy (), panel) If (data.isIconSmile ()) {/ / g.drawImage (TankGameImages.yctSmile1, data.getKx (), 45 / / panel); data.setIconSmile (false);} else {/ / g.drawImage (TankGameImages.yctSmile2, data.getKx (), 45, / / panel) Data.setIconSmile (true);}
Tank core algorithm
@ Servicepublic class TankEventService {/ * determine whether the tank overlaps with another thing * * @ param stuff the shortest distance * @ return between the two objects * @ return overlaps * / public boolean isTankOverlap (Tank tank, Stuff stuff, int length) {boolean b = false; int x = stuff.getX (); int y = stuff.getY () If (tank.getDirect () = = DirectionEnum.NORTH) {tank.setY (tank.getY ()-tank.getSpeed ()); if (Math.abs (tank.getY ()-y) < length & & Math.abs (tank.getX ()-x) < length) {b = true; tank.setY (tank.getY () + tank.getSpeed ()) } else {tank.setY (tank.getY () + tank.getSpeed ());}} if (tank.getDirect () = = DirectionEnum.SOUTH) {tank.setY (tank.getY () + tank.getSpeed ()) If (Math.abs (tank.getY ()-y) < length & & Math.abs (tank.getX ()-x) < length) {b = true;} tank.setY (tank.getY ()-tank.getSpeed ()) } if (tank.getDirect () = = DirectionEnum.EAST) {tank.setX (tank.getX () + tank.getSpeed ()); if (Math.abs (tank.getY ()-y) < length & & Math.abs (tank.getX ()-x) < length) {b = true } tank.setX (tank.getX ()-tank.getSpeed ());} if (tank.getDirect () = = DirectionEnum.WEST) {tank.setX (tank.getX ()-tank.getSpeed ()) If (Math.abs (tank.getY)-y) < length & & Math.abs (tank.getX ()-x) < length) {b = true;} tank.setX (tank.getX () + tank.getSpeed ());} return b } / * determine whether to overlap * * @ param enemies enemy tank capacity * @ return overlap * / public boolean isMyTankOverlap (MyTank tank, Vector enemies) {for (int I = 0; I < enemies.size ()) {if (tank, enemies.get (I), 40) return true } return false;} / * determine whether you overlap with other tanks * * @ param enemies enemy tank capacity * @ param myTanks whether my tank capacity * @ return overlap * / public boolean isEnemyTankOverlap (EnemyTank enemy, Vector enemies, Vector myTanks) {for (int I = 0; I < enemies.size () ) {if (enemy! = enemies.get (I)) {if (isTankOverlap (enemy, enemies.get (I), 40)) {enemy.setOverlapNo (true); return true;} for (int j = 0; j < myTanks.size ()) If (isTankOverlap (enemy, myTanks.get (j), 40)) {enemy.setOverlapYes (true); return true;}} enemy.setOverlapNo (false); enemy.setOverlapYes (false); return false } / * keep heading west every 36 milliseconds * / public void enemyGoWest (EnemyTank enemy) {for (;) {GameTimeUnit.sleepMillis (36); if (! enemy.isOverlapNo () & &! enemy.isOverlapYes ()) {enemy.goWest () } if (enemy.getMyTankLocation ()! = DirectionEnum.WEST) {enemy.setDirect (enemy.getMyTankDirect ()); break;}} / * go east every 36 milliseconds * / public void enemyGoEast (EnemyTank enemy) {for (; ) {GameTimeUnit.sleepMillis (36); if (! enemy.isOverlapNo () & &! enemy.isOverlapYes ()) {enemy.goEast ();} if (enemy.getMyTankLocation ()! = DirectionEnum.EAST) {enemy.setDirect (enemy.getMyTankDirect ()); break Go north every 36 milliseconds * / public void enemyGoNorth (EnemyTank enemy) {for (;;) {GameTimeUnit.sleepMillis (36); if (! enemy.isOverlapNo () & &! enemy.isOverlapYes ()) {enemy.goNorth () } if (enemy.getMyTankLocation ()! = DirectionEnum.NORTH) {enemy.setDirect (enemy.getMyTankDirect ()); break;}} / * go south every 36 milliseconds * / public void enemyGoSouth (EnemyTank enemy) {for (; ) {GameTimeUnit.sleepMillis (36); if (! enemy.isOverlapNo () & &! enemy.isOverlapYes ()) {enemy.goSouth ();} if (enemy.getMyTankLocation ()! = DirectionEnum.SOUTH) {enemy.setDirect (enemy.getMyTankDirect ()); break } / * randomly select one of the three specified directions * * @ param direct1 direction 1 * @ param direct2 direction 2 * @ param direct3 direction 3 * / public DirectionEnum enemyGetRandomDirect (DirectionEnum direct1, DirectionEnum direct2, DirectionEnum direct3) {int random = (int) (Math.random () * 3); DirectionEnum returnDirect = DirectionEnum.INVALID Switch (random) {case 0: returnDirect = direct1; break; case 1: returnDirect = direct2; break; case 2: returnDirect = direct3; break;} return returnDirect Enable enemy tanks to find my tanks and fire guns * * @ param myTank my tanks * @ param map map objects * / public void enemyFindAndKill (EnemyTank enemy, MyTank myTank, Map map) {int myX = myTank.getX (); int myY = myTank.getY (); int enX = enemy.getX () Int enY = enemy.getY (); if (Math.abs (myX-enX) < 20 & & myY
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.