316 lines
7.1 KiB
C#
316 lines
7.1 KiB
C#
using System.Dynamic;
|
||
using Godot;
|
||
|
||
class VirtualBoard {
|
||
private static readonly int boradRows = 9;
|
||
private static readonly int boradCols = 10;
|
||
private readonly Node BoardRoot;
|
||
private readonly Node[,] nodesBorad = new Node[boradRows, boradCols];
|
||
|
||
public static bool ArrPosOutOfRange(Vector2 arrayPos) {
|
||
return arrayPos.X < 0 || arrayPos.X >= boradRows || arrayPos.Y < 0 || arrayPos.Y >= boradCols;
|
||
}
|
||
|
||
public Node getNodeFromBoard(Vector2 arrayPos) {
|
||
if (ArrPosOutOfRange(arrayPos)) return null;
|
||
return nodesBorad[(int)arrayPos.X, (int)arrayPos.Y];
|
||
}
|
||
|
||
public void setNodeToBoard(Vector2 arrayPos, Node node) {
|
||
if (ArrPosOutOfRange(arrayPos)) return;
|
||
nodesBorad[(int)arrayPos.X, (int)arrayPos.Y] = node;
|
||
}
|
||
|
||
public VirtualBoard(Node root = null) {
|
||
//?? //GetTree().CurrentScene; // 如果未提供root,默认为当前场景
|
||
BoardRoot = root;
|
||
}
|
||
|
||
public bool MoveNode(Vector2 newPos, Vector2 oldPos) {
|
||
if (ArrPosOutOfRange(newPos) || ArrPosOutOfRange(oldPos)) {
|
||
return false;
|
||
}
|
||
if (getNodeFromBoard(newPos) != null) {
|
||
return false;
|
||
}
|
||
if (getNodeFromBoard(oldPos) is ChessPiece chessPiece) {
|
||
chessPiece.movePos(newPos);
|
||
}
|
||
setNodeToBoard(newPos, getNodeFromBoard(oldPos));
|
||
setNodeToBoard(oldPos, null);
|
||
return true;
|
||
}
|
||
|
||
public bool RemoveNode(Vector2 arrayPos) {
|
||
if (ArrPosOutOfRange(arrayPos)) return false;
|
||
if (getNodeFromBoard(arrayPos) is ChessPiece chessPiece) {
|
||
chessPiece.QueueFree();
|
||
}
|
||
setNodeToBoard(arrayPos, null);
|
||
return true;
|
||
}
|
||
|
||
public void InsertNode(ChessPiece chess, Vector2 arrayPos) {
|
||
chess.Position = PosTrans.transArrToPix * arrayPos;
|
||
setNodeToBoard(arrayPos, chess);
|
||
BoardRoot.AddChild(chess);
|
||
}
|
||
|
||
public void Clear() {
|
||
foreach (var node in BoardRoot.GetChildren()) {
|
||
if (node is ChessPiece chessPiece) {
|
||
chessPiece.QueueFree();
|
||
}
|
||
}
|
||
}
|
||
|
||
// using Godot;
|
||
|
||
// public enum ChessType
|
||
// {
|
||
// Carriage,
|
||
// Horse,
|
||
// Elephant,
|
||
// Advisor,
|
||
// General,
|
||
// Cannon,
|
||
// Pawn
|
||
// }
|
||
|
||
// public class VirtualBoard
|
||
// {
|
||
// // ...其他原有成员变量...
|
||
|
||
// public VirtualBoard(Node root = null)
|
||
// {
|
||
// BoardRoot = root ?? GetTree().CurrentScene; // 如果未提供root,默认为当前场景
|
||
// }
|
||
|
||
// public void InitChessBoard()
|
||
// {
|
||
// // 定义黑色和红色棋子的初始位置和类型
|
||
// var positions = new (Vector2 position, ChessType type)[]
|
||
// {
|
||
// // 黑方棋子初始化...
|
||
// // 示例省略具体位置和类型,你需要根据实际情况填写
|
||
// // (new Vector2(x, y), ChessType.Pawn),
|
||
|
||
// // 红方棋子初始化...
|
||
// // 同上
|
||
// };
|
||
|
||
// // 初始化棋子
|
||
// foreach (var (position, type) in positions)
|
||
// {
|
||
// var color = position.Y == 0 ? new Color("black") : new Color("red"); // 根据行判断颜色
|
||
// var piece = CreateChessPiece(type, color);
|
||
// InsertChess(piece, position);
|
||
// }
|
||
// }
|
||
|
||
// private ChessPiece CreateChessPiece(ChessType type, Color labelColor)
|
||
// {
|
||
// // 根据ChessType创建对应的棋子实例并设置Label和颜色
|
||
// // 这里需要你实现具体的逻辑,例如switch case或映射表来决定创建哪种棋子
|
||
// // 返回创建的棋子实例
|
||
// }
|
||
|
||
// // ...其他原有方法...
|
||
// }
|
||
|
||
public void InitChessBoard() {
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(0, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(1, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(2, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(3, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "将",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(4, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(5, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(6, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(7, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(8, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(1, 2));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(7, 2));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(0, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(2, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(4, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(6, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(8, 3));
|
||
|
||
// -----------------------------------
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(0, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(1, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(2, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(3, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "将",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(4, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(5, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(6, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(7, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(8, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(1, 7));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(7, 7));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(0, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(2, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(4, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(6, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(8, 6));
|
||
}
|
||
} |