`
zhuozhuobeauty
  • 浏览: 18040 次
  • 性别: 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位的字节序列。它们又...

    IO流pdf宝典

    ### JAVA IO流概念及其应用详解 #### 一、JAVA为何引入流的概念? 在JAVA中,引入流的概念主要是为了实现对各种类型数据的高效处理。在实际应用中,无论是从网络中传输数据还是从本地文件中读取数据,亦或是与用户...

    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流.pdf

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

    Java学生管理系统GUI+IO流

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

    JAVA IO流技术

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

    Java IO流 总结

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

    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