Java语言坦克大战游戏设计(附有代码和图片)
- 格式:doc
- 大小:1.49 MB
- 文档页数:48
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;import java.util.ArrayList;import java.util.Random;import javax.swing.BorderFactory;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;import tankwar.Tank.Direction;import barrier.EnemyBorn;import barrier.Gold;import barrier.Home;import barrier.Iron;import barrier.SelfBorn;import barrier.Wall;public class TankWar implements KeyListener {static boolean TIMEOUT = false;private JFrame f;private JPanel gamePanel;private PanelShow messgePanel;private myPanel p;private Tank myTank;public static final int AREA_WIDTH = 830;public static final int AREA_HEIGHT = 800;private ArrayList<Missle> missles = new ArrayList<Missle>(); private ArrayList<Tank> allTanks = new ArrayList<Tank>();private ArrayList<Boom> booms = new ArrayList<Boom>();private ArrayList<Wall> walls = new ArrayList<Wall>();private ArrayList<Iron> irons = new ArrayList<Iron>();private ArrayList<Gold> golds = new ArrayList<Gold>();private ArrayList<Item> items = new ArrayList<Item>();private ArrayList<EnemyBorn> enemyBorns = new ArrayList<EnemyBorn>(); private SelfBorn selfBorn;private Home home;private Tank enemyTank;private Random r;private ImageIcon backGround;private final String map;private int tankMax;private boolean over = false;private static int selfMax = 3;private boolean win;private boolean flash = false;private TankWar tw = this;static int SCORE = 0;private final JFrame mainF;private int style;public TankWar(String map, int tankMax, JFrame mainF, int style)throws Exception {this.map = map;this.tankMax = tankMax;this.mainF = mainF;this.style = style;init();}private void init() {f = new JFrame("坦克大战 V3.0");gamePanel = new JPanel(null);p = new myPanel();p.setBackground(Color.WHITE);r = new Random();messgePanel = new PanelShow();initMap(new File("map/" + map));try {myTank = new Tank(selfBorn.getX(), selfBorn.getY(), true, allTanks,walls, irons, golds, missles, home, booms, style);} catch (Exception e1) {}myTank.setDir(Direction.U);allTanks.add(myTank);addTank();try {backGround = new ImageIcon(TankWar.class.getResource("/pic/whiteback.jpg"));} catch (Exception e) {}p.setBorder(BorderFactory.createEtchedBorder(Color.BLACK, Color.WHITE));p.setSize(AREA_WIDTH, AREA_HEIGHT);messgePanel.setBounds(AREA_WIDTH, 0, 200, AREA_HEIGHT); gamePanel.add(messgePanel);gamePanel.add(p);f.add(gamePanel);f.setBounds(0, 0, AREA_WIDTH + 200, AREA_HEIGHT);f.setDefaultCloseOperation(3);f.setResizable(true);f.setFocusable(true);f.addKeyListener(this);f.setVisible(true);new Thread(new Runnable() {public void run() {while (!over) {if (!myTank.isLive()) {selfMax--;if (selfMax < 0) {f.removeKeyListener(tw);over = true;win = false;break;} else {myTank.setLevel(1);myTank.setX(selfBorn.getX()); myTank.setY(selfBorn.getY()); myTank.setDir(Direction.U); myTank.setHp(50);myTank.setLive(true);}}if (tankMax <= 0 && allTanks.size() == 1) {f.removeKeyListener(tw);over = true;win = true;}if (!home.isLive()) {f.removeKeyListener(tw);over = true;win = false;}p.repaint();myTank.move();for (int i = 1; i < allTanks.size(); i++) {allTanks.get(i).move();allTanks.get(i).setNoFire(myTank.getNoFire() + 1);//if(allTanks.get(i).getX()%5==0&&allTanks.get(i).getY()%5==0)aI(allTanks.get(i));}if (allTanks.size() <= enemyBorns.size() + 1)addTank();myTank.setNoFire(myTank.getNoFire() + 1);messgePanel.setEnemyCount(tankMax);messgePanel.setSelfCount(selfMax);messgePanel.setScore(SCORE);if (SCORE % 500 == 0) {SCORE += 100;Item item = new Item(allTanks, booms, irons, home);items.add(item);item.start();}try {Thread.sleep(30);} catch (InterruptedException e) {}}over();}}).start();}private class myPanel extends JPanel {/****/private static final long serialVersionUID = 4408440723797225328L;@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);g.drawImage(backGround.getImage(), 0, 0, null);for (int j = 0; j < walls.size(); j++) {walls.get(j).draw(g);}for (int j = 0; j < irons.size(); j++) {irons.get(j).draw(g);}for (int j = 0; j < golds.size(); j++) {golds.get(j).draw(g);}for (int j = 0; j < enemyBorns.size(); j++) { enemyBorns.get(j).draw(g);}home.draw(g);selfBorn.draw(g);for (int j = 0; j < allTanks.size(); j++) { allTanks.get(j).drawTank(g);}for (int j = 0; j < irons.size(); j++) {irons.get(j).draw(g);}for (int i = 0; i < missles.size(); i++) {missles.get(i).drawMissle(g);if (!missles.get(i).isLive())missles.remove(i);}for (int i = 0; i < booms.size(); i++) { if (booms.get(i).isLive())booms.get(i).drawBoom(g);elsebooms.remove(i);}for (int j = 0; j < items.size(); j++) { if (!items.get(j).isLive()) {items.remove(j);continue;}items.get(j).draw(g);}if (over)drawOver(g);messgePanel.repaint();}}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {if (over) {if (e.getKeyCode() == KeyEvent.VK_F1) { over = false;missles.clear();allTanks.clear();booms.clear();walls.clear();irons.clear();golds.clear();enemyBorns.clear();try {init();} catch (Exception e1) {}} else {f.setVisible(false);mainF.setSize(800, 800);mainF.setVisible(true);}} else if (e.getKeyCode() == KeyEvent.VK_SPACE) { myTank.fire();} else {myTank.keyPress(e);}}@Overridepublic void keyReleased(KeyEvent e) {myTank.keyReleased(e);}public void aI(Tank tank) {if (TIMEOUT) {tank.setUp(false);tank.setLeft(false);tank.setDown(false);tank.setRight(false);return;}if (r.nextInt(40) == 0)tank.fire();if (r.nextInt(10) == 0) {if (tank.getX() >= myTank.getX()&& tank.getX() <= myTank.getX() + Tank.SIZE && tank.getY() > myTank.getY()) {tank.setUp(true);tank.setLeft(false);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.U);return;} else if (tank.getX() >= myTank.getX()&& tank.getX() <= myTank.getX() + Tank.SIZE&& tank.getY() < myTank.getY()) {tank.setUp(false);tank.setLeft(false);tank.setDown(true);tank.setRight(false);tank.setDir(Direction.D);return;}else if (tank.getX() > myTank.getX()&& tank.getY() >= myTank.getY()&& tank.getY() <= myTank.getY() + Tank.SIZE) { tank.setUp(false);tank.setLeft(true);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.L);return;} else if (tank.getX() < myTank.getX()&& tank.getY() >= myTank.getY()&& tank.getY() <= myTank.getY() + Tank.SIZE) {tank.setUp(false);tank.setLeft(false);tank.setDown(false);tank.setRight(true);tank.setDir(Direction.R);return;}}if (tank.getX() <= 0) {tank.setUp(false);tank.setLeft(false);tank.setDown(false);tank.setRight(true);tank.setDir(Direction.R);}if (tank.getY() <= 0) {tank.setUp(false);tank.setLeft(false);tank.setDown(true);tank.setRight(false);tank.setDir(Direction.D);}if (tank.getX() >= AREA_WIDTH - Tank.SIZE) { tank.setUp(false);tank.setLeft(true);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.L);}if (tank.getY() >= AREA_HEIGHT - Tank.SIZE) { tank.setUp(true);tank.setLeft(false);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.U);} else if (r.nextInt(300) == 1) {tank.setUp(true);tank.setLeft(false);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.U);}else if (r.nextInt(300) == 2) { tank.setUp(false);tank.setLeft(true);tank.setDown(false);tank.setRight(false);tank.setDir(Direction.L);} else if (r.nextInt(300) == 3) { tank.setUp(false);tank.setLeft(false);tank.setDown(true);tank.setRight(false);tank.setDir(Direction.D);} else if (r.nextInt(300) == 4) { tank.setUp(false);tank.setLeft(false);tank.setDown(false);tank.setRight(true);tank.setDir(Direction.R);}}public void initMap(File file) {try {FileInputStream read = new FileInputStream(file);for (int i = 0; i < AREA_HEIGHT / 50; i++) {for (int j = 0; j < AREA_WIDTH / 50; j++) {switch (read.read()) {case1:walls.add(new Wall(j * 50, i * 50));break;case2:irons.add(new Iron(j * 50, i * 50));break;case3:golds.add(new Gold(j * 50, i * 50));break;case4:selfBorn = new SelfBorn(j * 50, i * 50);break;case5:enemyBorns.add(new EnemyBorn(j * 50, i * 50));break;case6:home = new Home(j * 50, i * 50);break;}}}read.close();} catch (Exception e) {};}public void addTank() {if (tankMax <= 0)return;for (int i = allTanks.size(); i < enemyBorns.size() + 1; i++) {try {int temp = r.nextInt(enemyBorns.size());enemyTank = new Tank(enemyBorns.get(temp).getX(), enemyBorns.get(temp).getY(), false, allTanks, walls, irons,golds, missles, home, booms, r.nextInt(3) + 1); } catch (Exception e) {e.printStackTrace();}enemyTank.setDir(Direction.D);enemyTank.setDown(true);allTanks.add(enemyTank);tankMax--;if (tankMax <= 0)return;}}public static void addMyTankLives() {selfMax++;}private void over() {for (int i = 0; i < AREA_HEIGHT / 50; i++) { for (int j = 0; j < AREA_WIDTH / 50; j++) { irons.add(new Iron(j * 50, i * 50));p.repaint();try {Thread.sleep(5);} catch (InterruptedException e) {}}}while (true) {flash = !flash;p.repaint();try {Thread.sleep(1000);} catch (InterruptedException e) {}f.addKeyListener(this);}}private void drawOver(Graphics g) {p.repaint();g.setColor(Color.red);g.setFont(new Font("Arial", 1, 100));g.drawString("GAME OVER", 100, 200);g.setFont(new Font("Arial", 2, 50));if (win)g.drawString("Congratulation! You Win!", 100, 400);elseg.drawString("So Sorry, You Lose!", 100, 400);if (flash) {g.setFont(new Font("Arial", 2, 30));g.setColor(Color.BLACK);g.drawString("Press F1 to try again...,", 150, 500);g.drawString("Press the other Key to Return the Title...,", 150,600);}}}</pre>。
import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.List;public class TankClient extends Frame {public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);List<Missile> missiles = new ArrayList<Missile>();List<Explode> explodes = new ArrayList<Explode>();List<Tank> tanks = new ArrayList<Tank>();Image offScreenImage = null;@Overridepublic void paint(Graphics g) {g.drawString("missiles count:" + missiles.size(), 10, 50);g.drawString("explodes count:" + explodes.size(), 10, 70);g.drawString("tanks count:" + tanks.size(), 10, 90);for(int i=0; i<missiles.size(); i++) {Missile m = missiles.get(i);m.hitTanks(tanks);m.draw(g);}for(int i=0; i<explodes.size(); i++) {Explode e = explodes.get(i);e.draw(g);}for(int i=0; i<tanks.size(); i++) {Tank t = tanks.get(i);t.draw(g);}myTank.draw(g);}@Overridepublic void update(Graphics g) {if(offScreenImage == null) {offScreenImage = this.createImage(800, 600);}Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.GREEN);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);}public void launchFrame() {//生产多少地方坦克for(int i=0; i<5; i++) {tanks.add(new Tank(50 + 40*(i+1), 50, false, Tank.Direction.D, this));}this.setLocation(400, 300);this.setSize(GAME_WIDTH, GAME_HEIGHT);this.setTitle("TankWar");this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.setResizable(false);this.setBackground(Color.GREEN);this.addKeyListener(new KeyMonitor());this.setVisible(true);new Thread(new PaintThread()).start();}public static void main(String[] args) {TankClient tc = new TankClient();unchFrame();}class PaintThread implements Runnable {public void run() {while(true) {repaint();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}class KeyMonitor extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent e) {myTank.keyReleased(e);}@Overridepublic void keyPressed(KeyEvent e) {myTank.keyPressed(e);}}}import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.Random;public class Tank {public static final int XSPEED = 5;public static final int YSPEED = 5;public static final int WIDTH = 30;public static final int HEIGHT = 30;boolean good;int x, y;private static Random r = new Random();private boolean live = true;private int step = r.nextInt(12) + 3;TankClient tc;boolean bL, bU, bR, bD;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};Direction dir = Direction.STOP;Direction ptDir = Direction.D;public Tank(int x, int y, boolean good) {this.x = x;this.y = y;this.good = good;}public Tank(int x, int y, boolean good, Direction dir, TankClient tc) { this(x, y, good);this.dir = dir;this.tc = tc;}public void draw(Graphics g) {if(!live) {if(!good) {tc.tanks.remove(this);}return;}Color c = g.getColor();if(good) g.setColor(Color.RED);else g.setColor(Color.BLUE);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);switch(ptDir) {case L:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y + HEIGHT/2);break;case LU:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y);break;case U:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH/2, y);break;case RU:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y);break;case R:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y + HEIGHT/2);break;case RD:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y + HEIGHT);break;case D:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH/2, y + HEIGHT);break;case LD:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y + HEIGHT);break;}move();}private void move() {switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(dir != Direction.STOP) {ptDir = dir;}if(x < 0) x = 0;if(y < 30) y = 30;if(x + WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - WIDTH;if(y+ HEIGHT> TankClient.GAME_HEIGHT) y= TankClient.GAME_HEIGHT- HEIGHT;if(!good) {if(step == 0) {step = r.nextInt(12) + 3;Direction[] dirs = Direction.values();dir = dirs[r.nextInt(dirs.length)];}step --;if(r.nextInt(40) > 38) this.fire();}}public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;}locateDirection();}private void locateDirection() {if(bL && !bU && !bR && !bD) dir = Direction.L;else if(bL && bU && !bR && !bD) dir = Direction.LU;else if(!bL && bU && !bR && !bD) dir = Direction.U;else if(!bL && bU && bR && !bD) dir = Direction.RU;else if(!bL && !bU && bR && !bD) dir = Direction.R;else if(!bL && !bU && bR && bD) dir = Direction.RD;else if(!bL && !bU && !bR && bD) dir = Direction.D;else if(bL && !bU && !bR && bD) dir = Direction.LD;else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;}public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_CONTROL:fire();break;case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;}locateDirection();}private Missile fire() {int x = this.x + WIDTH/2 - Missile.WIDTH/2;int y = this.y + HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, this.good, this.ptDir, this.tc);tc.missiles.add(m);return m;}public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}}import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.util.List;public class Missile {public static final int XSPEED = 10;public static final int YSPEED = 10;public static final int WIDTH = 10;public static final int HEIGHT = 10;TankClient tc;int x, y;Tank.Direction dir = Tank.Direction.R;boolean live = true;private boolean good;public Missile(int x, int y, boolean good, Tank.Direction dir) { this.x = x;this.y = y;this.good = good;this.dir = dir;}public Missile(int x, int y, boolean good, Tank.Direction dir, TankClient tc) {this(x, y, good, dir);this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.missiles.remove(this);return;}Color c = g.getColor();g.setColor(Color.BLACK);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);move();}private void move() {switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(x< 0 || y< 0 || x> TankClient.GAME_WIDTH|| y> TankClient.GAME_HEIGHT) {live = false;}}public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}public boolean hitTank(Tank t) {if(this.live && t.isLive() && this.good != t.good&&this.getRect().intersects(t.getRect())) {this.live = false;t.setLive(false);tc.explodes.add(new Explode(x, y, tc));return true;}return false;}public boolean hitTanks(List<Tank> tanks) { for(int i=0; i<tanks.size(); i++) {if(this.hitTank(tanks.get(i))) {return true;}}return false;}}import java.awt.Color;import java.awt.Graphics;public class Explode {int x, y;private int[] diameters = {4, 7, 12, 18, 26, 32, 49, 30, 14, 6};private boolean live = true;private TankClient tc;int step = 0;public Explode(int x, int y, TankClient tc) {this.x = x;this.y = y;this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.explodes.remove(this);return;}Color c = g.getColor();g.setColor(Color.ORANGE);g.fillOval(x, y, diameters[step], diameters[step]);g.setColor(c);step ++;if(step == diameters.length) {live = false;}}}。
辽宁工业大学《Java语言程序设计》课程设计(论文)题目:坦克游戏院(系):软件学院专业班级:软件工程133班学号:学生姓名:指导教师:翟宝峰参考网址 : 教师职称:副教授起止时间:2014.6.9——2014.6.20课程设计(论文)任务及评语院(系):软件学院教研室:软件教研室目录第1章课程设计目的与要求 (1)1.1设计目的 (1)1.2实验环境 (1)1.3预备知识 (1)1.4设计要求 (1)第2章课程设计内容 (2)2.1 课题描述 (2)2.2 系统设计 (3)2.2.1功能分析 (3)2.2.2面向对象设计 (4)2.2.2类成员描述 (5)2.3程序实现 (6)2.3.1源码分析 (6)2.3.2运行结果 (13)第3章总结 (15)参考文献 (16)第1章课程设计目的与要求1.1设计目的将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握JAVA语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境硬件要求能运行Windows 操作系统的微机系统。
JAVA语言应用程序开发软件使用:VJAVA 系统,或其他JAVA语言应用程序开发软件。
坦克⼤战【java项⽬】坦克⼤战(JAVA项⽬)1.项⽬简介复刻童年经典⼩游戏——坦克⼤战:⽤户进⼊游戏界⾯后,通过键盘上的数字1,2键选择游戏模式,选择1并按回车键进⼊单⼈模式;选择2并按回车键进⼊双⼈模式。
玩家1可通过按键WASD控制坦克⽅向及移动,并且按空格发射⼦弹。
玩家2通过⽅向键控制坦克⽅向移动,并且按K键发射⼦弹。
⼦弹碰到围墙后消失,⼦弹碰到坦克后产⽣爆炸特效。
左上⾓记录敌⽅坦克的实时数量。
玩家击败所有敌⽅坦克,游戏胜利;若所有我⽅坦克被击败,或者我⽅基地被摧毁,则游戏失败。
2.⼩组成员及分⼯成员负责任务组长黄抒鸿博客撰写,游戏规则的制定,碰撞检测,爆炸特效的实现,随机事件的编写组员雷正伟前期调研,⾯向对象设计,窗体绘制,闪动问题的解决,键盘事件的编写3.项⽬功能架构图与主要功能流程图3.1项⽬功能架构图3.2主要功能流程图3.3⾯向对象类设计图4.功能详解4.1 窗体绘制及添加键盘事件4.1.1 创建窗⼝·创建类继承JFrame·创建启动⽅法launch()4.1.2 为窗⼝上⾊·重写paint()⽅法,设置图形颜⾊和⼤⼩4.1.3 添加选项⽂字4.1.4 为窗⼝添加键盘事件添加内部类,实现KeyAdapter类,重写keyPressed⽅法,写⼊键盘事件,1选择单⼈模式,2选择双⼈模式窗⼝添加键盘监视器添加指针图⽚在项⽬⽂件夹下创建⽂件夹images,关于项⽬的图⽚,插件都放在这个⽂件夹内创建图⽚对象在launch()⽅法中重绘图形4.2双缓冲解决闪动问题创建⼀个图⽚Image offScreemImage = null;重写paint()⽅法创建⼀个和弹出窗⼝宽⾼相同的图⽚,获取该图⽚的图形对象,把所有内容添加到该图⽚中//创建和容器⼀样⼤⼩的Image图⽚if(offScreemImage == null) {offScreemImage = this.createImage(width,height);}//获的该图⽚的图形Graphics gImage = offScreemImage.getGraphics();gImage.setColor(Color.GRAY);gImage.fillRect(0, 0, width, height);//添加游戏选项gImage.setColor(Color.BLUE);gImage.setFont(new Font("仿宋", Font.BOLD, 50));if (state == 0 ) {gImage.drawString("选择游戏模式", 220, 100);gImage.drawString("单⼈模式", 220, 200);gImage.drawString("双⼈模式", 220, 300);//绘制指针gImage.drawImage(select, 160, y, null);} else if (state ==1 || state ==2) {gImage.drawString("游戏开始", 220, 100);if (state ==1) {gImage.drawString("单⼈模式", 220, 200);} else if(state ==2) {gImage.drawString("双⼈模式", 220, 200);}}4.3⾯向对象设计游戏⽗类:坦克类:玩家⼀和玩家⼆玩家2和玩家1的⽅法都是⼀样的,只需要修改键盘事件。
class f extends JFrame {f(String title) {(title) ;(608 , 630) ;(300 , 100) ;;MyTank mp = new MyTank() ; (mp) ;(mp) ;new Thread(mp).start() ;}public static void main(String[] args) { f h = new f("坦克大战(版本") ; (true) ;}}//主战坦克class MyTank extends JPanel implements KeyListener , Runnable { int x = 280, y = 280 ;//坦克的初始位置int op = 1 ;//坦克的移动方向int color = 0 ;int tankspeed = 8 ;//坦克的速度int tankbullet = 8 ;//坦克的子弹速度int tankfbullet = 4 ;//敌军的子弹速度int shengming = 100 ;//生命int fenshu = 0 ;int nandu = 5 ; //设置游戏难度//子弹int dx = 295 , dy = 295 ;int dx1 = 295 , dy1 = -10 ;int dx2 = 600 , dy2 = 295 ;int dx3 = 295 , dy3 = 600 ;int dx4 = -10 , dy4 = 295 ;//敌军坦克int num = 10 ;//敌军坦克数量,不能修改int[] xf = new int[num] ;int[] yf = new int[num] ;int[] opf = new int[num] ;int[] dxf = new int[num] ;int[] dyf = new int[num] ;int[] dxf1 = new int[num] ;int[] dyf1 = new int[num] ;int[] dxf2 = new int[num] ;int[] dyf2 = new int[num] ;int[] dxf3 = new int[num] ;int[] dyf3 = new int[num] ;int[] dxf4 = new int[num] ;int[] dyf4 = new int[num] ;//构造函数,初始化敌军坦克的位置和状态MyTank() {for (int i = 0; i<num; i++) {xf[i] = (int) () * 560) ;yf[i] = (int) () * 560) ;dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}for (int i = 0; i<num; i++) {dxf1[i] = 295 ; dyf1[i] = -10 ;dxf2[i] = 600 ; dyf2[i] = 295 ;dxf3[i] = 295 ; dyf3[i] = 600 ;dxf4[i] = -10 ; dyf4[i] = 295 ;}}//主面版public void paint(Graphics g) { (g) ;;;("生命:" , 10 , 20 ) ;(50 , 10 , shengming * 5 , 10) ;(50 , 10 , 500 , 10) ;("得分: "+ fenshu , 10 , 40) ; if(op == 1) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ; (x - 5 , y + 35 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ; ;(x + 15 , y - 20 , 10 , 40) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y + 30 , 10 , 10) ; (x + 25 , y + 30 , 10 , 10) ; }if(op == 2) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ; ;(x + 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x , y + 5 , 10 , 10) ;(x , y + 25 , 10 , 10) ;}if(op == 3) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ; (x - 5 , y + 35 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ; ;(x + 15 , y + 20 , 10 , 40) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y , 10 , 10) ;(x + 25 , y , 10 , 10) ;}if(op == 4) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ; ;(x - 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 30 , y + 5 , 10 , 10) ; (x + 30 , y + 25 , 10 , 10) ; };(dx , dy , 10 , 10) ;(dx1 , dy1 , 10 , 10) ; (dx2 , dy2 , 10 , 10) ; (dx3 , dy3 , 10 , 10) ; (dx4 , dy4 , 10 , 10) ;for (int i = 0; i<num; i++) { if(opf[i] == 1) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] - 20 , 10 , 40) ; (xf[i] + 5 , yf[i] + 30 , 10 , 10) ; (xf[i] + 25 , yf[i] + 30 , 10 , 10) ; }if(opf[i] == 2) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 20 , yf[i] + 15 , 40 , 10) ; (xf[i] , yf[i] + 5 , 10 , 10) ;(xf[i] , yf[i] + 25 , 10 , 10) ;}if(opf[i] == 3) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 20 , 10 , 40) ; (xf[i] + 5 , yf[i] , 10 , 10) ;(xf[i] + 25 , yf[i] , 10 , 10) ;}if(opf[i] == 4) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] - 20 , yf[i] + 15 , 40 , 10) ; (xf[i] + 30 , yf[i] + 5 , 10 , 10) ; (xf[i] + 30 , yf[i] + 25 , 10 , 10) ; }(dxf1[i] , dyf1[i] , 10 , 10 ) ;(dxf2[i] , dyf2[i] , 10 , 10 ) ;(dxf3[i] , dyf3[i] , 10 , 10 ) ;(dxf4[i] , dyf4[i] , 10 , 10 ) ;}}public void keyTyped(KeyEvent e) { }//键盘控制坦克的移动,发弹public void keyPressed(KeyEvent e) { color ++ ;if() == {op = 1 ;y = y - tankspeed ;dy = dy - tankspeed ;if(y <= 0) {y = y + tankspeed ;dy = dy + tankspeed ; }}if() == {op = 2 ;x = x + tankspeed ; dx = dx + tankspeed ; if(x >= 560) {x = x - tankspeed ; dx = dx - tankspeed ; }}if() == {op = 3 ;y = y + tankspeed ; dy = dy + tankspeed ;if(y >= 560) {y = y - tankspeed ; dy = dy - tankspeed ; }}if() == {op = 4 ;x = x - tankspeed ; dx = dx - tankspeed ; if(x <= 0) {x = x + tankspeed ; dx = dx + tankspeed ; }}if() == {if(op == 1) {dx1 = dx ; dy1 = dy ;}if(op == 2) {dx2 = dx ; dy2 = dy ;}if(op == 3) {dx3 = dx ; dy3 = dy ;}if(op == 4) {dx4 = dx ; dy4 = dy ;}}() ;}public void keyReleased(KeyEvent e) { }public void run() {for (int a = 0; a<60000; a++) {dy1 = dy1 - tankbullet ;dx2 = dx2 + tankbullet ;dy3 = dy3 + tankbullet ;dx4 = dx4 - tankbullet ;for (int i = 0; i<num; i++) {dyf1[i] = dyf1[i] - tankfbullet ;dxf2[i] = dxf2[i] + tankfbullet ;dyf3[i] = dyf3[i] + tankfbullet ;dxf4[i] = dxf4[i] - tankfbullet ;}//判断是否被击中for (int i = 0; i<num; i++) {if(dyf1[i]<y + 38 &&dyf1[i]>y +8 && dxf1[i]-x>-10 && dxf1[i]-x<40) { ("被1击中") ;dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf2[i]>x+2 &&dxf2[i]<x+32 &&dyf2[i] - y >-10 && dyf2[i] - y <40 ) { ("被2击中") ;dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ;shengming = shengming - nandu ;}if(dyf3[i]>y+2 && dyf3[i]< y+32 && dxf3[i]-x >-10&& dxf3[i]-x<40) { ("被3击中") ;dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf4[i]>x+8 &&dxf4[i]<x+38 &&dyf4[i] - y >-10 && dyf4[i] - y <40 ) { ("被4击中") ;dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ;shengming = shengming - nandu ;}}//判断是否击中敌军for (int i = 0; i<num; i++) {if(dy1<yf[i] + 38 &&dy1>yf[i] +8 && dx1-xf[i]>-10 && dx1-xf[i]<40) { ("1击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx2>xf[i]+2 &&dx2<xf[i]+32 &&dy2 - yf[i] >-10 && dy2 - yf[i] <40 ) { ("2击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dy3>yf[i]+2 && dy3< yf[i]+32 && dx3-xf[i] >-10&& dx3-xf[i]<40) { ("3击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx4>xf[i]+8 &&dx4<xf[i]+38 &&dy4 - yf[i] >-10 && dy4 - yf[i] <40 ) { ("4击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}//坦克的移动for (int i = 0; i<num; i++) { switch (opf[i]) {case 1:{yf[i]-- ;dyf[i] -- ;for (int s = 0; s<num; s++) { if(yf[i] <= 0) {yf[i] ++ ;dyf[i] ++ ;}}break;}case 2:{xf[i]++ ;dxf[i]++ ;for (int s = 0; s<num; s++) { if(xf[i] >= 560){xf[i] -- ;dxf[i] -- ;}}break;}case 3:{yf[i]++ ;dyf[i]++ ;for (int s = 0; s<num ; s++) { if(yf[i] >= 560){yf[i] -- ;dyf[i] -- ;}}break;}case 4:{xf[i]-- ;dxf[i]-- ;for (int s = 0; s<num; s++) { if(xf[i] <= 0){xf[i] ++ ;dxf[i] ++ ;}}break;}}}try{(20) ;}catch(Exception e) {() ;}//坦克的开火if(a % 50 == 5) {if()>{for (int i = 0; i<2; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 15) {if()> {for (int i = 2; i<4; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 25) {if()>{for (int i = 4; i<6; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;}if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 35) {if()>{for (int i = 6; i<8; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 45) {if()> {for (int i = 8; i<10; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}//坦克的随机移动if(a % 50 == 1 ) {for (int i = 0; i<2; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}if(a % 50 == 11 ) {//坦克的随机移动for (int i = 2; i<4; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {}else{opf[i] = 4 ;}}}}if(a % 50 == 31 ) {//坦克的随机移动for (int i = 6; i<8; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 41 ) {//坦克的随机移动for (int i = 8; i<10; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}//重画if(shengming<=0){//弹出player1胜利对话框(null,"你结束了","Game Over !", ; //结束游戏(0) ;}() ;}}}。
设计任务书课程名称:Java语言程序设计专业班级:学生姓名:学号:指导教师:坦克大战一、需求分析每个人都玩过坦克大战这个游戏,本程序完成的功能就是平时所玩的游戏中所实现的一些基本功能。
具体游戏要求 :1.能够四处移动2.能够打击敌人3.敌人能够移动4.能够模拟爆炸5.能够产生障碍6.能够增长生命二、程序架构方式 1工作流程2程序具体设计游戏开始初始化游戏元素根据游戏元素的属性,对其进行行操作和绘出其图形Paint ()战斗是否结束键盘监听器判断按下的是哪个键改变相应游戏元素的属性图形用户界面需要用到抽象窗口工具即AWT来设计实现。
坦克都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。
界面的构造在程序中由MyPanel类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。
由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。
界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新。
坦克主要由Tank类来实现。
坦克的属性:速度(有X轴和Y轴的速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。
所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。
在设计过程中,坦克出现的位置由坐标而定。
用户之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。
敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题。
坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。
Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。
JISHOU UNIVERSITY本科生毕业设计题目:基于java语言坦克大战游戏开发作者:学号:所属学院:信息科学与工程学院专业年级:指导教师:职称:完成时间:吉首大学教务处制目录基于java语言坦克大战游戏开发 (1)摘要 (1)Based on the development of Java language Tank Wars Game (2)第一章游戏简要说明 (3)第二章开发环境介绍 (4)2.1 开发环境 (4)2.2 java语言特点简介 (4)2.3 Eclipse开发工具的简介 (5)第三章系统总体设计 (6)3.1程序功能的总和 (6)3.2主体模块 (6)3.3子弹模块 (6)3.4坦克模块 (7)3.5 墙模块 (7)3.6血液模块 (7)3.7爆炸模块 (8)第四章游戏详细设计过程 (9)4.1创建游戏窗口 (9)4.2改变游戏背景颜色。
(11)4.3创建坦克 (11)4.4 让坦克动起来 (12)4.5改变窗口的大小 (13)4.6让坦克受控制 (14)4.7创建一个Tank类 (15)4.8让坦克向8个方向移动 (16)4.9修改4.8中所设计的不足 (18)4.10添加子弹类 (19)4.11根据己方坦克的位置,打出子弹 (21)4.12修改坦克停下来不能打出子弹的问题 (21)4.13让坦克能够打出多发子弹 (23)4.14解决炮弹不消亡和坦克出界的问题 (23)4.15增加敌方坦克 (24)4.16击毙出现的敌方坦克 (25)4.17加入爆炸效果 (26)4.18添加多辆敌方坦克 (27)4.19让敌方坦克智能化 (29)4.20建立游戏障碍物 (31)4.21阻止坦克互相穿越 (32)4.22为我方坦克添加大招和血条 (33)4.23添加血块 (34)4.24重新载入敌军或我军坦克 (35)4.25加入图片 (35)第五章游戏的可行性测试 (37)5.1游戏界面介绍 (37)5.2游戏运行测试 (40)第六章总结 (43)参考文献 (44)基于java语言坦克大战游戏开发摘要随着网络科技的不断发展,我们的生活出现了日新月异的变化,特别是在游戏这一块,出现了前所未有的繁荣,各种各样的游戏进入我们的生活,而当初的“俄罗斯方块”、“坦克大战”、“贪吃蛇”等这些经典中的经典的游戏曾被多少人所知,更是多少80后甚至90后常聊的话题。
基于java坦克大战游戏的设计采用了java语言面向对象的思想,在设计的过程中,游戏的所有物体都赋予对象的概念和属性。
本游戏的设计是在玩家进行游戏时,通过上下左右键来控制坦克,并且打出炮弹,以消灭所有敌人为游戏目的。
在游戏过程中,敌方的坦克也会智能化的躲避玩家打出来的子弹。
通过游戏的设计,是对java语言一个方便灵活运用的体现。
关键字:网络科技 java 面向对象智能化Based on the development of Java language Tank WarsGameAbstractWith the continuous development of network technology, the emergence of our life changes, especially in the game this piece, there has been an unprecedented prosperity, all kinds of games to enter our life, and the original "Tetris", "Tank Wars", "greedy eat snake" and other classic games have been many people know, is how many 80 or even 90 after the talk.Based on the design of the Java Tank Wars game using java language for the object of thought, in the process of design, the game of all objects are given the concept of the object and attribute. The game's design is in the game, the players, through the upper and lower keys to control the tank, and hit the shell, to destroy all the enemies for the purpose of the game. In the course of the game, the enem y's tanks will also be intelligent to escape the players to play out the bullet. Through the game design, is a convenient and flexible use of Java language.Keywords: network technology, Java, object-oriented, intelligent第一章游戏简要说明《坦克大战》作为曾经风靡全球的一款FC游戏,可谓是曾经经典中的经典,其极为出色的游戏性令全球众多玩家为之疯狂,更是多少80后甚至90后津津乐道的游戏之一。
《坦克大战》是一款以红白机为平台操作设计游戏。
玩家通过控制自己的坦克进行射击,以击毁敌方坦克为目的,每个关卡中有着不同的地形和障碍物,玩家可以利用地形中的障碍物进行射击,障碍物可以阻挡敌方的坦克的子弹,同时,也可以阻挡玩家自身打出来的子弹。
因此在游戏中,玩家要利用好地图中的障碍物,来保障自身的安全,以达到消灭敌军的目的。
在游戏中,还设置了有各种各样的补给。
游戏中坦克能向八个方向移动和开炮,并且坦克与坦克之间不可相互穿越。
坦克打出来的炮弹若击中对方,就会产生爆炸现象。
玩家的坦克不仅有生命值,而且还有生命个数,当玩家坦克遭到敌方坦克子弹的击打之后,玩家坦克的生命值就会减少,当玩家坦克的生命值减到0时,玩家的坦克就爆炸,同时也会减少一辆坦克数量,玩家也可以通过地图上随机出现的血块来增加自己的血量。
当玩家消灭所有的敌方坦克的时候,此时游戏结束;若玩家的坦克被打死,可以按F2键进行开始新的游戏。
其操作简单且娱乐性强,是一款男女老少皆宜的游戏。
游戏附带地图编辑器,玩家可自行编辑地图进行游戏。
游戏中的众多经典关卡至今还让许多玩家记忆犹新,在80年代时曾经在无数家庭中带来了无尽的欢乐。
第二章开发环境介绍2.1 开发环境操作系统:win8.1开发语言:java开发工具:Eclipse2.2 java语言特点简介(1)简单java语言的语法很简单,容易掌握,并且它是纯面向对象的语言。
Java 语言的简单性可以在下面几点体现出来:1.1语言的语法与C++很相似,从某种角度上说,java是C和C++转变来的,因此,学过C语言的人员可以很轻松的掌握java的语法。
1.2 java对C++语言进行了提高和简化。
如,java取消了指针,并且使用接口取代了多重继承,因指针和多重继承往往使程序变得复杂。
1.3 java提供了很多类库,API文档和第三方开发包,此外,还有丰富的基于java的开发项目,JDK已经开放源代码,学者可通过分析这些源代码,从而来提高自己的水平。
(2)面向对象面向对象是java语言的最重要的部分,同时也是java语言的基础部分,java语言本身就是一种纯面向对象的语言。
在Java语言中,提倡万物皆面向对象,语法中不能在类外面定义单独的数据和函数,简而言之,java语言最外部的函数类型是对象,所有的元素只能通过类和对象来访问。
(3)分布性Java语言的分布性包括操作分布和数据分布,操作分布是指在多个不同的主机上布置相关操作。
(4)可移植性Java语言程序具有与体系结构无关的特性,可以很方便的移植到不同型号的计算机中。
此外,java的类库中也实现了多不同平台的接口,使得这些类库可以移植。
(5)解释性Java语言程序的运行需要解释器。
任何移植了java解释器的计算机或者其他设备都可以用java字节码进行解释执行。
字节码独立于平台,他本身携带了许多编译时的信息,使得连接过程更加简单,开发过程更加迅速,更加具有探索性。
(6)安全性Java语言没有像C语言中的指针和内存释放等语法,可以有效避免非法操作内存,并且java代码要经过指针校验,代码校验等测试步骤才能运行,因此,可以很好的保护系统平台。
(7)健壮性java程序是以编写多方面的、可靠性的运用为目标的。
在编译运行时可以检查错误,消除错误。
能更好的帮助用户检测早期出现的错误。
(8)多线程多线程机制能够让程序在同一个时间点同时运行多个任务,同时相应的同步机制可以保证不同线程能够正确的共享数据。
(9)高性能java编译后的字节码是在解释器中运行的,因此它的速度比多数交互式运用程序提高了许多,此外,字节码可以在程序运行时被翻译成特定平台的机器指令,从而实现运行速度的提高。
(10)动态java语言在很多方面比C或C++更能适应发展的环境,可以动态调整库中的方法和增加变量,而客户端却不需要任何更改。
在java中进行动态调整是非常简单和直接的。
2.3 Eclipse开发工具的简介Eclipse是由IBM公司投资4000万美元开发的集成开发工具。
它是基于java语言编写,并且是开放源代码的、可扩展的,也是目前全球最流行、使用最多的java开发工具之一。
另外,IBM公司捐出Eclipse源代码,组建Eclipse联盟,它专门负责这种工具的后续开发。
Eclipse为程序员提供了很好的java程序开发环境,它的平台系统结构是在插件概念的基础上构建起来的,插件是Eclipse平台最具有特色的特征,同时也是区别于其他开发工具的特征之一。
第三章系统总体设计3.1程序功能的总和表(1)程序表的功能3.2主体模块主体是由TankClient.java文件来实现的,主要负责各个类的调用和游戏窗口的创建。
该类中的变量还有:1.游戏的高度 int GAME_HEIGHT2.游戏的宽度 int GAME_WIDTH此外,lauchFrame( )方法、paint( )方法和update( )方法也包括在该类中,其功能分别为实现显示坦克主窗口、重画时调用和使用双缓冲消除闪烁现象。