Java实现简单棋盘存档和读取功能

最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面。

主要思路

如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组。在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏数组,将所占用的空间压缩,保存到本地文件中。其中稀疏数组的第一行row表示11行,col表示11列,val表示除0以外的有效数据的个数,上图所示,有效个数为2。从第二行往下开始,表示的是黑子和蓝子的具体位置,例如上图(1,2,1)表示的是在第2行第3列(索引从0开始)存在一个黑子,(2,3,2)表示在第3行第4列存在一个蓝子。

读取功能实现主要思路是将保存在文本中稀疏矩阵读取出来,将读出来的数据转换成二维数组,从而达到实现展示上次棋局的功能。

主要代码段

package cn.mrlij.array;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

/***
 * 实现棋盘的存档
 * @author dreamer
 *
 */
public class ArrTest {
 public static int[][] newArr(){
 //1.创建一个带棋盘的二维数组
 int arr[][] = new int[11][11];
 //1 => 黑色 2 => 蓝色
 arr[1][2] = 1;
 arr[2][3] = 2;
 System.out.println("原始二维数组~~~");
 for(int[] row : arr) {
  for(int data :row) {
  System.out.printf("%d\t",data);
  }
  System.out.println();
 }
 return arr;
 }
 public static void toXs(int[][] arr) throws IOException{
 //2.转换稀疏数组
 /**
  *  row col val
  * 0 11 11 2
  */
 //统计二维数组中有效数据的个数,遍历二维数组
 int sum = 0;
 for(int i = 0;i<11;i++) {
  for(int j = 0;j<11; j++) {
  if(arr[i][j]!=0) {
   sum++;
  }
  }
 }
 System.out.println("有效数据的个数是====>>>>"+sum);
 //根据二维数组创建二维稀疏数组
 int xsarr[] [] = new int[sum+1][3];
 //给稀疏数组赋值,初始化第一行数据
 xsarr[0][0] = 11;
 xsarr[0][1] = 11;
 xsarr[0][2] = sum;

 //给余下的行赋值
 int count = 0;
 for(int i = 0; i<11;i++) {
  for(int j = 0; j<11;j++) {
  if(arr[i][j]!=0) {
   count++;
   xsarr[count][0] = i;
   xsarr[count][1] = j;
   xsarr[count][2] = arr[i][j];
  }
  }
 }
 //遍历稀疏数组
 System.out.println("稀疏数组是~~~~~");
 for(int i = 0;i<xsarr.length;i++) {
  for(int j = 0;j<3;j++) {
  System.out.printf("%d\t",xsarr[i][j]);
  }
  System.out.println();
 }
 File f = new File("D:/save.txt");
 if(f.exists()) {
  f.createNewFile();
 }
 FileWriter fw =new FileWriter(f);
 for(int i = 0;i<xsarr.length;i++) {
  for(int j = 0;j<3;j++) {
  fw.write(xsarr[i][j]+"\t");
  }
  fw.write("\r\n");
 }
 fw.close();
 }
 public static int[][] getXs() throws IOException{
 File f = new File("D:/save.txt");
 Reader r = new FileReader(f);
 int [][] xsarr = new int[3][3];
 BufferedReader br = new BufferedReader(r);
 if(f.exists()) {

  int flag = 0;
  String s;
  while((s = br.readLine())!=null) {
  String[] split = s.split("\t");
  for(int i = 0;i<split.length;i++) {
   xsarr[flag][i] = Integer.parseInt(split[i]);
  }
  flag++;
  }
 }
 br.close();

 //3.将稀疏数组转换二维数组
 //创建二维数组(行数为11,列数为11)
 int arr2 [][] = new int[11][11];
 //从稀疏数组的第二行开始遍历;
 for(int i = 1; i<xsarr.length;i++) {
  //将遍历的每个值赋值给二维数组
  arr2[xsarr[i][0]][xsarr[i][1]] = xsarr[i][2];
 }
 //转换之后的二维数组是。。
 System.out.println("转换的二维数组。。");
 for(int[] row : arr2) {
  for(int data :row) {
  System.out.printf("%d\t",data);
  }
  System.out.println();
 }
 return arr2;
 }
public static void main(String[] args) throws IOException {
 Scanner sc = new Scanner(System.in);
 while(true) {
 System.out.println("1.创建11*11的棋盘并存档");
 System.out.println("2.读取上次存档");
 System.out.println("3.退出");
 int r = sc.nextInt();
 switch(r) {
 case 1: int arr[][] = newArr();
  System.out.println("棋盘已创建!开始存档!");
  toXs(arr);
  System.out.println("存档完成!");
  break;
 case 2: getXs();
  break;
 case 3: System.out.println("退出!");
  break;
  default:
  break;
  }

 }
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • java使用swing绘制国际象棋棋盘

    本文实例为大家分享了java使用swing绘制国际象棋棋盘的具体代码,供大家参考,具体内容如下 1.完整代码 import java.awt.Color; import java.awt.Point; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; public class guo_ji_xiang_qi_qipan { public static void main(

  • java绘制国际象棋与中国象棋棋盘

    JAVA API 中的绘制图形类的paint()方法,我们可以轻松绘制中国象棋与国际象棋的棋盘.详见代码:  一.中国象棋棋盘代码 import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ChineseChese extends Frame{

  • java编程实现国际象棋棋盘

    本文实例为大家分享了java编程实现国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题描述: 打印出国际象棋棋盘(黑白交错) 问题分析: 棋盘由八块黑白相间的方块组成,通过swing编程实现.其中用标签来实现方块,在方块中填充黑或白色.通过i,j来遍历行和列,以i和j的值来判断填充什么颜色 代码分析 import javax.swing.*; import java.awt.*; public class _2ChessBoard { public static void main(Stri

  • Java基于分治算法实现的棋盘覆盖问题示例

    本文实例讲述了Java基于分治算法实现的棋盘覆盖问题.分享给大家供大家参考,具体如下: 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖.四个L型骨牌如下图: 棋盘中的特殊方格如图: 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不

  • java打印国际象棋棋盘的方法

    本文实例为大家分享了java打印出国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题分析 观察国际象棋棋盘的图案,可以发现其中的规律:棋盘由八行八列黑白方块相间组成,可以用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方块还是白方块.这里我们使用了Swing的标签组件JLable,通过设置JLabel组件的背景色和透明度来实现黑白方块. (1)确定程序框架 这是一个绘图案例,这里我们采用JFrame创建窗口,然后在窗口里添加JLabel标签组件,通过前面的问题分析可知,JLabel标

  • Java实现简单棋盘存档和读取功能

    最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面. 主要思路 如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组.在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏数组,将所占用的空间压缩,保存到本地文件中.其中稀疏数组的第一行row表示11行,col表示11列,val表示除0以外的有效数

  • java实现简单图片上传下载功能

    本文实例为大家分享了java实现简单图片上传下载的具体代码,供大家参考,具体内容如下 1.首先在上传图片界面:将form表单的enctype改为:multipart/form-data 2.定义一个实体类用来将存放图片存放的路径存入到mysql中private String imgpath; 3.在spring容器中注入处理图片的解析器 <bean name="multipartResolver" class="org.springframework.web.multi

  • 自己动手写一个java版简单云相册

    动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件. 用户可以下载其他人上传的图片. 用户可以查看其他所有人的图片. 用户只能删除通过自己IP上传的图片. 用到的技术: 文件上传下载.设计模式.Dom4j.xPath等. 先看下2个页面: 源代码: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns=

  • java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;

  • java简单实现复制 粘贴 剪切功能代码分享

    废话不多说,直接上代码,小伙伴们仔细看下注释吧. 复制代码 代码如下: /*简单的复制 剪切 粘贴 功能  操作:     复制测试: 输入文本选择文本,点击复制,然后将光标放在右边的TextArea,点击粘贴   剪切测试:输入文本选择文本,然后将光标放在右边的TextArea,点击剪切   */ import javax.swing.*; import java.awt.*; import java.awt.datatransfer.*; import java.awt.event.*; p

  • java实现简单的英文文本单词翻译器功能示例

    本文实例讲述了java实现简单的英文文本单词翻译器功能.分享给大家供大家参考,具体如下: 直接上代码: package fanyi; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader;

  • java利用注解实现简单的excel数据读取

    实现工具类 利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了. 定义注解: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Excel { String name(); } 由于本例中只涉及根据Excel表头部分对Excel进行解析,只定义了一个name作为和Excel表头的隐射

  • Java Swing实现简单的体重指数(BMI)计算器功能示例

    本文实例讲述了Java Swing实现简单的体重指数(BMI)计算器功能.分享给大家供大家参考,具体如下: BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个简单的BMI计算器.虽然现在网页上也有相应的网页应用,但是能够做出这个计算器来,还是有点成就感的,希望自己以后做出更多比这个好的应用. 最终运行效果: 功能:可以选择三个标准:中国.亚洲.WH

  • 详解java实现简单扫码登录功能(模仿微信网页版扫码)

    java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端产生sessionId,传到页面使用js保存cookie 多线程 生成qrcode相关js jquery.qrcode.js 代码 页面div <div class="pc_qr_code"> <input type="hidden" id="

  • Java实现简单双色球摇奖功能过程解析

    这篇文章主要介绍了Java实现简单双色球摇奖功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 双色球:从1-33号球中选取6个红球,且红球不重复 从1-16号球中选取一个篮球 话不多说 上代码~~~ package Javaee; import java.util.Arrays; import java.util.Random; public class DoubleChromosphere { public static void

随机推荐