diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a55e7a179bde3e4e772c29c0c85e53354aa54618
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3d3ab27e979d39d5c546c323365ff06b8f343b4f..d251f7db1749e5ff24c308403ecdd84a10e3de9f 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,40 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
index 2b63946d5b31084bbb7dda418ceb3d75eb686373..835ec8ca9a344a130eb2325a608c9a9a907adc3c 100644
--- a/.idea/uiDesigner.xml
+++ b/.idea/uiDesigner.xml
@@ -8,9 +8,6 @@
-
- -
-
-
-
@@ -26,6 +23,9 @@
+ -
+
+
-
@@ -121,4 +121,7 @@
+
+
+
\ No newline at end of file
diff --git a/BugChess.iml b/BugChess.iml
index 5c08890316f33296f98228740440e98f9f39e29e..63a4a82dae8f13c527ea8a255353707c4603577d 100644
--- a/BugChess.iml
+++ b/BugChess.iml
@@ -3,10 +3,12 @@
+
+
\ No newline at end of file
diff --git a/out/production/DarkChess/Main.class b/out/production/DarkChess/Main.class
deleted file mode 100644
index 48ceb829c138815436953a04cc6a83c991425356..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/Main.class and /dev/null differ
diff --git a/out/production/DarkChess/chessComponent/ChariotChessComponent.class b/out/production/DarkChess/chessComponent/ChariotChessComponent.class
deleted file mode 100644
index 3b3970f6ee2deb36354bf1e15502b73adc6380cb..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/chessComponent/ChariotChessComponent.class and /dev/null differ
diff --git a/out/production/DarkChess/chessComponent/ChessComponent.class b/out/production/DarkChess/chessComponent/ChessComponent.class
deleted file mode 100644
index d2e0c5d66d55369d31c6fed5db3531f2f488e236..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/chessComponent/ChessComponent.class and /dev/null differ
diff --git a/out/production/DarkChess/chessComponent/EmptySlotComponent.class b/out/production/DarkChess/chessComponent/EmptySlotComponent.class
deleted file mode 100644
index af3d6a5525bc49c7c44b983e156c3c51b0c2770f..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/chessComponent/EmptySlotComponent.class and /dev/null differ
diff --git a/out/production/DarkChess/chessComponent/SoldierChessComponent.class b/out/production/DarkChess/chessComponent/SoldierChessComponent.class
deleted file mode 100644
index 3b5a20223484ea594ed5ab0904e5d98cbc769673..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/chessComponent/SoldierChessComponent.class and /dev/null differ
diff --git a/out/production/DarkChess/chessComponent/SquareComponent.class b/out/production/DarkChess/chessComponent/SquareComponent.class
deleted file mode 100644
index a96221583081c689d71d7572a4a43a55e2ac245f..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/chessComponent/SquareComponent.class and /dev/null differ
diff --git a/out/production/DarkChess/controller/ClickController.class b/out/production/DarkChess/controller/ClickController.class
deleted file mode 100644
index 30866b9d37e14c66b2bebbf02c89d93d0376fa27..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/controller/ClickController.class and /dev/null differ
diff --git a/out/production/DarkChess/controller/GameController.class b/out/production/DarkChess/controller/GameController.class
deleted file mode 100644
index f08067944dd821ccefa710663a687b4a77d5ad3a..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/controller/GameController.class and /dev/null differ
diff --git a/out/production/DarkChess/model/ChessColor.class b/out/production/DarkChess/model/ChessColor.class
deleted file mode 100644
index b88cc76ed2c52dbe45b127ad9bcc29208e2d8e01..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/model/ChessColor.class and /dev/null differ
diff --git a/out/production/DarkChess/model/ChessboardPoint.class b/out/production/DarkChess/model/ChessboardPoint.class
deleted file mode 100644
index a0ef8596da54d8da3660f68e6e0febfcfbd64132..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/model/ChessboardPoint.class and /dev/null differ
diff --git a/out/production/DarkChess/view/ChessGameFrame.class b/out/production/DarkChess/view/ChessGameFrame.class
deleted file mode 100644
index cf9f8f58b7ac7c853c1b1669b95788efe7891e40..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/view/ChessGameFrame.class and /dev/null differ
diff --git a/out/production/DarkChess/view/Chessboard.class b/out/production/DarkChess/view/Chessboard.class
deleted file mode 100644
index 398ab14e1be90a1556622f0ce89c9be253b1ddf2..0000000000000000000000000000000000000000
Binary files a/out/production/DarkChess/view/Chessboard.class and /dev/null differ
diff --git a/src/Main.java b/src/Main.java
index 7da0dd8dc1ea4fc65171494488e07a22d075d406..70a2042a1042bdb8c3378687bd366893984a9b89 100644
--- a/src/Main.java
+++ b/src/Main.java
@@ -1,5 +1,4 @@
import view.ChessGameFrame;
-import model.Chessboard;
import javax.swing.*;
diff --git a/src/controller/GameController.java b/src/controller/AppController.java
similarity index 55%
rename from src/controller/GameController.java
rename to src/controller/AppController.java
index 5a2a1dbfc80b1c2668c0811a6a522913e1d656e1..49cf9bfd27bf3d223cee9b8d01a63cc3337cd18d 100644
--- a/src/controller/GameController.java
+++ b/src/controller/AppController.java
@@ -1,6 +1,6 @@
package controller;
-import model.Chessboard;
+import model.game.Chessboard;
import java.io.IOException;
import java.nio.file.Files;
@@ -8,17 +8,26 @@ import java.nio.file.Path;
import java.util.List;
/**
- * 这个类主要完成由窗体上组件触发的动作。
- * 例如点击button等
- * ChessGameFrame中组件调用本类的对象,在本类中的方法里完成逻辑运算,将运算的结果传递至chessboard中绘制
+ * 负责全局工作,切换界面时引导相关Model初始化,也负责读写文存档
*/
-public class GameController {
- private Chessboard chessboard;
+public class AppController {
- public GameController(Chessboard chessboard) {
+ private History savedHistory;
+
+ private Game savedGame;
+
+ public AppController(Chessboard chessboard) {
this.chessboard = chessboard;
}
+ public History getSavedHistory(){
+ return savedHistory;
+ }
+
+ public History getSavedGame(){
+ return savedGame;
+ }
+
public List loadGameFromFile(String path) {
try {
List chessData = Files.readAllLines(Path.of(path));
diff --git a/src/controller/BulletAnim.java b/src/controller/BulletAnim.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2dfd0663340036aa9ee4471ec632ff2d574fa54
--- /dev/null
+++ b/src/controller/BulletAnim.java
@@ -0,0 +1,25 @@
+package controller;
+
+import model.game.Game;
+import model.game.Msg;
+
+public class BulletAnim extends Thread{
+ @Override
+ public void run() {
+ super.run();
+ while (true){
+ for (Msg msg: Game.instance.getMsgList()){
+ drawBullet(msg);
+ }
+ try {
+ sleep(50);
+ } catch (InterruptedException ignored) {
+ break;
+ }
+ }
+ }
+
+ public void drawBullet(Msg msg){
+ //TODO: drawBullet
+ }
+}
diff --git a/src/controller/ClickController.java b/src/controller/ChessClickController.java
similarity index 84%
rename from src/controller/ClickController.java
rename to src/controller/ChessClickController.java
index 6043419faaf59fec0080454397c6b7ab4f25e378..db48a860241dd28bff2f1c4ad62c07a1994f8f44 100644
--- a/src/controller/ClickController.java
+++ b/src/controller/ChessClickController.java
@@ -1,82 +1,78 @@
-package controller;
-
-
-import model.ChessColor;
-import model.Chessboard;
-import model.GridPoint;
-import model.chess.Chess;
-import model.chess.Square;
-import view.ChessGameFrame;
-import view.ChessboardCom;
-import view.SquareCom;
-
-/**
- * 响应click事件,棋盘的交互逻辑
- */
-public enum ClickController {
- /**
- * 单例
- */
- INSTANCE;
-
- /**
- * 记忆两次点击中第一次点击选中的棋子
- */
- private Chess first = null;
-
- /**
- * 响应click事件,棋盘的交互逻辑
- * @param squareCom 点中的方格
- */
- public void onClick(SquareCom squareCom) {
- Square square = squareCom.getBackSquare();
-
- if (first == null) { //判断第一次点击
- if (square instanceof Chess chess && handleFirst(chess)) {
- chess.setSelected(true);
- first = chess;
- squareCom.repaint();
- }
- } else { //第二次点击
- if (first == square) { //点击同一个棋子取消选取
- first.setSelected(false);
- squareCom.repaint();
- first = null;
- } else if (Chess.canMoveTo(first, square.getGridPoint())) {
- //取消选择
- first.setSelected(false);
- //走吃
- Chessboard.getInstance().moveAndEat(first, square);
- if (square instanceof Chess chess)
- ChessboardCom.getInstance().getSideStackComs()[chess.getChessColor().ordinal()].repaint();
- ClickController.INSTANCE.swapPlayer();
- //擦除记忆
- first = null;
- }
- }
- }
-
-
- /**
- * @param chess 目标选取的棋子
- * @return 目标选取的棋子是否与棋盘记录的当前行棋方颜色相同
- */
- private boolean handleFirst(Chess chess) {
- if (!chess.isReversal()) {
- chess.setReversal(true);
- System.out.printf("onClick to reverse a chess at %s\n",
- chess.getGridPoint());
- ChessboardCom.getInstance().getSquareComAtPoint(chess.getGridPoint()).repaint();
- ClickController.INSTANCE.swapPlayer();
- return false;
- }
- return chess.getChessColor() == Chessboard.getInstance().getCurrentColor();
- }
-
- public void swapPlayer() {
- Chessboard.getInstance().setCurrentColor(
- Chessboard.getInstance().getCurrentColor() == ChessColor.BLACK ? ChessColor.RED : ChessColor.BLACK
- );
- ChessGameFrame.getStatusLabel().setText(String.format("%s's TURN", Chessboard.getInstance().getCurrentColor().getName()));
- }
-}
+package controller;
+
+
+import model.game.*;
+import view.ChessGameFrame;
+import view.ChessboardCom;
+import view.SquareCom;
+
+/**
+ * 响应click事件,棋盘的交互逻辑
+ */
+public enum ChessClickController {
+ /**
+ * 单例
+ */
+ INSTANCE;
+
+ /**
+ * 记忆两次点击中第一次点击选中的棋子
+ */
+ private Chess first = null;
+
+ /**
+ * 响应click事件,棋盘的交互逻辑
+ * @param squareCom 点中的方格
+ */
+ public void onClick(SquareCom squareCom) {
+ Square square = squareCom.getBackSquare();
+
+ if (first == null) { //判断第一次点击
+ if (square instanceof Chess chess && handleFirst(chess)) {
+ chess.setSelected(true);
+ first = chess;
+ squareCom.repaint();
+ }
+ } else { //第二次点击
+ if (first == square) { //点击同一个棋子取消选取
+ first.setSelected(false);
+ squareCom.repaint();
+ first = null;
+ } else if (Chess.canMoveTo(first, square.getGridPoint())) {
+ //取消选择
+ first.setSelected(false);
+ //走吃
+ Chessboard.getInstance().moveAndEat(first, square);
+ if (square instanceof Chess chess)
+ ChessboardCom.getInstance().getSideStackComs()[chess.getChessColor().ordinal()].repaint();
+ ChessClickController.INSTANCE.swapPlayer();
+ //擦除记忆
+ first = null;
+ }
+ }
+ }
+
+
+ /**
+ * @param chess 目标选取的棋子
+ * @return 目标选取的棋子是否与棋盘记录的当前行棋方颜色相同
+ */
+ private boolean handleFirst(Chess chess) {
+ if (!chess.isReversal()) {
+ chess.setReversal(true);
+ System.out.printf("onClick to reverse a chess at %s\n",
+ chess.getGridPoint());
+ ChessboardCom.getInstance().getSquareComAtPoint(chess.getGridPoint()).repaint();
+ ChessClickController.INSTANCE.swapPlayer();
+ return false;
+ }
+ return chess.getChessColor() == Game.instance.getCurrentColor();
+ }
+
+ public void swapPlayer() {
+ Chessboard.getInstance().setCurrentColor(
+ Chessboard.getInstance().getCurrentColor() == ChessColor.BLACK ? ChessColor.RED : ChessColor.BLACK
+ );
+ ChessGameFrame.getStatusLabel().setText(String.format("%s's TURN", Chessboard.getInstance().getCurrentColor().getName()));
+ }
+}
diff --git a/src/model/History.java b/src/model/History.java
index 3f9c8e1cbca652ec9d4345addcd197c3c117ffe0..c31fc9df34102bb71839f1ca0ac5809418ac6703 100644
--- a/src/model/History.java
+++ b/src/model/History.java
@@ -1,4 +1,24 @@
package model;
+import model.game.Chessboard;
+import model.game.Game;
+
+import java.util.ArrayList;
+
public class History {
+
+ public static History instance;
+
+ public ArrayList getSteps() {
+ return steps;
+ }
+
+ private ArrayList steps = new ArrayList<>();
+
+ private Game initialState;
+
+ public History(Game initialState) {
+ this.initialState = initialState.clone();
+ }
+
}
diff --git a/src/model/OnlineInfo.java b/src/model/OnlineInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf49fd687c202b1e2344976b4c2af18575ac2bee
--- /dev/null
+++ b/src/model/OnlineInfo.java
@@ -0,0 +1,4 @@
+package model;
+
+public class OnlineInfo {
+}
diff --git a/src/model/RoomFound.java b/src/model/RoomFound.java
new file mode 100644
index 0000000000000000000000000000000000000000..47b56054836f231ce49717acc76f877b287fbdf3
--- /dev/null
+++ b/src/model/RoomFound.java
@@ -0,0 +1,4 @@
+package model;
+
+public class RoomFound {
+}
diff --git a/src/model/Settings.java b/src/model/Settings.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef5022893d9717e1cc85e6a6c2a52d4a5f78f4b1
--- /dev/null
+++ b/src/model/Settings.java
@@ -0,0 +1,9 @@
+package model;
+
+public class Settings {
+ double musicVolume;
+ double fxVolume;
+ String name;
+ String uuid;
+
+}
diff --git a/src/model/Step.java b/src/model/Step.java
new file mode 100644
index 0000000000000000000000000000000000000000..d772bf5db49b6cac941d1dd7fe0f6cf3f1c1b46b
--- /dev/null
+++ b/src/model/Step.java
@@ -0,0 +1,29 @@
+package model;
+
+import model.game.Chess;
+import model.game.Chessboard;
+import model.game.GridPoint;
+import model.game.Square;
+
+/**
+ * 记录一步操作
+ * 有两种类型:吃子和行棋
+ * 第一种,src吃掉dst,dst被“安葬”到SideStack里面的bury的空位上,bury移到src原来的位置上,三轮换
+ * 第二种,src和dst互换,burySquareId写-1,这个-1是区分这一步表示行子还是吃棋的判据
+ *
+ * @param srcChessId 源棋子id
+ * @param dstSquareId 目标空格/棋子id
+ * @param burySquareId SideStack里面的空格id
+ */
+public record Step(int srcChessId, int dstSquareId, int burySquareId) {
+ public Step {
+ if (srcChessId >= Chessboard.ID_DIVISION
+ || (burySquareId >= 0 && burySquareId < Chessboard.ID_DIVISION)
+ || (burySquareId < 0 && dstSquareId < Chessboard.ID_DIVISION)
+ || (burySquareId >= 0 && dstSquareId >= Chessboard.ID_DIVISION)) {
+ throw new IllegalArgumentException(String.format(
+ "Illegal Step:{ srcChessId: %d, dstChessId: %d, burySquareId: %d }",
+ srcChessId, dstSquareId, burySquareId));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/controller/CheckRule.java b/src/model/game/CheckRule.java
similarity index 75%
rename from src/controller/CheckRule.java
rename to src/model/game/CheckRule.java
index 4e4708206c7626a3b1af9d596f040701d66c7fa8..88c220f31812c324e5dda14b93763c75e5caf267 100644
--- a/src/controller/CheckRule.java
+++ b/src/model/game/CheckRule.java
@@ -1,16 +1,16 @@
-package controller;
+package model.game;
-import model.ChessType;
-import model.Chessboard;
-import model.GridPoint;
-import model.chess.Chess;
-import model.chess.Square;
+import model.game.ChessType;
+import model.game.Chessboard;
+import model.game.GridPoint;
+import model.game.Chess;
+import model.game.Square;
public class CheckRule {
-
+
/* path 和 军衔 判定分两个method
* 则需要两个return同时为true*/
-
+
/**
* 对吃棋时的 path 判定
*
@@ -24,6 +24,8 @@ public class CheckRule {
if (handleChess.getChessType() != ChessType.CANNON) {
return Math.abs(move.getY()) + Math.abs(move.getX()) == 1;
} else {
+ if(!(Chessboard.getInstance().getSquareAtPoint(dst) instanceof Chess))
+ return false;
int count = 0;
if (move.getY() == 0) {
for (int i = Math.min(src.getX(), dst.getX()) + 1; i < Math.max(src.getX(), dst.getX()); i++) {
@@ -41,7 +43,7 @@ public class CheckRule {
return count == 1;
}
}
-
+
/**
* @param handleChess 所执棋子
* @param dstChess 第二个选中棋子,即被吃的棋子
@@ -52,17 +54,14 @@ public class CheckRule {
ChessType dstType = dstChess.getChessType();
if (dstChess.isReversal()) {
return handleChess.getChessColor() != dstChess.getChessColor() // 颜色不相等
- && !(srcType == ChessType.GENERAL && dstType == ChessType.SOLDIER) //将->兵,不可
- && (
- dstType.compareTo(srcType) >= 0 //高级
- || ( //兵->炮/将
- srcType == ChessType.SOLDIER
- && (dstType == ChessType.CANNON || dstType == ChessType.GENERAL)
- )
- );
+ && !(srcType == ChessType.GENERAL && dstType == ChessType.SOLDIER) //将->兵,不可
+ && (dstType.compareTo(srcType) >= 0 //高级
+ || (srcType == ChessType.SOLDIER && dstType == ChessType.GENERAL) //兵->将
+ || (srcType != ChessType.SOLDIER && dstType == ChessType.CANNON) //非兵->炮
+ );
} else {
return (srcType == ChessType.CANNON);
}
}
-
+
}
diff --git a/src/model/chess/Chess.java b/src/model/game/Chess.java
similarity index 78%
rename from src/model/chess/Chess.java
rename to src/model/game/Chess.java
index dd35667acd890c84b719014221d64f0fdc78d13a..3a376b09705ebcb0fa7590502a1859db002ec2c6 100644
--- a/src/model/chess/Chess.java
+++ b/src/model/game/Chess.java
@@ -1,10 +1,4 @@
-package model.chess;
-
-import controller.CheckRule;
-import model.ChessColor;
-import model.ChessType;
-import model.Chessboard;
-import model.GridPoint;
+package model.game;
import java.io.Serializable;
@@ -17,7 +11,7 @@ public class Chess extends Square implements Serializable, Cloneable {
protected boolean alive; //是不是没死
private boolean selected; //是否被选中
private boolean isReversal = false; //是否被翻开
-
+
/**
* gridPoint: 表示8*4棋盘中,当前棋子在棋格对应的位置,如(0, 0), (1, 0)等等
* chessColor: 表示这个棋子的颜色,有红色,黑色,无色三种
@@ -32,39 +26,42 @@ public class Chess extends Square implements Serializable, Cloneable {
this.alive = true;
this.selected = false;
}
-
+
public ChessColor getChessColor() {
return chessColor;
}
-
+
public ChessType getChessType() {
return chessType;
}
-
+
public boolean isAlive() {
return alive;
}
- public void kill(){
+
+ public void kill() {
this.alive = false;
}
-
+
public boolean isSelected() {
return selected;
}
+
public void setSelected(boolean selected) {
this.selected = selected;
}
-
+
public boolean isReversal() {
return isReversal;
}
+
public void setReversal(boolean reversal) {
isReversal = reversal;
}
-
+
/**
* @param handleChess 当前选择的棋子
- * @param dst 目标位置,如(0, 0), (0, 1)等等
+ * @param dst 目标位置,如(0, 0), (0, 1)等等
* @return this棋子对象的移动规则和当前位置(chessboardPoint)能否到达目标位置
*
* 这个方法主要是检查移动的合法性,如果合法就返回true,反之是false。
@@ -73,17 +70,15 @@ public class Chess extends Square implements Serializable, Cloneable {
Square dstSquare = Chessboard.getInstance().getSquareAtPoint(dst);
//此处判断 handleChess 是否翻转
return handleChess.isReversal &&
- CheckRule.checkPath(handleChess,dstSquare) &&
- (!(dstSquare instanceof Chess dstChess) ||
- CheckRule.checkRank(handleChess,dstChess));
+ CheckRule.checkPath(handleChess, dstSquare) &&
+ (!(dstSquare instanceof Chess dstChess) ||
+ CheckRule.checkRank(handleChess, dstChess));
}
-
+
+
@Override
public Chess clone() {
- try {
- return (Chess) super.clone();
- } catch (CloneNotSupportedException e) {
- throw new AssertionError();
- }
+ Chess clone = (Chess) super.clone();
+ return clone;
}
}
diff --git a/src/model/ChessColor.java b/src/model/game/ChessColor.java
similarity index 92%
rename from src/model/ChessColor.java
rename to src/model/game/ChessColor.java
index 50f77e05ac2cf18f8387d6d0050fcc581c952ac7..7ca93847599b63ebe87052f56df551110c3ddb17 100644
--- a/src/model/ChessColor.java
+++ b/src/model/game/ChessColor.java
@@ -1,25 +1,25 @@
-package model;
-
-import java.awt.*;
-
-/**
- * 颜色,但是是特指阵营颜色
- */
-public enum ChessColor {
- BLACK("Black", Color.BLACK), RED("Red", Color.RED), NONE("No Player", Color.WHITE);
-
- private final String name;
- private final Color color;
-
- ChessColor(String name, Color color) {
- this.name = name;
- this.color = color;
- }
-
- public String getName() {
- return name;
- }
- public Color getColor() {
- return color;
- }
-}
+package model.game;
+
+import java.awt.*;
+
+/**
+ * 颜色,但是是特指阵营颜色
+ */
+public enum ChessColor {
+ BLACK("Black", Color.BLACK), RED("Red", Color.RED), NONE("No Player", Color.WHITE);
+
+ private final String name;
+ private final Color color;
+
+ ChessColor(String name, Color color) {
+ this.name = name;
+ this.color = color;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public Color getColor() {
+ return color;
+ }
+}
diff --git a/src/model/ChessType.java b/src/model/game/ChessType.java
similarity index 88%
rename from src/model/ChessType.java
rename to src/model/game/ChessType.java
index f5a7262f3a115672b2592901b626cf110cdde1e7..a5933e3ba7211fbea833e8e3bc912784b03e81ad 100644
--- a/src/model/ChessType.java
+++ b/src/model/game/ChessType.java
@@ -1,4 +1,4 @@
-package model;
+package model.game;
public enum ChessType {
CANNON,GENERAL, ADVISOR, MINISTER, CHARIOT, HORSE, SOLDIER
diff --git a/src/model/Chessboard.java b/src/model/game/Chessboard.java
similarity index 83%
rename from src/model/Chessboard.java
rename to src/model/game/Chessboard.java
index 55366f55b4107a09cd740c1466e9f73cc6343d4d..6c3f212c4b12bed086fbfa9ec9ee76b3e1fdc815 100644
--- a/src/model/Chessboard.java
+++ b/src/model/game/Chessboard.java
@@ -1,8 +1,5 @@
-package model;
+package model.game;
-import model.chess.Chess;
-import model.chess.EmptySlot;
-import model.chess.Square;
import io.vavr.Tuple2;
import view.ChessboardCom;
@@ -13,6 +10,8 @@ import java.util.*;
* 这个类表示棋盘组建,其包含:
* Square[][]: 4*8个方块格子组件
*/
+
+//TODO: Refactor into id mode
public class Chessboard implements Serializable, Cloneable {
/**
* 不彻底的单例
@@ -22,7 +21,9 @@ public class Chessboard implements Serializable, Cloneable {
public static final int ROW_SIZE = 8; //行数
public static final int COL_SIZE = 4; //列数
- private Square[][] squares = new Square[ROW_SIZE][COL_SIZE]; //方格子列表
+ public static final int ID_DIVISION = ROW_SIZE * COL_SIZE;
+
+ private Square[][] idGrid = new Square[ROW_SIZE][COL_SIZE]; //方格子列表
//两个亡子堆->亡子堆组
private SideStack[] sideStacks = new SideStack[]{
@@ -30,8 +31,6 @@ public class Chessboard implements Serializable, Cloneable {
new SideStack(ChessColor.RED)
};
- private ChessColor currentColor = ChessColor.RED; //执棋颜色
-
/**
* 初始化整个棋盘,包括所有棋子和亡子堆
*/
@@ -55,9 +54,9 @@ public class Chessboard implements Serializable, Cloneable {
Collections.shuffle(paramsList);
//每个棋子初始化的时候,从末尾拿元组作为参数,并移除那个元组,如同出栈
- for (int i = 0; i < squares.length; i++) {
- squares[i] = new Square[COL_SIZE];
- for (int j = 0; j < squares[i].length; j++) {
+ for (int i = 0; i < idGrid.length; i++) {
+ idGrid[i] = new Square[COL_SIZE];
+ for (int j = 0; j < idGrid[i].length; j++) {
Chess chess;
Tuple2 params = paramsList.get(paramsList.size() - 1);
chess = new Chess(new GridPoint(i, j), params._1, params._2);
@@ -74,8 +73,8 @@ public class Chessboard implements Serializable, Cloneable {
instance = instance1;
}
- public Square[][] getSquares() {
- return squares;
+ public Square[][] getIdGrid() {
+ return idGrid;
}
/**
@@ -83,7 +82,24 @@ public class Chessboard implements Serializable, Cloneable {
* @param gridPoint 棋盘坐标
*/
public Square getSquareAtPoint(GridPoint gridPoint) {
- return squares[gridPoint.getY()][gridPoint.getX()];
+ return idGrid[gridPoint.getY()][gridPoint.getX()];
+ }
+
+ /**
+ * TODO getSquareById
+ * 获取某一id对应的方格对象
+ * @param id 方格id
+ */
+ Square getSquareById(int id){
+ }
+
+ /**
+ * TODO getChessById
+ * 获取某一id对应的棋子对象
+ * @param id 棋子id
+ */
+ Chess getChessById(int id){
+
}
/**
@@ -105,19 +121,12 @@ public class Chessboard implements Serializable, Cloneable {
throw new NoSuchElementException();
}
- public ChessColor getCurrentColor() {
- return currentColor;
- }
- public void setCurrentColor(ChessColor currentColor) {
- this.currentColor = currentColor;
- }
-
/**
* 根据Square存储的位置数据,将Square放置在棋盘的数组上
*/
public void putChessOnBoard(Square square) {
int row = square.getGridPoint().getY(), col = square.getGridPoint().getX();
- squares[row][col] = square;
+ idGrid[row][col] = square;
}
/**
@@ -139,9 +148,9 @@ public class Chessboard implements Serializable, Cloneable {
//Set squares' references
int row1 = chess1.getGridPoint().getY(), col1 = chess1.getGridPoint().getX();
- squares[row1][col1] = chess1;
+ idGrid[row1][col1] = chess1;
int row2 = square2.getGridPoint().getY(), col2 = square2.getGridPoint().getX();
- squares[row2][col2] = square2;
+ idGrid[row2][col2] = square2;
//重绘
ChessboardCom.getInstance().getSquareComAtPoint(chess1.getGridPoint()).repaint();
@@ -160,7 +169,7 @@ public class Chessboard implements Serializable, Cloneable {
public Chessboard clone() {
try {
Chessboard clone = (Chessboard) super.clone();
- clone.squares = this.squares.clone();
+ clone.idGrid = this.idGrid.clone();
clone.sideStacks = this.sideStacks.clone();
return clone;
} catch (CloneNotSupportedException e) {
diff --git a/src/model/chess/EmptySlot.java b/src/model/game/EmptySlot.java
similarity index 79%
rename from src/model/chess/EmptySlot.java
rename to src/model/game/EmptySlot.java
index c33d017cc5936668de38a7b00d2d411c807303fd..0d4ccb5cc3fc835914acf7fb2c6123e195033f69 100644
--- a/src/model/chess/EmptySlot.java
+++ b/src/model/game/EmptySlot.java
@@ -1,6 +1,4 @@
-package model.chess;
-
-import model.GridPoint;
+package model.game;
/**
* 这个类表示棋盘上的空棋子的格子
diff --git a/src/model/game/Game.java b/src/model/game/Game.java
new file mode 100644
index 0000000000000000000000000000000000000000..be76dfc1b8d5c377dd70caeb39da71510d3f3b6e
--- /dev/null
+++ b/src/model/game/Game.java
@@ -0,0 +1,48 @@
+package model.game;
+
+import model.Step;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Game implements Cloneable{
+
+ public static Game instance;
+
+ private Chessboard chessboard;
+
+ private List msgList = new ArrayList<>();
+
+ private int[] scoreboard = {0, 0};
+
+ private ChessColor currentColor = ChessColor.RED; //执棋颜色
+
+ public Chessboard getChessboard() {
+ return chessboard;
+ }
+
+ public List getMsgList() {
+ return msgList;
+ }
+
+ public int[] getScoreboard() {
+ return scoreboard;
+ }
+
+ public ChessColor getCurrentColor() {
+ return currentColor;
+ }
+
+ public boolean resolveStep(Step step){
+ //TODO resolveStep of every level
+ }
+
+ @Override
+ public Game clone() {
+ try {
+ return (Game) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/model/GridPoint.java b/src/model/game/GridPoint.java
similarity index 97%
rename from src/model/GridPoint.java
rename to src/model/game/GridPoint.java
index 725d3f406b016fa66201905218db5de26a53aefa..bae59864f5f87fc3e4273e5edadeadc06c259bfe 100644
--- a/src/model/GridPoint.java
+++ b/src/model/game/GridPoint.java
@@ -1,4 +1,4 @@
-package model;
+package model.game;
/**
* 这个类表示网格中的整数坐标,可以表示棋盘的位置,也可以表示亡子堆的位置
diff --git a/src/model/game/Msg.java b/src/model/game/Msg.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8eca4eae7435c6c44736b74444105848f58d5c2
--- /dev/null
+++ b/src/model/game/Msg.java
@@ -0,0 +1,5 @@
+package model.game;
+
+public class Msg {
+
+}
\ No newline at end of file
diff --git a/src/model/SideStack.java b/src/model/game/SideStack.java
similarity index 98%
rename from src/model/SideStack.java
rename to src/model/game/SideStack.java
index 872cead74eec2254df2ff4f04010df400ff9fcf0..fa1e7fc120c9f6c2d03f8f2ac347494c0d88a3ca 100644
--- a/src/model/SideStack.java
+++ b/src/model/game/SideStack.java
@@ -1,6 +1,5 @@
-package model;
+package model.game;
-import model.chess.Chess;
import view.ChessboardCom;
import java.io.Serializable;
diff --git a/src/model/chess/Square.java b/src/model/game/Square.java
similarity index 65%
rename from src/model/chess/Square.java
rename to src/model/game/Square.java
index 8807eb42ff5ad66e8e0028c3e2949cb12c7b93b0..291d3329d2a2deccc1ea69e58cb6ab487bb61cdc 100644
--- a/src/model/chess/Square.java
+++ b/src/model/game/Square.java
@@ -1,6 +1,4 @@
-package model.chess;
-
-import model.GridPoint;
+package model.game;
import java.io.Serializable;
@@ -10,7 +8,7 @@ import java.io.Serializable;
* 1. EmptySlot: 空方格
* 2. Chess: 带棋子的方格
*/
-public class Square implements Serializable {
+public class Square implements Serializable, Cloneable {
private GridPoint gridPoint;
protected Square(GridPoint gridPoint) {
@@ -25,4 +23,12 @@ public class Square implements Serializable {
this.gridPoint = gridPoint;
}
+ @Override
+ public Square clone() {
+ try {
+ return (Square) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
}
diff --git a/src/network/Client.java b/src/network/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..6191a1a98881f27b92b43c9eca547ae7330f2775
--- /dev/null
+++ b/src/network/Client.java
@@ -0,0 +1,4 @@
+package network;
+
+public class Client {
+}
diff --git a/src/network/Responser.java b/src/network/Responser.java
new file mode 100644
index 0000000000000000000000000000000000000000..75543d42b46c19a5844cf5b4ba70ec7195b40d0a
--- /dev/null
+++ b/src/network/Responser.java
@@ -0,0 +1,4 @@
+package network;
+
+public class Responser {
+}
diff --git a/src/network/Searcher.java b/src/network/Searcher.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ff1b3ac9c0b3732b4ec79b3feeb526c03b3d6d0
--- /dev/null
+++ b/src/network/Searcher.java
@@ -0,0 +1,2 @@
+package network;public class Searcher {
+}
diff --git a/src/network/Server.java b/src/network/Server.java
new file mode 100644
index 0000000000000000000000000000000000000000..140688fcf8a90e1b5e13ad54508751106224fa8f
--- /dev/null
+++ b/src/network/Server.java
@@ -0,0 +1,4 @@
+package network;
+
+public class Server {
+}
diff --git a/src/view/ChessGameFrame.java b/src/view/ChessGameFrame.java
index fd9159d37ad95f1b218d50dc51428473ad243df8..5b74f0c5dbc5f985b436bec17c1643857d53aa11 100644
--- a/src/view/ChessGameFrame.java
+++ b/src/view/ChessGameFrame.java
@@ -1,7 +1,7 @@
package view;
-import controller.GameController;
-import model.Chessboard;
+import controller.AppController;
+import model.game.Chessboard;
import javax.swing.*;
import java.awt.*;
@@ -16,7 +16,7 @@ public class ChessGameFrame extends JFrame {
private final int WIDTH;
private final int HEIGHT;
public final int CHESSBOARD_SIZE;
- private GameController gameController;
+ private AppController appController;
private static JLabel statusLabel;
public ChessGameFrame(int width, int height) {
@@ -36,6 +36,8 @@ public class ChessGameFrame extends JFrame {
addLabel();
addHelloButton();
addLoadButton();
+ appController = new AppController(Chessboard.getInstance());
+ appController.loadGameFromFile("res/save.txt");
}
@@ -44,7 +46,7 @@ public class ChessGameFrame extends JFrame {
*/
private void addChessboard() {
ChessboardCom.setInstance(new ChessboardCom(CHESSBOARD_SIZE / 2 + 6, CHESSBOARD_SIZE / 3, CHESSBOARD_SIZE + 6));
- gameController = new GameController(Chessboard.getInstance());
+ appController = new AppController(Chessboard.getInstance());
ChessboardCom.getInstance().setLocation(HEIGHT / 10, HEIGHT / 10);
add(ChessboardCom.getInstance());
}
@@ -88,7 +90,7 @@ public class ChessGameFrame extends JFrame {
button.addActionListener(e -> {
System.out.println("Click load");
String path = JOptionPane.showInputDialog(this, "Input Path here");
- gameController.loadGameFromFile(path);
+ appController.loadGameFromFile(path);
});
}
diff --git a/src/view/ChessboardCom.java b/src/view/ChessboardCom.java
index 8c164351c5f84cb057a6c00d6f461aa00a4aea70..fbb87ad73f1615a745d698adfd3f78e04d8eb0c1 100644
--- a/src/view/ChessboardCom.java
+++ b/src/view/ChessboardCom.java
@@ -1,10 +1,10 @@
package view;
-import model.ChessColor;
-import model.Chessboard;
-import model.GridPoint;
-import model.SideStack;
+import model.game.ChessColor;
+import model.game.Chessboard;
+import model.game.GridPoint;
+import model.game.SideStack;
import javax.swing.*;
import java.awt.*;
@@ -45,7 +45,7 @@ public class ChessboardCom extends JComponent {
for (int j = 0; j < Chessboard.COL_SIZE; j++) {
GridPoint gridPoint = new GridPoint(i, j);
putChessOnBoard(new SquareCom(
- gridPoint, evalPoint(gridPoint), SQUARE_SIZE, spacingLength, true
+ gridPoint, evalPoint(gridPoint), SQUARE_SIZE, spacingLength, ChessColor.NONE
));
}
}
diff --git a/src/view/SideStackCom.java b/src/view/SideStackCom.java
index 9c1920978658bf3e7d2d682b6e74f42a52ed0923..3b21c8e9555569dec041dc9435217ea53b4bc393 100644
--- a/src/view/SideStackCom.java
+++ b/src/view/SideStackCom.java
@@ -1,8 +1,8 @@
package view;
-import model.GridPoint;
-import model.SideStack;
-import model.ChessColor;
+import model.game.GridPoint;
+import model.game.SideStack;
+import model.game.ChessColor;
import javax.swing.*;
import java.awt.*;
@@ -30,7 +30,7 @@ public class SideStackCom extends JComponent {
this.getHeight() * i / SideStack.ROW_SIZE
);
SquareCom squareCom = new SquareCom(
- new GridPoint(i, j), location, size,size / 12,false);
+ new GridPoint(i, j), location, size,size / 12, this.chessColor);
squareCom.setSideStackColor(this.chessColor);
add(squareComs[i][j] = squareCom);
squareCom.repaint();
diff --git a/src/view/SquareCom.java b/src/view/SquareCom.java
index 8d2ee9eeda7d51fc7d4e88257b96325ffe74140f..8bc92e2d971b607a5acd3faae7961b11db9bc2d4 100644
--- a/src/view/SquareCom.java
+++ b/src/view/SquareCom.java
@@ -1,12 +1,12 @@
package view;
-import controller.ClickController;
-import model.ChessColor;
-import model.ChessType;
-import model.Chessboard;
-import model.GridPoint;
-import model.chess.Chess;
-import model.chess.Square;
+import controller.ChessClickController;
+import model.game.ChessColor;
+import model.game.ChessType;
+import model.game.Chessboard;
+import model.game.GridPoint;
+import model.game.Chess;
+import model.game.Square;
import javax.swing.*;
import java.awt.*;
@@ -28,15 +28,15 @@ public class SquareCom extends JComponent {
protected static Font DEAD_CHESS_FONT;
- private boolean alive; //这个alive决定了该元素是反映chessboard的square,还是SideStack的square
+ private ChessColor hostGrid; //这个alive决定了该元素是反映chessboard的square,还是SideStack的square
private ChessColor sideStackColor; //如果反映SideStack, 指示反映哪个SideStack
private GridPoint gridPoint;
- public SquareCom(GridPoint gridPoint, Point location, int size, int spacingLength, boolean alive) {
+ public SquareCom(GridPoint gridPoint, Point location, int size, int spacingLength, ChessColor hostGrid) {
this.gridPoint = gridPoint;
- this.alive = alive;
+ this.hostGrid = hostGrid;
this.spacingLength = spacingLength;
setLayout(null);
@@ -69,15 +69,15 @@ public class SquareCom extends JComponent {
this.sideStackColor = sideStackColor;
}
- public boolean isAlive() {
- return alive;
+ public ChessColor getHostGrid() {
+ return hostGrid;
}
/**
* 根据自身存储的棋盘坐标和存活状态,来获取所反映的Square
*/
public Square getBackSquare() {
- return this.isAlive() ?
+ return this.getHostGrid() == ChessColor.NONE ?
Chessboard.getInstance().getSquareAtPoint(this.gridPoint) :
Chessboard.getInstance().getSideStack(this.sideStackColor).getChessAtPoint(this.gridPoint);
}
@@ -129,7 +129,7 @@ public class SquareCom extends JComponent {
super.processMouseEvent(e);
if (e.getID() == MouseEvent.MOUSE_PRESSED) {
System.out.printf("Click [%d,%d]\n", gridPoint.getX(), gridPoint.getY());
- ClickController.INSTANCE.onClick(this);
+ ChessClickController.INSTANCE.onClick(this);
}
}
@@ -138,7 +138,7 @@ public class SquareCom extends JComponent {
super.paintComponents(g);
System.out.printf("repaint chess [%d,%d]\n", gridPoint.getX(), gridPoint.getY());
//填方格颜色
- if(this.alive) {
+ if(this.hostGrid == ChessColor.NONE) {
g.setColor(squareColor);
g.fillRect(1, 1, this.getWidth() - 2, this.getHeight() - 2);
}
@@ -157,7 +157,7 @@ public class SquareCom extends JComponent {
if (chess.isReversal()) {
//绘制棋子文字
g.setColor(chess.getChessColor().getColor());
- Font font = this.alive ? ALIVE_CHESS_FONT : DEAD_CHESS_FONT;
+ Font font = this.hostGrid == ChessColor.NONE ? ALIVE_CHESS_FONT : DEAD_CHESS_FONT;
g.setFont(font);
g.drawString(this.deduceChessName(),
this.getWidth() / 2 - (int)(font.getSize() / 2 * 0.9),