本文紧接上一篇讲解坦克大战这个项目,因为当初在学习的时候,是以这个案例逐步学习Java基础的,过程是先讲知识点,再将知识点逐步的融入到项目中,即给坦克添加新的功能。之前的Demo练习,想都记录下来。这里不会具体讲解知识点的概念,下面开始啦~

Demo1:Flie的基本用法

package com.fanghua1;

import java.io.*;

public class Demo1_9 {

    /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 创建一个文件对象(d:\\aa.txt是存在的)
File f = new File("d:\\aa.txt");
// 得到文件路径
System.out.println("文件的路径:" + f.getAbsolutePath());
// 得到文件的大小(字节大小)
System.out.println("文件的字节:" + f.length());
System.out.println("可读" + f.canRead()); // 创建文件和创建文件夹
File f2 = new File("d:\\222.txt");
// 先判断文件是否存在
if (!f2.exists()) {
// 可以创建
try {
f2.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("有文件,不能创建");
}
File f3 = new File("d:\\ff");
if (f3.isDirectory()) {
System.out.println("文件夹存在");
} else {
// 创建文件夹
f3.mkdir();
} // 列出文件夹下面的所有文件
File f4 = new File("d:\\MyJavaDemo");
if (f4.isDirectory()) {
File lists[] = f4.listFiles();
for (int i = 0; i < lists.length; i++) {
System.out.println("文件名:" + lists[i].getName());
}
} } }

Demo2:演示FileInputStream

