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

前端之家收集整理的这篇文章主要介绍了Java实现简单棋盘存档和读取功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

主要思路

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列存在一个蓝子。

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

主要代码

  1. package cn.mrlij.array;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileReader;
  7. import java.io.FileWriter;
  8. import java.io.IOException;
  9. import java.io.Reader;
  10. import java.util.Scanner;
  11.  
  12. /***
  13. * 实现棋盘的存档
  14. * @author dreamer
  15. *
  16. */
  17. public class ArrTest {
  18. public static int[][] newArr(){
  19. //1.创建一个带棋盘的二维数组
  20. int arr[][] = new int[11][11];
  21. //1 => 黑色 2 => 蓝色
  22. arr[1][2] = 1;
  23. arr[2][3] = 2;
  24. System.out.println("原始二维数组~~~");
  25. for(int[] row : arr) {
  26. for(int data :row) {
  27. System.out.printf("%d\t",data);
  28. }
  29. System.out.println();
  30. }
  31. return arr;
  32. }
  33. public static void toXs(int[][] arr) throws IOException{
  34. //2.转换稀疏数组
  35. /**
  36. * row col val
  37. * 0 11 11 2
  38. */
  39. //统计二维数组中有效数据的个数,遍历二维数组
  40. int sum = 0;
  41. for(int i = 0;i<11;i++) {
  42. for(int j = 0;j<11; j++) {
  43. if(arr[i][j]!=0) {
  44. sum++;
  45. }
  46. }
  47. }
  48. System.out.println("有效数据的个数是====>>>>"+sum);
  49. //根据二维数组创建二维稀疏数组
  50. int xsarr[] [] = new int[sum+1][3];
  51. //给稀疏数组赋值,初始化第一行数据
  52. xsarr[0][0] = 11;
  53. xsarr[0][1] = 11;
  54. xsarr[0][2] = sum;
  55.  
  56. //给余下的行赋值
  57. int count = 0;
  58. for(int i = 0; i<11;i++) {
  59. for(int j = 0; j<11;j++) {
  60. if(arr[i][j]!=0) {
  61. count++;
  62. xsarr[count][0] = i;
  63. xsarr[count][1] = j;
  64. xsarr[count][2] = arr[i][j];
  65. }
  66. }
  67. }
  68. //遍历稀疏数组
  69. System.out.println("稀疏数组是~~~~~");
  70. for(int i = 0;i<xsarr.length;i++) {
  71. for(int j = 0;j<3;j++) {
  72. System.out.printf("%d\t",xsarr[i][j]);
  73. }
  74. System.out.println();
  75. }
  76. File f = new File("D:/save.txt");
  77. if(f.exists()) {
  78. f.createNewFile();
  79. }
  80. FileWriter fw =new FileWriter(f);
  81. for(int i = 0;i<xsarr.length;i++) {
  82. for(int j = 0;j<3;j++) {
  83. fw.write(xsarr[i][j]+"\t");
  84. }
  85. fw.write("\r\n");
  86. }
  87. fw.close();
  88. }
  89. public static int[][] getXs() throws IOException{
  90. File f = new File("D:/save.txt");
  91. Reader r = new FileReader(f);
  92. int [][] xsarr = new int[3][3];
  93. BufferedReader br = new BufferedReader(r);
  94. if(f.exists()) {
  95.  
  96. int flag = 0;
  97. String s;
  98. while((s = br.readLine())!=null) {
  99. String[] split = s.split("\t");
  100. for(int i = 0;i<split.length;i++) {
  101. xsarr[flag][i] = Integer.parseInt(split[i]);
  102. }
  103. flag++;
  104. }
  105. }
  106. br.close();
  107.  
  108. //3.将稀疏数组转换二维数组
  109. //创建二维数组(行数为11,列数为11)
  110. int arr2 [][] = new int[11][11];
  111. //从稀疏数组的第二行开始遍历;
  112. for(int i = 1; i<xsarr.length;i++) {
  113. //将遍历的每个值赋值给二维数组
  114. arr2[xsarr[i][0]][xsarr[i][1]] = xsarr[i][2];
  115. }
  116. //转换之后的二维数组是。。
  117. System.out.println("转换的二维数组。。");
  118. for(int[] row : arr2) {
  119. for(int data :row) {
  120. System.out.printf("%d\t",data);
  121. }
  122. System.out.println();
  123. }
  124. return arr2;
  125. }
  126. public static void main(String[] args) throws IOException {
  127. Scanner sc = new Scanner(System.in);
  128. while(true) {
  129. System.out.println("1.创建11*11的棋盘并存档");
  130. System.out.println("2.读取上次存档");
  131. System.out.println("3.退出");
  132. int r = sc.nextInt();
  133. switch(r) {
  134. case 1: int arr[][] = newArr();
  135. System.out.println("棋盘已创建!开始存档!");
  136. toXs(arr);
  137. System.out.println("存档完成!");
  138. break;
  139. case 2: getXs();
  140. break;
  141. case 3: System.out.println("退出!");
  142. break;
  143. default:
  144. break;
  145. }
  146.  
  147. }
  148. }
  149. }

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

猜你在找的Java相关文章