-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPly.cs
151 lines (137 loc) · 5.64 KB
/
Ply.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
namespace omnipede;
using System.Numerics;
using System.Text.Json;
public class Ply
{
public BigInteger startX { get; set; }
public BigInteger startY { get; set; }
public BigInteger endX { get; set; }
public BigInteger endY { get; set; }
public int pieceToMoveIndex { get; set; }
public uint startBinary { get; set; }
public uint endBinary { get; set; }
public int? tempPieceIndex { get; set; } = null;
public bool hasMoved { get; set; }
public List<Tuple<Piece, int>> piecesToRemove { get; set; } = new();
public List<Tuple<Piece, int>> piecesToAdd { get; set; } = new();
public string HashString()
{
List<int> list = new();
list.Add((int)(startX & 0b_0111_1111_1111_1111_1111_1111_1111_1111));
list.Add((int)(startY & 0b_0111_1111_1111_1111_1111_1111_1111_1111));
list.Add((int)(endX & 0b_0111_1111_1111_1111_1111_1111_1111_1111));
list.Add((int)(endY & 0b_0111_1111_1111_1111_1111_1111_1111_1111));
list.Add(pieceToMoveIndex);
list.Add((int)startBinary);
list.Add((int)endBinary);
list.Add(hasMoved ? 1 : 0);
if (tempPieceIndex != null)
{
list.Add((int)tempPieceIndex);
}
return JsonSerializer.Serialize(list)+JsonSerializer.Serialize(piecesToRemove)+JsonSerializer.Serialize(piecesToAdd);
}
public Ply(){}
public Ply(GameState gameState, int pieceToMoveIndexNew, BigInteger xOffset, BigInteger yOffset, List<Tuple<Piece, int>> piecesToRemoveNew , List<Tuple<Piece, int>> piecesToAddNew)
{
pieceToMoveIndex = pieceToMoveIndexNew;
Piece pieceToMove = gameState.pieces[pieceToMoveIndex];
startX = pieceToMove.x;
startY = pieceToMove.y;
endX = pieceToMove.x + xOffset;
endY = pieceToMove.y + yOffset;
startBinary = pieceToMove.binary;
endBinary = pieceToMove.binary;
hasMoved = pieceToMove.hasMoved;
piecesToRemove = piecesToRemoveNew;
piecesToAdd = piecesToAddNew;
if (gameState.tempPieceIndex is not null)
{
piecesToRemove.Add(new Tuple<Piece, int>(gameState.pieces[(int)gameState.tempPieceIndex-piecesToRemove.Count], (int)gameState.tempPieceIndex-piecesToRemove.Count));
tempPieceIndex = gameState.tempPieceIndex;
}
}
public static GameState DoPly(GameState gameState, Ply ply)
{
gameState.currentTurn = NextTurn(gameState.currentTurn);
gameState.pieces[ply.pieceToMoveIndex].x = ply.endX;
gameState.pieces[ply.pieceToMoveIndex].y = ply.endY;
gameState.pieces[ply.pieceToMoveIndex].hasMoved = true;
gameState.pieces[ply.pieceToMoveIndex].binary = ply.endBinary;
gameState.tempPieceIndex = null;
foreach (var piece in ply.piecesToRemove)
{
gameState.pieces.RemoveAt(piece.Item2);
}
foreach (var piece in ply.piecesToAdd)
{
gameState.pieces.Insert(piece.Item2, piece.Item1);
gameState.tempPieceIndex = piece.Item2;
}
return gameState;
}
public static GameState UndoPly(GameState gameState, Ply ply)
{
ply.piecesToAdd.Reverse();
ply.piecesToRemove.Reverse();
foreach (var piece in ply.piecesToAdd)
{
gameState.pieces.RemoveAt(piece.Item2);
}
foreach (var piece in ply.piecesToRemove)
{
gameState.pieces.Insert(piece.Item2, piece.Item1);
}
gameState.pieces[ply.pieceToMoveIndex].binary = ply.startBinary;
gameState.tempPieceIndex = ply.tempPieceIndex;
gameState.pieces[ply.pieceToMoveIndex].hasMoved = ply.hasMoved;
gameState.pieces[ply.pieceToMoveIndex].y = ply.startY;
gameState.pieces[ply.pieceToMoveIndex].x = ply.startX;
gameState.currentTurn = PreviousTurn(gameState.currentTurn);
//ply.piecesToAdd.Reverse();
//ply.piecesToRemove.Reverse();
return gameState;
}
static uint NextTurn(uint currentTurn)
{
switch (currentTurn)
{
case Piece.Color.White:
currentTurn = Piece.Color.Black;
break;
case Piece.Color.Black:
currentTurn = Piece.Color.White;
break;
}
return currentTurn;
}
static uint PreviousTurn(uint currentTurn)
{
switch (currentTurn)
{
case Piece.Color.White:
currentTurn = Piece.Color.Black;
break;
case Piece.Color.Black:
currentTurn = Piece.Color.White;
break;
}
return currentTurn;
}
public string DebugString()
{
string returnString = "";
returnString = returnString+"Ply:";
returnString = returnString+"\n startX: "+startX;
returnString = returnString+"\n startY: "+startY;
returnString = returnString+"\n endX: "+endX;
returnString = returnString+"\n endY: "+endY;
returnString = returnString+"\n pieceToMoveIndex: "+pieceToMoveIndex;
returnString = returnString+"\n hasMoved: "+hasMoved;
returnString = returnString+"\n piecesToAdd: "+piecesToAdd.Count;
returnString = returnString+"\n piecesToRemove: "+piecesToRemove.Count;
returnString = returnString+"\n startBinary: "+Convert.ToString(startBinary, toBase: 2);
returnString = returnString+"\n endBinary: "+Convert.ToString(endBinary, toBase: 2);
return returnString;
}
}