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),