package com.fanghua1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo1_11 {
public static void main(String[] args) {
File f = new File("d:\\aa.txt");
FileInputStream fis = null;
byte bytes[] = new byte[1024];
int n = 0;
try {
fis = new FileInputStream(f);
try {
while ((n = fis.read(bytes)) != -1) {
String s = new String(bytes, 0, n);
System.out.println(s);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Demo3:演示FileOutputStream

package com.fanghua1;

import java.io.*;
public class Demo2_1 {
public static void main(String[] args) {
// 这里:File f=new File("d:\\ss.text");
// 如果d:\\ss.text不存在,它会直接创建这个文件
// 如果存在,会进行覆盖。所以一定一定要进行判断
File f = new File("d:\\ss.text");
// 字节输出流
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f);
// \r\n:表示换行
String s = "我的第一个字节输出流文件,文本内容\r\n";
String s1 = "我是上一句的下一行"; fos.write(s.getBytes());
fos.write(s1.getBytes()); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

Demo4:演示图片的拷贝

package com.fanghua1;

import java.io.*;

public class Demo2_2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub // 思路:先把图片读入到内存--->写入到某个文件
// 因为是二进制文件,因策只能用字节流完成
//可以不用File f=new File("c:\\a.jpg");下面直接把c:\\a.jpg给FileInoutStream即可
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("c:\\a.jpg");
fos = new FileOutputStream("d:\\a.jpg");// 这里a.jpg,你写什么就命名为什么 byte buf[] = new byte[512]; // 512 是1024的一半
int n = 0;// 记录实际读取到的字节数
// 循环读取
while ((n= fis.read(buf)) != -1) {
//输出到指定文件,验证:没有这句话在d盘会创建0字节的a.jpg文件
fos.write(buf);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

Demo5:演示BufferedReader

package com.fanghua1;

import java.io.*;

public class Demo2_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 不是这里:FileReader f=new FileReader("d:\\MyJavaDemo\\Demo6.java");
BufferedReader br = null;
BufferedWriter bw = null;
try {
FileReader f = new FileReader("d:\\MyJavaDemo\\Demo6.java");
br = new BufferedReader(f);
// 创建FileWriter对象
FileWriter fw = new FileWriter("e:\\赵云.txt");
bw = new BufferedWriter(fw);
// 循环读取
String s = "";
while ((s = br.readLine()) != null) {
// 输出到磁盘(+"\r\n"换行)
bw.write(s + "\r\n");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

坦克大战(1.2版本)(#^.^#)

1.Menbers类

package com.fanghua2;
/**
* 从Menbers.java里分离出来,代表坦克的功能类(同包访问机制)
* 目的:减少Menbers.java文件的长度,整洁、规范
*/ //坦克类
class Tank1_2 { int x = 0;
int y = 0; // 坦克方向:0表示上,1表示右,2表示下,3表示左
int direct = 0;
int speed = 1;
//坦克的颜色
int color; public int getColor() {
return color;
} public void setColor(int color) {
this.color = color;
} public int getSpeed() {
return speed;
} public void setSpeed(int speed) {
this.speed = speed;
} public int getDirect() {
return direct;
} public void setDirect(int direct) {
this.direct = direct;
} 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 Tank1_2(int x, int y) {
this.x = x;
this.y = y; } }
//敌人的坦克
class EnemyTank extends Tank1_2{ public EnemyTank(int x, int y) {
super(x, y);
// TODO Auto-generated constructor stub
}
} //我的坦克
class Hero1_2 extends Tank1_2 {
public Hero1_2(int x, int y) {
super(x, y);
} public void moveUp() {
y -= speed;
}
public void moveRight() {
x += speed;
}
public void moveDown() {
y += speed;
}
public void moveLeft() {
x -= speed;
}
}

2.MyTankGame1_3类

/*
* 删掉很多之前的注释
* 功能:画出坦克1.2版本
* 坦克移动的时候,头尾相应进行更正
* 学习:文件(类)剥离、线程
*/
package com.fanghua2; import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Vector; import javax.swing.*; public class MyTankGame1_3 extends JFrame { Mypanel1_2 mp = null; public static void main(String[] args) {
new MyTankGame1_3();
} // 构造函数
public MyTankGame1_3() {
mp = new Mypanel1_2();
this.add(mp);
// 注册监听
this.addKeyListener(mp); this.setSize(600, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true); }
} // 我的面板
class Mypanel1_2 extends JPanel implements java.awt.event.KeyListener { // 定义我的坦克
Hero1_2 hero = null;
// 定义敌人的坦克(不止一辆,线程安全,集合)
Vector<EnemyTank> ets = new Vector<EnemyTank>();
int enSize = 3;// 敌人坦克保持三个 // 构造函数
public Mypanel1_2() {
hero = new Hero1_2(10, 10);
for (int i = 0; i < enSize; i++) { // 创建一辆敌人的坦克
EnemyTank et = new EnemyTank((i + 1) * 50, 0);
et.setColor(0);
//坦克默认反向是0(向上),这里改一下
et.setDirect(2);
// 加入
ets.add(et); }
} // 重写paint函数
public void paint(Graphics g) {
// 一定要调用
super.paint(g);
g.fillRect(0, 0, 600, 500);
// 画出自己的坦克(将方向填进去)
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
// 画出敌人的坦克(这里不用 i<enSize,而用ets.size,敌人坦克会被打死)
for (int i = 0; i < enSize; i++) {
this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i)
.getDirect(), 0); } } // 画出坦克的函数
public void drawTank(int x, int y, Graphics g, int direct, int type) {
// 坦克类型
switch (type) {
case 0:
g.setColor(Color.green);
break;
case 1:
g.setColor(Color.yellow);
break;
}
// 方向设置
switch (direct) {
// 向上
case 0:
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x + 15, y, 5, 30, false);
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
g.drawLine(x + 10, y + 15, x + 10, y);
break;
// 向右
case 1:
g.fill3DRect(x, y, 30, 5, false);
g.fill3DRect(x, y + 15, 30, 5, false);
g.fill3DRect(x + 5, y + 5, 20, 10, false);
g.fillOval(x + 10, y + 5, 10, 10);
g.drawLine(x + 15, y + 10, x + 30, y + 10);
break;
// 向下
case 2:
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x + 15, y, 5, 30, false);
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
g.drawLine(x + 10, y + 15, x + 10, y + 30);
break;
// 向左
case 3:
g.fill3DRect(x, y, 30, 5, false);
g.fill3DRect(x, y + 15, 30, 5, false);
g.fill3DRect(x + 5, y + 5, 20, 10, false);
g.fillOval(x + 10, y + 5, 10, 10);
g.drawLine(x + 15, y + 10, x, y + 10);
break;
} } @Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub } @Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
// 已更正为顺时针
if (e.getKeyCode() == KeyEvent.VK_UP
|| e.getKeyCode() == KeyEvent.VK_W) {
this.hero.moveUp();
this.hero.setDirect(0);
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT
|| e.getKeyCode() == KeyEvent.VK_D) {
this.hero.setDirect(1);
this.hero.moveRight();
} else if (e.getKeyCode() == KeyEvent.VK_DOWN
|| e.getKeyCode() == KeyEvent.VK_S) {
this.hero.moveDown();
this.hero.setDirect(2);
} else if (e.getKeyCode() == KeyEvent.VK_LEFT
|| e.getKeyCode() == KeyEvent.VK_A) {
this.hero.moveLeft();
this.hero.setDirect(3);
}
this.repaint();
} @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub }
}

此时,我的坦克已经可以用键盘来操控:

Java坦克大战(二)的更多相关文章

  1. Java坦克大战 (二) 之画一个能动的圆圈代表坦克

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  2. Java坦克大战(四)

    这是我的坦克游戏大战的最后一版,里面添加很多新的功能.这个坦克大战的有很多不足之处,但是对于初学者来说依然是一个很好的练习项目,从中我们可以学习Java基础知识,将知识与项目结合,学习面向对象编程思想 ...

  3. Java坦克大战(三)

    关于这个坦克大战的项目是在学习Java基础的时候,拿来练习的最近看到这些代码,感觉很亲切,就把他们都复制下来,编辑成博客.回首看去,Java基础的学习确实应该建立在找项目练习上,这样才能将学到的基础知 ...

  4. Java坦克大战(一)

    接下来的几篇博客,想记录一下通过学习坦克大战项目来循序渐进的学习Java基础.主要是为了巩固基础知识,当然学习编程重要的还是多敲,问题通常是在敲代码的过程中发现的,积累也是在敲代码中寻求的经验.这个坦 ...

  5. Java坦克大战 (七) 之图片版

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  6. Java坦克大战 (六) 之增加可玩性

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  7. Java坦克大战 (五) 之产生敌方坦克和爆炸效果

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  8. Java坦克大战 (四) 之子弹的产生

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  9. Java坦克大战 (三) 之可完全控制坦克朝八个方向运动

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

随机推荐

  1. 独一无二 hortonworks spark 源码编译教程

    hortonworks的源码在github上能找到! https://github.com/hortonworks/spark2-release 找到对应版本release源码后下载到本地 在wind ...

  2. 小程序json字符串转为对象

    小程序里json字符串转为对象使用JSON.parse()方法转变无效, 看报错提示有单引号“ ' ” 因为单引号而无效, 将单引号全改双引号即可. 报错如下: VM11050:1 thirdScri ...

  3. 01-jQuery的介绍

    1.为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. 书写很繁琐,代码量多. 代 ...

  4. EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作

    EF6 学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习 ...

  5. cobub razor 安装及使用

    server端安装及配置 apache2 + Mysql5.7 + php7 + redis 参见:http://docs.cobub.com/pages/viewpage.action?pageId ...

  6. 基于ε-NFA的正则表达式引擎

    正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲 ...

  7. iOS 不能加载电子签名

    问题: 1:使用WKWebView在iOS12.0以上的系统中,可以显示PDF中的电子图章,签名.在iOS12.0以下的系统中不能显示电子签名,图章. 2:  解决方案,使用PDF.js加载. pdf ...

  8. 不需要 root 权限的 ping

    https://blog.lilydjwg.me/2013/10/29/non-privileged-icmp-ping.41390.html https://stackoverflow.com/qu ...

  9. axios的Get和Post方法封装及Node后端接收数据

    最近有做一个Vue的小项目,其中用到了尤大大推荐使用的axios,但是使用的过程中遇到了各种各样的问题,所以这次也是将一些心得分享出来. 安装的流程我就简单说一下下吧,在一个自己新建的文件夹中命令行中 ...

  10. 使用node.js + json-server + mock.js 搭建本地开发mock数据服务

    在开发过程中,前后端不论是否分离,接口多半是滞后于页面开发的.所以建立一个REST风格的API接口,给前端页面提供虚拟的数据,是非常有必要的.对比过多种mock工具后,我最终选择了使用 json se ...