本章概述:本章主要讲了

1、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移。

2、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用。

3、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的。

4、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来。

5、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来

目录

本章概述:

一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移

1、TankFrame

2、Dir

二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

1、TankFrame

2、Tank

三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的

1、TankFrame

2、Tank

四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来

1、TankFrame

2、Tank

3、Bullet

五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来

1、TankFrame

2、Tank

运行效果


本章概述:

一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移

1、TankFrame

package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {int x = 200,y=200;Dir dir = Dir.DOWN;static final int SPEED = 10;public TankFrame(){
@ -33,10 +35,25 @@ public class TankFrame extends Frame {@Overridepublic void paint(Graphics g) {
//        System.out.println("paint");g.fillRect(x,y,50,50);
//        x += 10;
//        y += 50;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}class MyListener extends KeyAdapter{
@ -47,7 +64,6 @@ public class TankFrame extends Frame {boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {
//            System.out.println("pressed");int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -65,11 +81,40 @@ public class TankFrame extends Frame {default:break;}setMainTankDir();}@Overridepublic void keyReleased(KeyEvent e) {
//            System.out.println("released");int key = e.getKeyCode();switch(key){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;default:break;}setMainTankDir();}private void setMainTankDir() {if(bL)  dir = Dir.LEFT;if(bU)  dir = Dir.UP;if(bR)  dir = Dir.RIGHT;if(bD)  dir = Dir.DOWN;}}}

2、Dir

public enum Dir {LEFT,UP,RIGHT,DOWN
}

二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

1、TankFrame

package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {int x = 200,y=200;Dir dir = Dir.DOWN;static final int SPEED = 10;Tank myTank = new Tank(200,200,Dir.DOWN);public TankFrame(){setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {@Overridepublic void paint(Graphics g) {g.fillRect(x,y,50,50);switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}myTank.paint(g);}@ -109,13 +90,13 @@}private void setMainTankDir() {if(bL)  dir = Dir.LEFT;if(bU)  dir = Dir.UP;if(bR)  dir = Dir.RIGHT;if(bD)  dir = Dir.DOWN;if(bL)  myTank.setDir(Dir.LEFT);if(bU)  myTank.setDir(Dir.UP);if(bR)  myTank.setDir(Dir.RIGHT);if(bD)  myTank.setDir(Dir.DOWN);}}}

2、Tank

package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){g.fillRect(x,y,50,50);move();}public void move(){switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}

三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的

1、TankFrame

package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);public TankFrame(){setTitle("tank war");setSize(800,600);setResizable(false);setVisible(true);this.addKeyListener(new MyListener());addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}@Overridepublic void paint(Graphics g) {myTank.paint(g);}class MyListener extends KeyAdapter{boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {myTank.setMoving(true);int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@if(bU)  myTank.setDir(Dir.UP);if(bR)  myTank.setDir(Dir.RIGHT);if(bD)  myTank.setDir(Dir.DOWN);if(!bL && !bU && !bR && !bD) myTank.setMoving(false);}}}

2、Tank

package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;private boolean moving = false;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}
@ -29,24 +39,26 @@}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}

四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来

1、TankFrame

package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);Bullet b = new Bullet(300,300,Dir.DOWN);public TankFrame(){setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {setResizable(false);setVisible(true);this.addKeyListener(new MyListener());this.addKeyListener(new MyKeyListener());addWindowListener(new WindowAdapter() {@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {public void paint(Graphics g) {myTank.paint(g);b.paint(g);}class MyListener extends KeyAdapter{class MyKeyListener extends KeyAdapter{boolean bL = false;boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {myTank.setMoving(true);int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {}private void setMainTankDir() {if(bL)  myTank.setDir(Dir.LEFT);if(bU)  myTank.setDir(Dir.UP);if(bR)  myTank.setDir(Dir.RIGHT);if(bD)  myTank.setDir(Dir.DOWN);if(!bL && !bU && !bR && !bD) myTank.setMoving(false);else {myTank.setMoving(true);if (bL) myTank.setDir(Dir.LEFT);if (bU) myTank.setDir(Dir.UP);if (bR) myTank.setDir(Dir.RIGHT);if (bD) myTank.setDir(Dir.DOWN);}}}}

2、Tank

package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;private static final int SPEED = 5;private boolean moving = false;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){g.fillRect(x,y,50,50);move();}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}

3、Bullet

package com.tencent.tank;import java.awt.*;public class Bullet {private int x,y;private static final int SPEED = 1;private Dir dir;static final int WIDTH = 30,HEIGHT = 30;public Bullet(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public void paint(Graphics g){Color c = g.getColor();g.setColor(Color.RED);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);move();}public void move(){switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}

五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来

1、TankFrame

package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);Tank myTank = new Tank(200,200,Dir.DOWN,this);Bullet b = new Bullet(300,300,Dir.DOWN);static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;public TankFrame(){setTitle("tank war");setSize(GAME_WIDTH,GAME_HEIGHT);setResizable(false);setVisible(true);this.addKeyListener(new MyKeyListener());addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}Image offScreenImage = null;@Overridepublic void update(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);}Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.BLACK);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);}@Overridepublic void paint(Graphics g) {myTank.paint(g);b.paint(g);}class MyKeyListener extends KeyAdapter{boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;@Overridepublic 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;case KeyEvent.VK_SPACE:myTank.fire();break;default:break;}setMainTankDir();}@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch(key){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;default:break;}setMainTankDir();}private void setMainTankDir() {if(!bL && !bU && !bR && !bD) myTank.setMoving(false);else {myTank.setMoving(true);if (bL) myTank.setDir(Dir.LEFT);if (bU) myTank.setDir(Dir.UP);if (bR) myTank.setDir(Dir.RIGHT);if (bD) myTank.setDir(Dir.DOWN);}}}}

