-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBoardUnit.pas
126 lines (112 loc) · 2.95 KB
/
BoardUnit.pas
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
unit BoardUnit;
interface
// èñïîëüçóåòñÿ äëÿ ñîðòèðîâêè õîäîâ
Const WP=19; //010011 // áåëàÿ ïðîñòàÿ
Const WD=11; //001011 // áåëàÿ äàìêà
Const BP=21; //010101 // ÷åðíàÿ ïðîñòàÿ
Const BD=13; //001101 // ÷åðíàÿ äàìêà
Const ZZ=32; //100000 // ïîëå çà ïðåäåëàìè äîñêè
// ïóòàÿ êëåòêà - 0 (íîëü)
var poleDosk,doskPole,nomkto:array[0..255] of Byte;
var MapEd:array[0..31] of byte;
Var PWtoED,PBtoED:array[0..255] of Byte;
// ñòðóêòóðà äàííûõ - õîä
Type Move=Record
ot: Byte; // îòêóäà ïðîèçâîäèòñÿ õîä
ku: Byte; // êóäà â èòîãå ïåðåìåùàåòñÿ øàøêè
Kto: Byte; // íîìèíàë øàøêè äî õîäà
Chto: Byte; // íîìèíàë øàøêè ïîñëå õîäà
kolCap: Byte; // êîëè÷åñòâî ñúåäåííûõ øàøåê
CapSQ: Array[0..31] of Byte; // ïîëÿ íà êîòîðûõ ñúåäàþòñÿ øàøêè
CapT: Array[0..31] of Byte; // íîìèíàë ñúåäåííûõ øàøåê
end;
// Ñòðóêòóðà äàííûõ - ñïèñîê õîäîâ
Type Moves=Record
Mov:Array [0..255] of Move; // ñàìè õîäû
SortMov:Array [0..255] of Byte; // óïîðÿäî÷èâàíèå õîäîâ
SortVAL:Array [0..255] of Cardinal; // çíà÷åíèå óïîðÿäî÷èâàíèÿ
CurrMove:^Move; // ññûëêà íà òåêóùèé ñäåëàííûé õîä
kolMoves:Byte;
Generation:Boolean; // Õîäû ñãåíåðèðîâàíû
z1,z2,z3:Cardinal;
end;
// Ñòðóêòóðà äàííûõ - ñãåíåðèðîâàííûå ïî äåðåâó õîäû
Type MovesTree=Array[0..255] of Moves;
// Ñãåíåðèðîâàííûå è ñäåëàííûå õîäû ïî äåðåâó
// ñòðóêòóðà äàííûõ - äîñêà
Type Doska=Array[0..255] of Byte;
// ïåðåìåííûå
// ñàìà äîñêà
Var pole:Doska;
Var ochod:Boolean;
Var kolWhite:Byte;
Var kolBlack:Byte;
Var kolWhiteP:Byte;
Var kolBlackP:Byte;
Var kolWhiteD:Byte;
Var kolBlackD:Byte;
// Ïåðåìåííûå äëÿ äåðåâà
Var GLPly:Byte; // ãëóáèíà äåðåâà, êîëè÷åñòâî ñäåëàííûõ õîäîâ
Var MovTree:MovesTree; // äåðåâî õîäîâ
Var TekMoves:^Moves; // ññûëêà íà òåêóùèå ñãåíåðèðîâàííûå õîäû
Var Nodes:int64;
Var MaxPLY:Byte;
// Ïðîöåäóðû
procedure initTree; // Èíèöèàëèçàöèÿ äåðåâà
Procedure InitBoard; // Ðàññòàíîâêà íà÷àëüíîé ïîçèöèè
implementation
procedure initTree;
Begin
GLPly:=0;
Nodes:=0;
MaxPLY:=0;
TekMoves:=@(MovTree[0]);
end;
Procedure InitBoard;
var i,j,ot,k:Byte;
Begin
nomkto[11]:=0;
nomkto[13]:=1;
nomkto[19]:=2;
nomkto[21]:=3;
PWtoED[0]:=4;
PWtoED[11]:=9;
PWtoED[13]:=10;
PWtoED[19]:=1;
PWtoED[21]:=2;
PBtoED[0]:=4;
PBtoED[11]:=10;
PBtoED[13]:=9;
PBtoED[19]:=2;
PBtoED[21]:=1;
k:=0;
for i:=0 to 255 do pole[i]:=ZZ;
for i:=2 to 9 do
for j:=1 to 4 do
Begin
ot:=(i shl 4)xor(j shl 1)xor(i And 1);
poleDosk[k]:=ot;
DoskPole[ot]:=k;
k:=k+1;
if i<5
then pole[ot]:=WP
else
Begin
if i>6
then pole[ot]:=BP
else pole[ot]:=0;
end;
end;
kolWhite:=12;
kolBlack:=12;
kolWhiteP:=12;
kolBlackP:=12;
kolWhiteD:=0;
kolBlackD:=0;
ochod:=true;
initTree;
for i:=0 to 3 do
for j:=0 to 7 do
MapED[j*4+i]:=poleDosk[(7-j)*4+i];
end;
end.