`
zhuozhuobeauty
  • 浏览: 18641 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

IO流之五子棋进度的保存

    博客分类:
  • java
阅读更多

1.java异常机制

Java异常(Exception)又称例外,是一种运行时错误。Java异常机制就是对于Java异常的处理方法,使用Java异常机制能提升程序的容错性,从而使程序更加健壮与安全。

异常的分类:

1.异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception.

2. Error和RuntimeException及其子类称为未检查异常(unchecked),其它异常称为已检查异常(checked)。

 

Error类描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。

 

RuntimeException包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。

 

JAVA中常见的几种异常:算术异常类(ArithmeticException),空指针异常类(NullPointerException),输入输出异常类(IOException),数组下标越界异常类(ArrayIndexOutOfBoundsException)、类型转换异常类(ClassCastException),数字格式异常(NumberFormatException)等。

 

Java中常有如下三种异常处理方法:

1.使用try-catch-finally语句。try语句块放置可能发生异常的代码,catch语句块捕获这些代码产生的异常,finally语句块无论程序是否有异常发生,都会执行。

2.使用throws关键字抛出异常。若某个方法可能发生异常,但不想在当前方法中处理这个异常,那就可以利用throws关键字在该方法抛出异常,然后在调用该方法的代码中捕获该异常进行处理。

3.自定义异常类与throw关键字

关于自定义异常类的使用,分为如下几个步骤:

1)创建自定义异常类,利用继承思想

2)在方法中通过throw关键字抛出异常对象

3)若在当前抛出异常的方法中处理,使用第一种方法,否则使用第二种方法。

**throw和throws的区别

区别一:
             throw 是语句抛出一个异常;throws 是方法抛出一个异常; 
              throw语法:throw <异常对象> 
              在方法声明中,添加throws子句表示该方法将抛出异常。 
             throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>] 
             其中:异常类可以声明多个,用逗号分割。 
区别二:
          throws可以单独使用,但throw不能; 
区别三:
            throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。  
throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些个异常,方法的调用者可能要处理这些异常。而这些异常E1,E2,E3可能是该函数体产生的。 而throw是明确之处这个地方要抛出这个异常。 void doA() throws Exception1, Exception3 {   try {     ……
  } catch(Exception1 e) {     throw e;
  } catch(Exception2 e) {
    System.out.println("出错了");   }
  if (a != b)
    throw new Exception3("自定义异常"); }

2.实现五子棋进度的保存

感谢队友王小二的大力支持~~

保存进度,其实就是把我们所画的图形存到文件中。因此,我们需要一个文件打开和一个文件写入的方法,当然要实现保存,必须将保存与一个按钮,及其监听器相互绑定起来。

下面又是代码时间~~这次让我们先从主函数开始

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Chesstry extends JPanel {
	String fileName = "F:/五子棋.txt";
	Test test = new Test();
	private int Longer;
	List<Chess> list = new ArrayList();
	Graphics g;
	ChessListener cl;

	public static void main(String[] args) {
		// 实例化一个面板对象
		Chesstry cb = new Chesstry();
		cb.Beautiful();
	}

	// 写一个设置棋盘的方法
	public void Beautiful() {
		JFrame jf = new JFrame();
		jf.setSize(600, 620);
		jf.setTitle("五子棋");
		jf.setLocationRelativeTo(null);
		JPanel eastJpanel = new JPanel();
		// 设置东边的布局的颜色
		eastJpanel.setBackground(new Color(227, 160, 200));
		// 设置东边的大小
		eastJpanel.setPreferredSize(new Dimension(100, 0));
		jf.add(eastJpanel, BorderLayout.EAST);
		// 在东边添加两个按钮
		JButton jb1 = new JButton("开始");
		JButton jb2 = new JButton("退出");
		JButton jb3 = new JButton("黑子先手");
		JButton jb4 = new JButton("白子先手");
		JButton jb5 = new JButton("保存");
		JButton jb6 = new JButton("打开");
		// 将按钮加到面板上
		eastJpanel.add(jb1);
		eastJpanel.add(jb2);
		eastJpanel.add(jb3);
		eastJpanel.add(jb4);
		eastJpanel.add(jb5);
		eastJpanel.add(jb6);
		// 给按钮添加监听器
		//匿名内部类
		jb1.addActionListener(new ActionListener() {
        
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("开始")) {
					test.setB1("1");
					System.out.println("          " + test.getB1());
				}
			}
		});
		
		jb2.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("退出")) {
					
					int i = JOptionPane.showConfirmDialog(null, "请点击关闭按钮退出程序");
					if (i == 0) {
						System.exit(0);
					}
				}
			}
		});
		
		jb3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("黑子先手")) {
					test.setB3("1");
				}

			}
		});
		
		jb4.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("白子先手")) {
					test.setB3("-1");
				}

			}
		});
		
		jb5.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("保存"))
					;
				try {
					// 调用写入方法
					write(fileName);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		});
		
		jb6.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("打开")) {
					try {
						// 调用读取文件的方法
						open(fileName);
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
				}
			}
		});
		// 设置棋盘的颜色
		this.setBackground(Color.PINK);
		jf.add(this, BorderLayout.CENTER);
		jf.setVisible(true);
		g = jf.getGraphics();
		// 获取绘画的图形
		Graphics g = this.getGraphics();
		// 实例化一个ChessLIstener类的监听对象
		// ChessListener cl = new ChessListener(g,b1, b2,b3,b4);
		ButtonListener c2 = new ButtonListener(jb3, jb4);
		// 给事件源棋盘面板添加鼠标监听器方法,绑定事件处理类的对象
		cl = new ChessListener(g, test, list);
		this.addMouseListener(cl);
		// 绘制棋盘
		jf.setDefaultCloseOperation(3);
	}

	// 重绘操作,重写重绘方法
	public void paint(Graphics g) {
		super.paint(g);
		drawChessTable(g);
	}

	// 绘制棋盘
	private void drawChessTable(Graphics g) {
		for (int i = 0; i < Config.ROW; i++) {
			g.drawLine(i * Config.SIZE + Config.X, Config.Y, i * Config.SIZE
					+ Config.X, Config.Y + (Config.COLUMN - 1) * Config.SIZE);
		}
		for (int i = 0; i < Config.COLUMN; i++) {
			g.drawLine(Config.X, i * Config.SIZE + Config.Y, Config.X
					+ (Config.ROW - 1) * Config.SIZE, i * Config.SIZE
					+ Config.Y);
		}
	}
     //写一个写入方法,将数据保存到文件里面
	public boolean write(String fileName) throws IOException {
		this.list = cl.list;
	     //写入对象
		FileOutputStream fos = new FileOutputStream(fileName);
		ObjectOutputStream out = new ObjectOutputStream(fos);
		// 写入队列的长度
		DataOutputStream dos = new DataOutputStream(fos);
		//writeInt方法,将棋子个数写入文件中
		dos.writeInt(list.size());
		for (int i = 0; i < list.size(); i++) {
			Chess chess = list.get(i);
			out.writeObject(chess);
//			System.out.println("aaaaaaaaaaa");
			out.flush();
		}
		//写完文件后关闭文件
		dos.close();
		out.close();
		return true;
	}
        //定义一个打开文件的方法
	public boolean open(String fileName) throws IOException,ClassNotFoundException {
		// for (int i = 0; i < list.size(); i++) {
		FileInputStream fis = new FileInputStream(fileName);
		ObjectInputStream input = new ObjectInputStream(fis);
		//首先读取原来队列的长度,即对象的个数
		DataInputStream  dis = new DataInputStream(fis);
		int listSize = dis.readInt();
		for (int i = 0; i <listSize; i++) {
			//强制转型,读出对象
			Chess chess = (Chess) input.readObject();
			//判断并设置画布的颜色
			if(chess.getColor()==1){
				g.setColor(Color.black);
			}else{
				g.setColor(Color.WHITE);
			}
			System.out.println(chess.getI()+"ppppppppppppppp"+ chess.getJ());
			g.fillOval(chess.getI()+Config.CHESS_SIZE /4, chess.getJ()+Config.CHESS_SIZE ,
					Config.SIZE, Config.SIZE);
			// chess = (Chess) input.readObject();
		}
		//数据读取完毕,关闭文件
		dis.close();
		input.close();
		return true;
	}
}

 


 接下来是棋子监听器

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JOptionPane;

public class ChessListener extends MouseAdapter {
	private Graphics g;
	private int b3=0;// 判断黑白棋的依据
	private Win win = new Win();
	List<Chess> list;
	int longer = 0;
	int count = 0;// 保证黑白子交替出现
	int flag = 0;

	Test test;

	public ChessListener(Graphics g, Test test, List<Chess> list) {
		// TODO Auto-generated constructor stub
		this.g = g;
		this.test = test;
		this.list = list;
		
		System.out.println(test.getB1() + "b2::::::::" + test.getB2());
	}

	public void mouseReleased(MouseEvent e) {
		// System.out.println("222222222222 here b1 is: "+test.getB1());
		if (test.getB1().equals("1")) {
			int x1 = e.getX();// 得到坐标
			int y1 = e.getY();
//			System.out.println(x1+"           "+y1);
			for (int i = 0; i < Config.ROW; i++) {
				for (int j = 0; j < Config.COLUMN; j++) {
					// 判断此点是否已经被落子
					if (Config.array[i][j] == 0) {
						// 得到当前的坐标
						int x = Config.X + Config.CHESS_SIZE * i
								- Config.CHESS_SIZE / 2;
						int y = Config.Y + Config.CHESS_SIZE * j
								- Config.CHESS_SIZE / 2;
						if (x1 > (Config.X + Config.CHESS_SIZE * i - Config.CHESS_SIZE / 3)
								// 如果在三分之一范围内就落子
								&& x1 < (Config.X + Config.CHESS_SIZE * i + Config.CHESS_SIZE / 3)
								&& y1 > (Config.Y + Config.CHESS_SIZE * j - Config.CHESS_SIZE / 3)
								&& y1 < (Config.Y + Config.CHESS_SIZE * j + Config.CHESS_SIZE / 3)) {
							// 下黑子
							if (count == 0) {
								g.setColor(Color.black);
								count++;
								b3 = 1;
							} else {
								// 下白子
								g.setColor(Color.WHITE);
								count--;
								b3 = -1;
							}				
							g.fillOval(x, y, Config.CHESS_SIZE,
									Config.CHESS_SIZE);
							Chess chess = new Chess(x, y, b3);// 实例化一个棋子对象,存储当前的坐标及颜色
							System.out.println(x+"oooooo"+y);
							// 将该棋子对象存到队列里面去
							list.add(chess);
							Config.array[i][j] = b3;
							if (win.validater(i, j)) {
								if (b3 == 1) {
									JOptionPane.showMessageDialog(null,
											"恭喜,黑棋胜利!");
									test.setB1("0");
									for (int i1 = 0; i1 < Config.ROW; i1++) {
										for (int j1 = 0; j1 < Config.COLUMN; j1++) {
											Config.array[i1][j1] = 0;
										}
									}
								} else {
									JOptionPane.showMessageDialog(null,
											"恭喜,白棋胜利!");
									test.setB1("0");
									for (int i1 = 0; i1 < Config.ROW; i1++) {
										for (int j1 = 0; j1 < Config.COLUMN; j1++) {
											// Config.array[i][j]=0;
											Config.array[i1][j1] = 0;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

 

按钮监听器

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;

public class ButtonListener extends MouseAdapter{
	private JButton jb3,jb4;
	private Component a;
	public ButtonListener(JButton jb3,JButton jb4){
	
		this.jb3 = jb3;
		this.jb4 = jb4;
	}
	


	}

 

/**
 * 五子棋配置信息的接口
 *
 */
public interface Config {

	int X = 20;
	
	int Y = 20;
	
	int ROW = 16;
	
	int COLUMN = 16;
	
	int SIZE = 30;
	
	int CHESS_SIZE = 30;
	
	int  array[][] = new int[ROW][COLUMN];

	
	
}

 

反序列化棋子

//实例化一个棋子类可以用来反序列化棋子
import java.io.Serializable;

public class Chess implements Serializable {
private int i;
private int j;
private int Color;
public Chess(int i ,int j,int Color){
	this.i=i;
	this.j=j;
	this.Color=Color;
}
public int getI() {
	return i;
}
public void setI(int i) {
	this.i = i;
}
public int getJ() {
	return j;
}
public void setJ(int j) {
	this.j = j;
}
public int getColor() {
	return Color;
}
public void setColor(int color) {
	Color = color;
}
}

 

测试类

//用于测试按钮监听器是否奏效的测试类
public class Test {
	String b1="0", b2="0",b3="0",b4="0";

	public String getB1() {
		return b1;
	}

	public String getB2() {
		return b2;
	}

	public String getB3() {
		return b3;
	}
	public void setB1(String b1) {
		this.b1 = b1;
	}

	public void setB2(String b2) {
		this.b2 = b2;
	}

	public void setB3(String b3) {
		this.b3 = b3;
	}
}

 

备注:关于文件写入与输出的类

第一,ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。
第二,类 DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。


看一下效果图



 

  • 大小: 21.5 KB
分享到:
评论

相关推荐

    IO流、Xml解析

    IO流还包括输入流(Input Stream)、输出流(Output Stream)、缓冲流(Buffered Stream)、转换流(Converter Stream)以及对象流(Object Stream)等子类,它们各自有不同的功能和应用场景。例如,FileInputStream...

    IO流 javaio java 流

    Java中的IO流是Java核心库的重要组成部分,它用于在不同数据源之间传输数据。Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...

    Java-Io流,练习

    Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...

    java之io流实例

    - FilterInputStream和FilterOutputStream是过滤流,它们可以附加在其他流之上,增加额外的功能,比如校验和计算、数据压缩等。 6. 文件操作: - File类是Java处理文件的基础,提供了创建、删除、重命名文件以及...

    IO流--输入输出

    想了解IO输入输出流的学者可以看看,里面有详细的讲解及源代码。

    IO流宝典.pdf

    Java IO流是Java平台核心特性之一,用于处理输入和输出数据。这个概念是Java编程中的基石,对于任何涉及数据传输或文件操作的应用程序都至关重要。《IO流宝典》这本书全面深入地探讨了这一主题,旨在帮助读者从基础...

    IO流的主要流

    处理流则建立在其他流之上,提供额外的功能,如缓冲、转换、格式化等。 在实际开发中,我们通常会结合使用不同的流类型来构建复杂的流处理链,例如使用InputStreamReader包装InputStream,然后用BufferedReader...

    map集合以及IO流

    本文将深入探讨`Map`集合的特性和遍历方式,以及`Set`特性的排序,并介绍如何使用`IO流`,特别是字节流和字符流。 首先,我们来了解`Map`集合的基本概念。`Map`接口是Java集合框架的一部分,它不直接继承自`...

    IO流的思维导图

    本人是初学者,在老师的指导下,将自身对Java中IO流的理解做成以下思维导图

    基于arm-linux-gcc版本 文件IO项目 2048 五子棋项目

    本项目是基于第二阶段文件IO所学知识所编写的。 该项目分为4个模块,开机界面模块、电子相册模块、五子棋模块和2048小游戏模块 #使用说明 开机界面为3个按钮,分别为"PHOTO"电子相册按钮、"五子棋"五子棋按钮、...

    Java IO流总结

    Java IO流还包含一些特殊的流,如ObjectInputStream和ObjectOutputStream,它们支持对象的序列化和反序列化,使得对象可以被保存到磁盘或在网络上传输。 总的来说,Java IO流是一个强大的工具集,它涵盖了各种数据...

    Java中文件IO流.pdf

    Java 中文件 IO 流 Java 中文件 IO 流是指 Java 语言中对文件的输入输出操作,通过定义文件流来实现文件的读写操作。文件流是指在程序中用于文件输入输出的对象, Java 中提供了多种文件流类型,包括 InputStream ...

    一文读懂Java IO流 1. IO流基础概念 1.1 什么是IO流 1.2 IO流的分类 1.2.1 按数据传输单位分类 1.2.2 按功能角色分类 1.3 Java IO流体系结构 1.4 流的基

    一文读懂Java IO流 1. IO流基础概念 1.1 什么是IO流 1.2 IO流的分类 1.2.1 按数据传输单位分类 1.2.2 按功能角色分类 1.3 Java IO流体系结构 1.4 流的基本操作 2. 字节流 2.1 InputStream - 输入字节流 2.2 ...

    Java基础篇:IO流.pdf

    本知识点将深入探讨Java IO流的相关细节,包括节点流与处理流的概念,以及文件流、标准输入输出流、缓冲流、转换流、打印流、数据流和对象流的处理过程和使用方法。 首先,Java中的IO流根据数据流向可以分为输入流...

    JAVA IO流技术

    Java IO流技术是Java平台中用于处理输入输出的重要机制,其核心在于数据的传输,从数据源到程序或从程序到目的地。在Java中,流分为两大类:输入流(InputStream、Reader)和输出流(OutputStream、Writer)。输入流...

    Java IO流 总结

    Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...

    Java学生管理系统GUI+IO流

    Java学生管理系统GUI+IO流是一个适合初学者的项目,它主要展示了如何在没有数据库支持的情况下,利用Java的图形用户界面(GUI)和输入输出(IO)流来实现一个简易的学生和教师信息管理功能。这个系统可能包括账户...

    IO流结构图_io_java_思维导图_

    在Java编程语言中,输入/输出(IO)流是一个核心概念,用于处理数据的读取、写入和传输。在本篇文章中,我们将深入探讨Java IO流的基本结构、主要类和接口,以及如何使用它们来操作文件。"IO流结构图_io_java_思维...

    java io流 案例

    字符流通常在字节流之上构建,以提供更高效、更方便的文本操作。 在Java IO中,缓冲流(Buffered Stream)被设计用来提高性能,通过在内部创建缓冲区来存储数据。BufferedInputStream和BufferedOutputStream是缓冲...

Global site tag (gtag.js) - Google Analytics