2、Tank

 package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 5;private boolean moving = false;public Tank(int x,int y,Dir dir){TankFrame tf = null;public Tank(int x,int y,Dir dir,TankFrame tf){this.x = x;this.y = y;this.dir = dir;this.tf = tf;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){Color c = g.getColor();g.setColor(Color.BLUE);g.fillRect(x,y,50,50);g.setColor(c);move();}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}public void fire() {tf.b = new Bullet(this.x,this.y,this.dir);}
}

运行效果

【0基础学java】教学日志:项目实战-坦克大战-3相关推荐

  1. 【0基础学java】教学日志:javaSE-面向对象6-面向对象前4章上机作业点评,主要涉及继承、封装、多态三个章节的内容

    目录 一.面向对象第一章上机作业参考答案(略) 二.面向对象第二章上机作业参考答案: 三.面向对象第三章上机作业参考答案: 1.上机练习1已在第三章博客中编写,请参考: 2.上机练习2 四.面向对象第 ...

  2. 0基础学Java需要多久?

    0基础学Java需要多久?黑马程序员零基础系统学习的Java课程课时348小时,至少要学习5-6个月的时间,不同的课程大纲课时也不一样,具体课看课程的详情:Java基础课程课时在5-20小时不等,根据 ...

  3. 0基础学java有多难?自学Java和参加培训学Java的难易度对比分析!

    在一些知识问答平台上,我看到有很多在问"0基础学java有多难",如果你想0基础自学Java那可能会比较困难,但是如果选择报培训班进行学习,即便是0基础,学Java其实也并不难.所 ...

  4. 0基础学java可行吗_零基础可以学习JAVA吗?

    肯定是可以学的,每一个人做每一件事都是从0基础开始的,他们并不是生下来就会Java,会编程,都是通过后天的努力说得到的技能 你只需要找对方法,找对带你的人,你就可以学好 学习Java的方式有这几种: ...

  5. java用drawline画血条,Java小项目之坦克大战单机1.0版

    单机1.0版包括6个class文件: TankClient.java : 主要执行部分,项目的大管家 Tank.java : 实现Tank类,模拟坦克的运动 Missile.java : 实现Miss ...

  6. 0基础学web----小鲜项目搭建(拓展)

    01-CSS精灵-作用 02-CSS精灵-使用 <!DOCTYPE html> <html lang="en"> <head><meta ...

  7. 【0基础学java】教学日志:javaSE-面向对象6-接口、面向接口编程、内部类

    目录 本章概述: 一.为什么使用接口 1.Door.java 2.DoorBell.java 3.Lock.ja 二.接口的基本使用 1.Lock.java 2.LockDoor.java 3.Tes ...

  8. Java 项目实战 坦克大战 (0)--前言

    做了有一个星期了,java语言太强大了,也算是学得最认真的一门语言了,本次课设花的心思也就比较多了.关键总是追求完美总是想原创,最终做出来效果不错,但感觉代码逻辑很乱,今天开始就好好整理一番,以教程形 ...

  9. 【0基础学java】教学日志:javaSE--Stream API

    本章概述:本章主要讲了Stream特性,Stream运行机制,Stream的创建,Stream常用API,以及Stream API在实际应用开发中的作用 目录 本章概述: 一.annotation 1 ...

最新文章

  1. BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
  2. Django从理论到实战(part2)--virtualenvwrapper
  3. Java多线程编程递增_java多线程编程之简介
  4. iOS开发多线程-RunLoop
  5. 学java什么书好?推荐几本Java开发的书
  6. C/C++[1782 codeup] 谁是你的潜在朋友
  7. MongoDB以Windows服务安装
  8. html5期末大作业:基于HTML+CSS技术实现——传统手工艺术雕刻网站(3页)
  9. 软件测试人员能力模型
  10. ajax带token获得返回数据,jquery带token访问接口ajax
  11. android系统应用更改内存,安卓root后必备神器:修改系统/清理内存神器
  12. Missing parentheses in call to 'print'
  13. 数独算法c语言,数独求解算法C.
  14. # 公有云?私有云?混合云?多云?行业云?傻傻分不清楚(下篇)
  15. 170虚拟号码的正则表达式
  16. 电子商务系统的测试(十四)
  17. 台式计算机系统重新安装软件,教你台式机如何重装系统
  18. AcWing 913. 排队打水 (排序不等式)
  19. 苹果疯了,现在又开始坑支付宝!
  20. 结合实际聊聊防反接电路(防反接电路总结)

热门文章

  1. 安卓控件 - 列表视图
  2. [词语辨析] Try, Attempt, Endeavour “尝试” 的用法
  3. 从阿里 Weex 一窥移动技术发展之路
  4. 基于PHP排课系统设计与实现 开题报告
  5. gm 1 n 模型matlab,灰色预测模型GM1,n模型的matlab源...
  6. STRM--解决因配置Streams而在alert中出现的 ORA-02068错误
  7. 神威太湖之光超级计算机的运算速度是,“神威·太湖之光”运算速度到底有多快?...
  8. 什么才是好的手持产品?
  9. 2020 最好的Linux网络监控工具
  10. 生产计划自动排程目标是什么?