Subversion Repositories Games.Chess Giants

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
99 pmbaty 1
/*
2
    Texel - A UCI chess engine.
3
    Copyright (C) 2012-2014  Peter Ă–sterlund, peterosterlund2@gmail.com
4
 
5
    This program is free software: you can redistribute it and/or modify
6
    it under the terms of the GNU General Public License as published by
7
    the Free Software Foundation, either version 3 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
15
    You should have received a copy of the GNU General Public License
16
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18
 
19
/*
20
 * book.cpp
21
 *
22
 *  Created on: Feb 25, 2012
23
 *      Author: petero
24
 */
25
 
26
#include "book.hpp"
27
#include "position.hpp"
28
#include "moveGen.hpp"
29
#include "textio.hpp"
30
#include "util/timeUtil.hpp"
31
 
32
#include <cassert>
33
 
34
 
35
Book::BookMap Book::bookMap;
36
Random Book::rndGen;
37
 
38
int Book::numBookMoves = -1;
39
 
40
 
41
void
42
Book::getBookMove(Position& pos, Move& out) {
43
    initBook();
44
    out = Move();
45
    BookMap::iterator it = bookMap.find(pos.zobristHash());
46
    if (it == bookMap.end())
47
        return;
48
    const std::vector<BookEntry>& bookMoves = it->second;
49
 
50
    MoveList legalMoves;
51
    MoveGen::pseudoLegalMoves(pos, legalMoves);
52
    MoveGen::removeIllegal(pos, legalMoves);
53
    int sum = 0;
54
    for (size_t i = 0; i < bookMoves.size(); i++) {
55
        const BookEntry& be = bookMoves[i];
56
        bool contains = false;
57
        for (int mi = 0; mi < legalMoves.size; mi++)
58
            if (legalMoves[mi].equals(be.move)) {
59
                contains = true;
60
                break;
61
            }
62
        if  (!contains) {
63
            // If an illegal move was found, it means there was a hash collision.
64
            return;
65
        }
66
        sum += getWeight(be.count);
67
    }
68
    if (sum <= 0)
69
        return;
70
    int rnd = rndGen.nextInt(sum);
71
    sum = 0;
72
    for (size_t i = 0; i < bookMoves.size(); i++) {
73
        sum += getWeight(bookMoves[i].count);
74
        if (rnd < sum) {
75
            out = bookMoves[i].move;
76
            return;
77
        }
78
    }
79
    // Should never get here
80
    assert(false);
81
}
82
 
83
/** Return a string describing all book moves. */
84
std::string
85
Book::getAllBookMoves(const Position& pos) {
86
    initBook();
87
    std::string ret;
88
    BookMap::iterator it = bookMap.find(pos.zobristHash());
89
    if (it != bookMap.end()) {
90
        std::vector<BookEntry>& bookMoves = it->second;
91
        for (size_t i = 0; i < bookMoves.size(); i++) {
92
            BookEntry& be = bookMoves[i];
93
            std::string moveStr = TextIO::moveToString(pos, be.move, false);
94
            ret += moveStr;
95
            ret += '(';
96
            ret += num2Str(be.count);
97
            ret += ") ";
98
        }
99
    }
100
    return ret;
101
}
102
 
103
void
104
Book::initBook() {
105
    if (numBookMoves >= 0)
106
        return;
107
    U64 t0 = currentTimeMillis();
108
    bookMap.clear();
109
    rndGen.setSeed(currentTimeMillis());
110
    numBookMoves = 0;
111
    std::vector<S8> buf;
112
    createBinBook(buf);
113
 
114
    Position startPos(TextIO::readFEN(TextIO::startPosFEN));
115
    Position pos(startPos);
116
    UndoInfo ui;
117
    for (size_t i = 0; i < buf.size(); i += 2) {
118
        int b0 = buf[i]; if (b0 < 0) b0 += 256;
119
        int b1 = buf[i+1]; if (b1 < 0) b1 += 256;
120
        int move = (b0 << 8) + b1;
121
        if (move == 0) {
122
            pos = startPos;
123
        } else {
124
            bool bad = ((move >> 15) & 1) != 0;
125
            int prom = (move >> 12) & 7;
126
            Move m(move & 63, (move >> 6) & 63,
127
                   promToPiece(prom, pos.isWhiteMove()));
128
            if (!bad)
129
                addToBook(pos, m);
130
            pos.makeMove(m, ui);
131
        }
132
    }
133
    if (verbose) {
134
        S64 t1 = currentTimeMillis();
135
        std::stringstream ss;
136
        ss.precision(3);
137
        ss << std::fixed << ((t1 - t0) / 1000.0);
138
        std::cout << "Book moves:" << numBookMoves << " (parse time:" << ss.str() << ')' << std::endl;
139
    }
140
}
141
 
142
/** Add a move to a position in the opening book. */
143
void
144
Book::addToBook(const Position& pos, const Move& moveToAdd) {
145
    BookMap::iterator it = bookMap.find(pos.zobristHash());
146
    if (it == bookMap.end())
147
        it = bookMap.insert(std::make_pair(pos.zobristHash(),
148
                                           std::vector<BookEntry>())).first;
149
 
150
    std::vector<BookEntry>& ent = it->second;
151
    for (size_t i = 0; i < ent.size(); i++) {
152
        BookEntry& be = ent[i];
153
        if (be.move.equals(moveToAdd)) {
154
            be.count++;
155
            return;
156
        }
157
    }
158
    BookEntry be(moveToAdd);
159
    ent.push_back(be);
160
    numBookMoves++;
161
}
162
 
163
int
164
Book::getWeight(int count) {
165
    double tmp = ::sqrt((double)count);
166
    return (int)(tmp * ::sqrt(tmp) * 100 + 1);
167
}
168
 
169
void
170
Book::createBinBook(std::vector<S8>& binBook) {
171
    for (size_t i = 0; bookLines[i]; i++) {
172
        const char* line = bookLines[i];
173
        if (!addBookLine(line, binBook)) {
174
            std::cout << "Book parse error, line:" << i << std::endl;
175
            assert(false);
176
        }
177
//        std::cout << "no:" << i << " line:" << line << std::endl;
178
    }
179
}
180
 
181
/** Add a sequence of moves, starting from the initial position, to the binary opening book. */
182
bool
183
Book::addBookLine(const std::string& line, std::vector<S8>& binBook) {
184
    Position pos(TextIO::readFEN(TextIO::startPosFEN));
185
    UndoInfo ui;
186
    std::vector<std::string> strMoves;
187
    splitString(line, strMoves);
188
    for (size_t i = 0; i < strMoves.size(); i++) {
189
        std::string strMove = strMoves[i];
190
//        std::cout << "Adding move:" << strMove << std::endl;
191
        int bad = 0;
192
        if ((strMove.length() > 0) && (strMove[strMove.length()-1] == '?')) {
193
            strMove = strMove.substr(0, strMove.length() - 1);
194
            bad = 1;
195
        }
196
        Move m(TextIO::stringToMove(pos, strMove));
197
        if (m.isEmpty())
198
            return false;
199
        int prom = pieceToProm(m.promoteTo());
200
        int val = m.from() + (m.to() << 6) + (prom << 12) + (bad << 15);
201
        binBook.push_back((S8)(val >> 8));
202
        binBook.push_back((S8)(val & 255));
203
        pos.makeMove(m, ui);
204
    }
205
    binBook.push_back((S8)0);
206
    binBook.push_back((S8)0);
207
    return true;
208
}
209
 
210
int
211
Book::pieceToProm(int p) {
212
    switch (p) {
213
    case Piece::WQUEEN:  case Piece::BQUEEN:  return 1;
214
    case Piece::WROOK:   case Piece::BROOK:   return 2;
215
    case Piece::WBISHOP: case Piece::BBISHOP: return 3;
216
    case Piece::WKNIGHT: case Piece::BKNIGHT: return 4;
217
    default:                                  return 0;
218
    }
219
}
220
 
221
int
222
Book::promToPiece(int prom, bool whiteMove) {
223
    switch (prom) {
224
    case 1: return whiteMove ? Piece::WQUEEN : Piece::BQUEEN;
225
    case 2: return whiteMove ? Piece::WROOK  : Piece::BROOK;
226
    case 3: return whiteMove ? Piece::WBISHOP : Piece::BBISHOP;
227
    case 4: return whiteMove ? Piece::WKNIGHT : Piece::BKNIGHT;
228
    default: return Piece::EMPTY;
229
    }
230
}
231
 
232
 
233
 
234
const char*
235
Book::bookLines[] = {
236
    // Philidors defense
237
    "e4 e5 Nf3 d6? d4 exd4 Nxd4 Nf6 Nc3 Be7 Bf4 O-O Qd2 d5 exd5 Nxd5 Nxd5 Qxd5 Nb5 Qe4+",
238
    "e4 e5 Nf3 d6? d4 exd4 Nxd4 Nf6 Nc3 Be7 Bf4 O-O Qd2 a6 O-O-O b5 f3 c5",
239
    "e4 e5 Nf3 d6? d4 exd4 Qxd4 Nf6 Nc3 Be7 Bg5? Nc6 Bb5 O-O",
240
 
241
    // Nordic gambit
242
    "e4 e5 d4? exd4 c3 dxc3 Bc4? cxb2 Bxb2 d5 Bxd5 Nf6 Bxf7+ Kxf7 Qxd8 Bb4+",
243
    "e4 e5 d4? exd4 c3 d5? exd5 Qxd5 cxd4 Nc6 Nf3 Bg4 Be2 Bb4 Nc3 Bxf3 Bxf3 Qc4",
244
    "e4 e5 d4? exd4 c3 d5? exd5 Qxd5 Nf3 Nc6 cxd4",
245
    "e4 e5 d4? exd4 c3 d5? exd5 Qxd5 Nf3 Nc6 Be2 Nf6",
246
    "e4 e5 d4? exd4 c3 d5? exd5 Qxd5 Nf3 Nc6 Be2 Bg4 O-O O-O-O cxd4",
247
    "e4 e5 d4? exd4 Qxd4 Nc6 Qe3 Nf6 Nc3 Bb4 Bd2 O-O O-O-O Re8 Bc4 d6",
248
 
249
    // Scottish game
250
    "e4 e5 Nf3 Nc6 d4 exd4 Nxd4 Nf6 Nc3 Bb4 Nxc6 bxc6 Bd3 d5 exd5",
251
    "e4 e5 Nf3 Nc6 d4 exd4 Nxd4 Bc5 Be3 Qf6 c3 Nge7 Bc4 Ne5 Bb3",
252
    "e4 e5 Nf3 Nc6 d4 exd4 Nxd4 Bc5 Nb3 Bb6 a4 a5 Nc3 Qf6? Qe2 Nge7",
253
    "e4 e5 d4? exd4 Nf3 Nc6 Nxd4 Nf6 Nxc6 bxc6 e5 Qe7 Qe2 Nd5 c4 Ba6 b3 g6 f4 f6 Ba3 Qf7 Qd2 Nb6",
254
 
255
    // Italian game
256
    "e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 exd4 cxd4 Bb4+ Bd2 Bxd2+ Nbxd2 d5 exd5 Nxd5 Qb3 Nce7",
257
    "e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7? d4 Bb6 O-O d6 h3 Nf6 Re1 O-O Na3",
258
    "e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d3 d6 O-O Qe7? b4 Bb6 a4 a6",
259
    "e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 c3 d6 O-O O-O b4 Bb6",
260
 
261
    // Two knights defense
262
    "e4 e5 Nf3 Nc6 Bc4 Nf6 Nc3 Nxe4 Nxe4 d5 Bd3",
263
    "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ c6? dxc6 bxc6 Be2? h6 Nf3 e4 Ne5 Bd6",
264
    "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ c6? dxc6 bxc6 Be2? h6 Nf3 e4 Ne5 Qc7",
265
    "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ c6? dxc6 bxc6 Bd3 Nd5 Nf3 Bd6 O-O O-O Re1 Re8 Nc3 f5 Nxd5 cxd5",
266
    "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ Bd7 Qe2 Be7 Nc3",
267
    "e4 e5 Nf3 Nc6 Bc4 Nf6 d3 Bc5",
268
 
269
    // Max Lange attack
270
    "e4 e5 Nf3 Nc6 Bc4 Nf6 d4? exd4 O-O Bc5? e5 Ng4 Bf4 d6 exd6 Bxd6 Re1+ Kf8 Bxd6+ Qxd6 c3 Qc5",
271
    "e4 e5 Nf3 Nc6 Bc4 Bc5 O-O Nf6 d4 exd4? e5 d5 exf6 dxc4 Re1+ Be6 Ng5 Qd5? Nc3 Qf5",
272
    "e4 e5 Nf3 Nc6 d4 exd4 Bc4 Nf6 O-O",
273
 
274
    // Scottish gambit
275
    "e4 e5 Nf3 Nc6 Bc4 Nf6 d4? exd4 O-O Nxe4 Re1 d5 Bxd5 Qxd5 Nc3 Qa5 Nxe4 Be6 Neg5 O-O-O Nxe6 fxe6 Rxe6",
276
    "e4 e5 Nf3 Nc6 d4 exd4 Bc4 Nf6 e5 d5 Bb5 Ne4 Nxd4 Bd7 Bxc6 bxc6 O-O Be7 f3 Nc5 f4 Ne4",
277
    "e4 e5 Nf3 Nc6 d4 exd4 Bc4 Nf6 e5 d5 Bb5 Ne4 Nxd4 Bd7 Bxc6 bxc6 O-O Bc5 Be3 O-O? f3 Ng5 Qd2? f6 Kh1",
278
    "e4 e5 Nf3 Nc6 d4 exd4 Bc4 Bc5 O-O d6 c3 Bg4 Qb3 Bxf3 Bxf7 Kf8 gxf3 Ne5 cxd4 Bxd4",
279
    "e4 e5 Nf3 Nc6 d4 exd4 c3? d5 exd5 Qxd5 cxd4 Bg4 Be2 Bb4 Nc3 Bxf3 Bxf3 Qc4 Qb3",
280
 
281
    // Hungarian
282
    "e4 e5 Nf3 Nc6 Bc4 Be7 d4 d6? dxe5 dxe5 Qxd8+ Bxd8",
283
    "e4 e5 Nf3 Nc6 Bc4 Be7 d4 exd4 Nxd4 Nf6",
284
 
285
    // Three and four knights game
286
    "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Nxe5? Qe7 Nf3 Nxb5 Nxb5 Qxe4+ Qe2 Qxe2+ Kxe2 Nd5",
287
    "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Bc4 d6 Nxd4 exd4 Nd5 Nd7 d3 c6 Nf4 g6",
288
    "e4 e5 Nf3 Nf6? Nc3? Nc6 d4 exd4 Nxd4 Bb4 Nxc6 bxc6",
289
 
290
    // Russian defense
291
    "e4 e5 Nf3 Nf6? Nxe5 d6 Nf3 Nxe4 Qe2 Qe7 d3 Nf6 Bg5 Nbd7 Nc3 Qxe2+ Bxe2 h6 Bh4 g6",
292
    "e4 e5 Nf3 Nf6? Nxe5 d6 Nf3 Nxe4 d4 d5 Bd3 Be7 O-O Nc6 Re1 Bg4 c4 Nf6 cxd5 Nxd5 Nc3 O-O Be4 Be6",
293
    "e4 e5 Nf3 Nf6? Nxe5 Qe7 Nf3 Nxe4 Be2 d5 O-O Qd8 Re1 Be7",
294
    "e4 e5 Nf3 Nf6? d4 Nxe4 dxe5 d5 Nbd2 Nc6",
295
 
296
    // Kings gambit
297
    "e4 e5 f4? exf4 Nf3 d5 exd5 Nf6 Nc3? Nxd5 Nxd5 Qxd5 d4 Be7 c4 Qe4+ Be2 Nc6",
298
    "e4 e5 f4? exf4 Nf3 d5 exd5 Nf6 Bb5+ c6 dxc6 Nxc6 d4 Qe7+ Kf2 Ng4+ Kf1 Be6",
299
    "e4 e5 f4? exf4 Nf3 Be7 Bc4 Nf6 e5 Ng4 O-O Nc6 d4 d5 exd6 Bxd6",
300
    "e4 e5 f4? exf4 Bc4 Nf6 Nc3 c6 d4 Bb4 Ne2 d5 exd5 f3",
301
    "e4 e5 f4? d5 exd5 exf4 Nf3 Nf6 Nc3? Nxd5 Bc4 Qe7 Qe2",
302
    "e4 e5 f4? d5 exd5 e4? d3 Nf6 dxe4 Nxe4 Nf3 Bc5 Qe2",
303
 
304
    // Spanish
305
    "e4 e5 Nf3 Nc6 Bb5 d6 d4 Bd7? Nc3 Nf6 O-O Be7 Re1 exd4 Nxd4 O-O",
306
    "e4 e5 Nf3 Nc6 Bb5 d6? d4 exd4 Nxd4 Bd7 Nxc6 bxc6 Bc4 Nf6",
307
    "e4 e5 Nf3 Nc6 Bb5 d6? d4 exd4 Qxd4? Bd7 Bxc6 Bxc6 Nc3 Nf6",
308
    "e4 e5 Nf3 Nc6 Bb5 d6? O-O? Bd7 d4 exd4 Bxc6 Bxc6 Nxd4 Be7",
309
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Nxe4 Re1? Nd6 Nxe5 Be7 Bd3 O-O",
310
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Nxe4 d4 Nd6",
311
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Bc5 c3 O-O d4 Bb6 Bg5 h6 Bh4 d6 a4 a5 Re1 exd4 Bxc6 bxc6 Nxd4",
312
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Bc5 Nxe5 Nxe5 d4 a6 Ba4? b5 Bb3 Bxd4 Qxd4 d6",
313
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Bc5 Nxe5 Nxe5 d4 a6 Be2 Ba7 dxe5 Nxe4 Qd5 Nc5",
314
    "e4 e5 Nf3 Nc6 Bb5 Nf6? O-O Bc5 Nc3? O-O d3 d6",
315
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 h6 d4 Re8 Nbd2 Bf8 Nf1 Bb7 Ng3 Na5? Bc2 Nc4 a4 d5",
316
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 h6 d4 Re8 Nbd2 Bf8 Nf1 Bb7 Ng3 exd4 cxd4",
317
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 h6 d4 Re8 Nbd2 Bb7 Nf1 exd4 cxd4 Bf8 Ng3",
318
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 d4 Bg4 Be3 exd4 cxd4 Na5 Bc2 Nc4 Bc1 c5 b3",
319
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 O-O d4 Bg4 Be3 Bh5 h3",
320
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 O-O d4 Bg4 d5 Na5 Bc2 c6 h3 Bc8 dxc6 Qc7 Nbd2 Qxc6 Nf1 Nc4",
321
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Nc6? d5",
322
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Nc6? h3 Qc7 d5",
323
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 cxd4 cxd4 Qc7",
324
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Qc7 Nbd2 cxd4 cxd4 Bg4 h3 Bh5",
325
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d3 Nc6 Nbd2 O-O Nf1 Re8 h3 h6 Ne3 Bf8",
326
    "Nf3 Nc6 e4 e5 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6 c3 Bc5 Nbd2 O-O Bc2",
327
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6 c3 Be7? Nbd2 Nc5 Bc2 Bg4 Re1",
328
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O b5? Bb3 Bb7 c3 Nxe4? d4 Na5 Bc2 exd4 Bxe4 Bxe4 Re1 d5",
329
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6? O-O Bd7 c3 g6 d4 Bg7 Re1 Nge7 Be3 O-O Nbd2 h6 dxe5 dxe5 Bb3 b6 a4",
330
    "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6? c3 Bd7 d4 Nge7 Bb3 h6 Nbd2 Ng6 Nc4 Be7 Ne3 O-O",
331
 
332
    // Scandinavian
333
    "e4 d5? exd5 Qxd5 Nc3 Qa5 d4 Nf6 Nf3 Bf5 Bc4 e6 Bd2 c6 Qe2 Bb4 Ne5 Nbd7 Nxd7 Nxd7 a3",
334
    "e4 d5? exd5 Qxd5 Nc3 Qa5 d4 c6 Nf3 Nf6 Bc4 Bg4 h3 Bh5 g4 Bg6 Bd2 Qb6 Qe2",
335
    "e4 d5? exd5 Nf6 d4 Nxd5 c4 Nb6 Nf3 g6 Nc3 Bg7 Be3 O-O h3 Nc6 Qd2 e5 d5",
336
    "e4 d5? exd5 Nf6 d4 Nxd5 c4 Nf6 Nf3",
337
    "e4 d5? exd5 Nf6 d4 Nxd5 Nf3 g6 c4 Nb6",
338
    "e4 d5? exd5 Nf6 d4 Nxd5 Nf3 g6 Be2 Bg7 O-O O-O c4 Nb6 Nc3 Nc6 d5 Ne5",
339
 
340
    // Queens gambit accepted
341
    "d4 d5 c4 dxc4? Nf3 Nf6 e3 Bg4? Bxc4 e6 h3 Bh5 Nc3",
342
    "d4 d5 c4 dxc4? Nf3 Nf6 e3 c5 Bxc4 e6",
343
    "d4 d5 c4 dxc4? e3 Nf6 Nf3",
344
    "d4 d5 c4 dxc4? e3 Nf6 Nf3 e6 Bxc4 c5 O-O a6",
345
 
346
    // Queens gambit declined
347
    "d4 d5 c4 e6 Nc3 Nf6 Bg5 Nbd7 e3 Be7 Nf3 O-O Rc1 c6 Qc2 h6 Bh4",
348
    "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O",
349
    "c4 e6 d4 d5 Nf3 Be7 Nc3 Nf6 Bg5? O-O e3 h6",
350
    "d4 d5 c4 e6 Nf3 Be7 Nc3 Nf6 Bf4 dxc4 e3 Nd5",
351
    "d4 d5 c4 e6 Nf3 Nf6 Nc3 c5? cxd5 Nxd5 e4 Nxc3 bxc3",
352
    "c4 Nf6 Nc3? e6 Nf3 d5 d4 Be7 Bg5 O-O e3 Nbd7 Qc2 c5",
353
    "c4 Nf6 Nc3? e6 Nf3 d5 d4 Be7 e3 O-O Bd3 c5",
354
    "Nf3? d5 d4 Nf6 c4 e6 Nc3 Be7 Bf4 O-O e3 c5 dxc5 Bxc5 Qc2 Nc6",
355
    "d4 d5 c4 c6 Nf3 Nf6 Nc3 e6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6 O-O",
356
    "d4 d5 c4 c6 Nf3 Nf6 Nc3 e6 Bg5 h6 Bh4? dxc4 e4 g5 Bg3 b5 Be2 Bb7 Ne5 Bg7 h4 Nbd7",
357
    "d4 d5 c4 c6 Nf3 Nf6 Nc3 e6 Bg5 h6 Bxf6 Qxf6 e3 Bd6",
358
    "d4 d5 c4 c6 Nf3 Nf6 Nc3 e6 Bg5 h6 Bxf6 Qxf6 e3 Nd7 Bd3 dxc4 Bxc4 g6 O-O Bg7",
359
    "d4 d5 c4 c6 Nf3 e6 Nc3 Nf6 e3 Nbd7 Qc2 Bd6 Bd3 O-O O-O dxc4 Bxc4 a6 Rd1 b5 Be2 Qc7 e4 e5",
360
    "d4 d5 c4 c6 Nf3 e6 Qc2 Nf6 e3 Nbd7 Nc3 Bd6 Bd3 O-O O-O dxc4",
361
    "d4 d5 c4 c6 Nf3 e6 Qc2 Nf6 Bg5 h6 Bxf6 Qxf6 Nc3 Nd7 e3 g6 Bd3 Bg7",
362
    "d4 d5 c4 c6 cxd5 cxd5 Nc3 Nf6 Bf4 Nc6 e3 a6",
363
    "d4 d5 c4 c6 cxd5 cxd5 Nc3 Nf6 Bf4 Qb6 Qd2 Nc6 e3 Bf5",
364
    "d4 d5 c4 c6 Nc3 Nf6 e3 e6 Nf3",
365
    "d4 d5 c4 c6 Nc3 Nf6 e3 a6 Nf3 e6 b3 Bb4 Bd2 O-O Bd3 Nbd7 O-O Qe7 Qc2 e5",
366
    "c4 c6? d4 d5",
367
    "Nf3 d5 d4 e6 c4 Nf6 g3 Be7 Bg2 O-O O-O dxc4 Qc2 a6 a4 Bd7 Qxc4 Bc6",
368
    "d4 Nf6 c4 e6 Nf3 d5 g3? dxc4 Bg2 Nc6 Qa4 Bb4+ Bd2 Nd5 Bxb4 Nxb4 O-O Rb8 Nc3 a6 Ne5 O-O",
369
    "d4 Nf6 Nf3? d5",
370
    "d4 Nf6 Nf3? e6 c4 d5 g3 Be7 Bg2 O-O Qc2 c5 O-O cxd4 Nxd4 Nc6",
371
 
372
    // Tarrasch defense
373
    "d4 d5 c4 e6 Nc3 c5? cxd5 exd5 Nf3 Nc6 g3 Nf6 Bg2 Be7 O-O O-O Bg5 cxd4 Nxd4 h6",
374
 
375
    // Budapest defense
376
    "d4 Nf6 c4 e5? dxe5 Ng4 Nf3 Bc5 e3 Nc6 Be2 Ngxe5 O-O d6",
377
 
378
    // Sicilian
379
    "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 e6 Nc3 Qc7 Be2 a6 O-O Nf6 Be3 Be7 f4 d6 Qe1 O-O Rd1 Nxd4 Bxd4 b5 a3",
380
    "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 e6 Nc3 a6 Be2 Qc7 Be3 Nf6 O-O Be7 f4 d6",
381
    "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 e6 Nc3 a6 Bf4 d6 Nxc6 bxc6 Qd2 e5 Bg5 Nf6 O-O-O h6 Bh4 Be6 Be2 Rb8 Kb1 a5",
382
    "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 e5 Ndb5 d6 Bg5 a6 Na3 b5",
383
    "e4 c5 Nf3 Nc6 Nc3 e6 d4 cxd4 Nxd4 Qc7 Be3 a6 Be2 Nf6 O-O Be7 f4 d6 Qe1 O-O",
384
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 f4? e5 Nf3 Qc7 Bd3",
385
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 f4? e6 Qf3 Qb6 Nb3 Qc7",
386
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 f4? Nbd7? Be2",
387
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be2 e5 Nb3 Be7 O-O O-O Be3 Be6",
388
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be3 e5 Nb3 Be6 Qd2 Nbd7 f3 b5",
389
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be3 e5 Nb3 Be6 Qd2 Nbd7 f3 h5 Be2 Be7 Nd5",
390
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be3 e5 Nb3 Be6 f3 Be7 Qd2 O-O O-O-O Nbd7 g4 b5 g5 b4",
391
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 O-O-O Nbd7? g4 b5",
392
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 O-O-O h6 Bh4 Nbd7",
393
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O h6 Nxc6 bxc6 Bf4 d5",
394
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4 Bd7 O-O-O Rc8 Bb3 Ne5 h4 Nc4 Bxc4 Rxc4 g4 Qa5",
395
    "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Be2 a6 O-O Be7 f4 O-O",
396
    "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e5? Bb5+ Bd7 Bxd7+ Qxd7 Nde2 Qg4 O-O Nxe4 Nd5 Qd7 f3 Nf6 Nxf6+ gxf6 Nc3",
397
    "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6 Bd3 Nf6 O-O Qc7 Qe2 d6 c4 g6 Nc3 Bg7 Rd1 O-O",
398
    "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 Be3 a6 Bd3 Nf6 O-O Ne5 h3 Bc5 Qe2 d6",
399
    "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 f4 a6 Be2 b5",
400
    "e4 c5 Nf3 e6 Nc3 Nc6 d4 cxd4 Nxd4 Qc7 Be3 a6 Qd2 Nf6 O-O-O Be7",
401
    "e4 c5 Nc3 Nc6 Nge2? g6 d4 cxd4 Nxd4 Bg7 Be3 Nf6 Bc4 O-O Bb3 d6",
402
    "e4 c5 Nc3 Nc6 f4? d6 Nf3 g6 Bb5 Bd7 O-O Bg7 d3 a6 Bc4 Na5 e5 Nxc4 dxc4 Be6",
403
    "e4 c5 Nc3 Nc6 f4? d6 Nf3 g6 Bb5 Bd7 O-O Bg7 d3 a6 Bc4 e6 f5 b5 Bb3 Nf6 fxe6 Bxe6",
404
    "e4 c5 Nc3 Nc6 f4? g6 Nf3 Bg7 Bb5 Nd4",
405
    "e4 c5 Nc3 Nc6 g3? g6 Bg2 Bg7 d3 d6 f4? e6 Nf3 Nge7 O-O O-O",
406
    "e4 c5 Nc3 Nc6 Nf3 e6 Bb5? Nge7 O-O a6 Bxc6 Nxc6 d4 cxd4 Nxd4 Qc7",
407
    "e4 c5 Nc3 Nc6 Nf3 g6 d4 cxd4 Nxd4",
408
    "e4 c5 Nc3 e6 Nf3 Nc6 d4 cxd4 Nxd4 Qc7 Be2 a6 O-O Nf6 Be3 Bb4",
409
    "e4 c5 Nc3 e6 g3? Nc6 Bg2 Nf6",
410
    "e4 c5 Nc3 a6 Nf3 d6 d4 cxd4 Nxd4 Nf6",
411
    "e4 c5 Nc3 d6 f4? g6 Nf3 Bg7 Bc4 Nc6 O-O Nf6",
412
    "e4 c5 Nc3 d6 Nf3 Nf6 d4 cxd4 Nxd4",
413
    "e4 c5 Nc3 d6 Nf3 Nf6 Bb5+ Bd7 Bxd7+ Qxd7 O-O Nc6",
414
    "Nc3? c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 e4 d6 Bg5 e6 Qd2 a6? O-O-O Bd7 f4 b5",
415
    "Nc3? c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 e4 d6 Bg5 e6 Qd2 Be7 O-O-O Nxd4 Qxd4",
416
    "e4 c5 d4 cxd4 c3? dxc3 Nxc3 Nc6 Nf3 d6 Bc4 e6 O-O Nf6 Qe2 Be7 Rd1 e5",
417
    "e4 c5 d4? cxd4 c3? dxc3 Nxc3 Nc6 Nf3 e6 Bc4 a6 O-O b5 Bd3 Bb7",
418
    "e4 c5 d4? cxd4 Nf3 d6 Nxd4",
419
    "e4 c5 c3 d5 exd5 Qxd5 d4 Nf6 Nf3 Bg4? Be2 e6 O-O Nc6 Be3? cxd4 cxd4 Be7",
420
    "e4 c5 c3 d5 exd5 Qxd5 d4 Nf6 Nf3 Bg4? Be2 e6 O-O Nc6 h3 Bh5 Be3",
421
    "e4 c5 c3? d5 exd5 Qxd5 d4 Nf6 Nf3 e6 Na3 Nc6 Be2 Qd8 Nc2 b6 O-O Bb7",
422
    "e4 c5 c3? Nf6 e5 Nd5 Nf3 Nc6 Bc4 Nb6 Bb3 c4 Bc2 Qc7 Qe2 g5",
423
    "e4 c5 f4 d5 exd5 Nf6 Bb5+ Bd7 Bxd7+ Qxd7 c4 e6 Qe2 Bd6 f5 O-O fxe6 fxe6 dxe6",
424
    "e4 c5 Nc3? d6 Nf3 Nf6 d4 cxd4 Nxd4 a6 Be3 e5 Nb3 Be6 Qd2 Nbd7 f3 h5 Be2 Be7 Nd5 Bxd5 exd5",
425
    "e4 c5 Nf3 g6? c3 Bg7 d4 cxd4 cxd4 d5 e5 Nc6 h3 e6 Nc3",
426
 
427
    // French defense
428
    "d4 e6 e4 d5 exd5 exd5 Nf3 Nf6 Bd3 Bd6 O-O O-O Bg5 Bg4 Nbd2 Nbd7 c3 c6 Qc2 Qc7",
429
    "e4 e6 d4 d5 exd5 exd5 Bd3 Bd6 Nf3 Nf6",
430
    "e4 e6 d4 d5 exd5 exd5 Bd3 Bd6 Nf3 Ne7 O-O O-O Bg5 f6 Bd2 Bf5",
431
    "e4 e6 d4 d5 e5? c5 c3 Nc6 Nf3 Qb6 Be2 cxd4 cxd4 Nge7 Nc3 Nf5 Na4 Qa5+ Bd2 Bb4 Bc3",
432
    "e4 e6 d4 d5 e5? c5 c3 Nc6 Nf3 Qb6 Bd3? cxd4 cxd4 Bd7",
433
    "e4 e6 d4 d5 e5? c5 c3 Nc6 Nf3 Qb6 a3? c4 Nbd2 Na5 Be2 Bd7",
434
    "e4 e6 d4 d5 e5? c5 c3 Nc6 Nf3 Bd7 Be2 Nge7 O-O Rc8",
435
    "e4 e6 d4 d5 Nc3 Nf6 Bg5? Be7 e5 Nfd7 Bxe7 Qxe7",
436
    "e4 e6 d4 d5 Nc3 Nf6 exd5 exd5 Nf3 Bd6 Bd3 O-O O-O",
437
    "e4 e6 d4 d5 Nd2 Nf6 e5 Nfd7 Bd3 c5 c3 Nc6 Ne2 cxd4 cxd4 f6 exf6 Nxf6",
438
    "e4 e6 d4 d5 Nd2 c5 Ngf3 Nf6 exd5 exd5 Bb5+ Bd7 Bxd7+ Nbxd7 O-O Be7 dxc5 Nxc5",
439
    "e4 e6 d4 d5 Nc3 Nf6 e5 Nfd7 f4 c5 Nf3 Nc6 Be3 cxd4 Nxd4 Bc5 Qd2 O-O O-O-O a6",
440
    "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3 Ne7 Qg4 Qc7? Qxg7 Rg8 Qxh7 cxd4 Ne2 Nbc6 f4 Bd7",
441
    "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3 Ne7 Qg4 O-O Nf3 Nbc6 Bd3 f5 exf6 Rxf6 Bg5 Rf7",
442
    "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3 Qc7? Qg4 f6? f4 f5 Qg3 cxd4 cxd4 Ne7 c3 b6",
443
    "e4 e6 d4 d5 Nc3 Bb4 e5 c5 Qg4? Ne7 dxc5 Nbc6 Bd2? O-O",
444
    "e4 e6 d4 d5 Nc3 Bb4 e5 c5 Nf3? Ne7 a3 Bxc3+ bxc3",
445
    "e4 e6 d4 d5 Nc3 Bb4 e5 Ne7 a3 Bxc3+ bxc3 c5 Qg4 O-O Bd3 c4 Bh6 Ng6 Bxg6 fxg6 Be3 Nc6",
446
    "e4 e6 d4 c5? d5 exd5 exd5 d6 Nf3 Nf6 c4",
447
    "e4 e6 d4 c5? d5 Nf6 Nc3 d6 Nf3 exd5 exd5 Be7 Bc4 O-O",
448
    "e4 e6 d3? d5 Nd2 c5 Ngf3 Nc6 g3 Nf6 Bg2 Be7 O-O O-O",
449
 
450
    // Caro Kann defense
451
    "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 Bh7 Bd3 Bxd3 Qxd3 Qc7 Bd2 Ngf6 O-O-O e6",
452
    "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 Bh7 Bd3 Bxd3 Qxd3 e6 Bf4 Qa5+ Bd2 Qc7 O-O-O Ngf6 Ne4",
453
    "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 Bh7 Bd3 Bxd3 Qxd3 e6 Bf4 Qa5+ Bd2 Bb4 Ne4? Bxd2+ Nfxd2 Ngf6 Nd6+ Ke7 Nxb7 Qb4 Qb3 Qxd4",
454
    "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 Bh7 Bd3 Bxd3 Qxd3 e6 Bf4 Qa5+ Bd2 Bb4 c3 Be7 c4 Qc7",
455
    "e4 c6 d4 d5 Nd2 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 Bd3 Bxd3 Qxd3 Qc7 Bd2 Ngf6",
456
    "e4 c6 d4 d5 Nd2 dxe4 Nxe4 Bf5 Ng3 Bg6 Nf3 Nd7 Bd3 e6 O-O",
457
    "e4 c6 d4 d5 exd5 cxd5 c4 Nf6 Nc3 e6 Nf3 Be7 cxd5 Nxd5 Bd3 Nc6 O-O O-O Re1 Nf6",
458
    "e4 c6 d4 d5 e5 Bf5 Nf3 e6 Be2 c5 O-O Nc6 c3 cxd4 cxd4 Nge7 Nc3 Nc8? Be3 Nb6 Rc1 Be7",
459
    "e4 c6 d4 d5 e5 Bf5 Nf3 e6 Be2 c5 O-O Nc6 c3 cxd4 cxd4 Nge7 Nc3 Bg4 Bg5 Qb6 Na4 Qc7 Rc1 Nf5 h3 Bxf3 Bxf3 Be7 Be3 O-O",
460
    "e4 c6 d4 d5 e5 Bf5 Nf3 e6 Be2 c5 Be3 Qb6? Nc3 Nc6 O-O Qxb2? Nb5",
461
    "e4 c6 d4 d5 e5 Bf5 Nf3 e6 Be2 c5 Be3 cxd4 Nxd4 Ne7 c4 Nbc6 Qa4 a6",
462
    "e4 c6 d4 d5 e5 Bf5 Nf3 e6 Be2 Nd7 O-O Ne7 Nbd2 h6 c3 Qc7 Re1 O-O-O",
463
    "e4 c6 d4 d5 e5 Bf5 Nd2 e6 Nb3 Nd7 Nf3 Qc7",
464
    "e4 c6 d3? d5 Nd2 e5 Ngf3 Bd6 g3 Nf6 Bg2 O-O O-O",
465
 
466
    // Aljechins defense
467
    "e4 Nf6? e5 Nd5 d4 d6 c4 Nb6 exd6 cxd6 Be3 g6 Nc3 Bg7",
468
    "e4 Nf6? e5 Nd5 d4 d6 c4 Nb6 exd6 cxd6 Nc3 g6 Be3 Bg7",
469
    "e4 Nf6? e5 Nd5 d4 d6 c4 Nb6 exd6 exd6 Nc3 Be7 Bd3 Nc6 Nge2 Bg4 f3 Bh5 O-O O-O b3",
470
    "e4 Nf6? e5 Nd5 d4 d6 Nf3 Bg4 Be2 e6 c4 Nb6 exd6 cxd6",
471
    "e4 Nf6? e5 Nd5 d4 d6 Nf3 Bg4 Be2 e6 O-O Be7 c4 Nb6 Nc3 O-O Be3 N8d7 exd6 cxd6 b3",
472
    "e4 Nf6? e5 Nd5 d4 d6 Nf3 g6 c4 Nb6 exd6 cxd6",
473
    "e4 Nf6? e5 Nd5 c4 Nb6 d4 d6 exd6 cxd6 Nf3 g6 Be2 Bg7 O-O O-O Nc3 Nc6 h3",
474
    "e4 Nf6? e5 Nd5 c4 Nb6 d4 d6 Nf3 Bg4 exd6 exd6 Be2 Be7 O-O O-O Nc3 Nc6 b3 Bf6 Be3 d5",
475
    "e4 Nf6? Nc3? d5? e5 Nfd7 d4? e6 f4 c5 Nf3 Nc6 Be3 a6 Qd2 b5 dxc5 Bxc5 Bxc5 Nxc5",
476
    "e4 Nf6? Nc3? d5? e5 Nfd7 d4? e6 f4 c5 Nf3 Nc6 Be3 cxd4 Nxd4 Bc5 Qd2 O-O O-O-O a6",
477
    "e4 Nf6? Nc3? e5",
478
 
479
    // Kings indian
480
    "d4 Nf6 c4 g6? Nc3 Bg7? e4 d6 Nf3 O-O Be2 e5 O-O exd4 Nxd4 Re8",
481
    "d4 Nf6 c4 g6? Nc3 Bg7? e4 d6 Nf3 O-O Be2 e5 O-O Nc6? d5 Ne7 Ne1 Nd7 Nd3 f5 Bd2 fxe4 Nxe4",
482
    "d4 Nf6 c4 g6? Nc3 Bg7? g3? O-O Bg2 d6? Nf3 Nbd7 O-O e5",
483
    "d4 Nf6 c4 g6? Nc3 Bg7? g3? d5 cxd5 Nxd5 Bg2",
484
    "d4 Nf6 c4 g6? Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Nf3 c5 Rb1 O-O Be2 cxd4? cxd4 Qa5",
485
    "d4 Nf6 c4 g6? Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Nf3 c5 Rb1 O-O Be2 Nc6 d5",
486
    "c4 Nf6 Nf3 g6? d4 Bg7 Nc3 O-O e4 d6 Be2",
487
    "c4 Nf6 Nc3? g6? d4 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 c5",
488
    "Nf3? Nf6 c4 g6? Nc3 Bg7 d4 O-O",
489
    "d4 Nf6 c4 d6? Nf3 Nbd7 Nc3 e5 e4 exd4 Nxd4 g6 Be2 Bg7 O-O O-O",
490
    "e4 g6? d4 Bg7 Nc3 d6 f4? Nf6 Nf3 O-O Bd3 Nc6? O-O e5",
491
    "d4 g6? e4 Bg7 Nc3 d6 f4? Nf6 Nf3 O-O Bd3 Na6 O-O c5 d5 Rb8 a3 Nc7 a4 b6",
492
 
493
    // English opening
494
    "c4 Nf6 Nf3 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d4 cxd4 Nxd4 O-O O-O Nxd4 Qxd4 d6",
495
    "c4 e5 Nc3 Nf6 Nf3 Nc6 g3 d5 cxd5 Nxd5 Bg2 Nb6 O-O Be7 d3 O-O a3 Be6 b4? a5 b5 Nd4",
496
    "c4 e5 Nc3 Nf6 Nf3 Nc6 g3 d5 cxd5 Nxd5 Bg2 Nb6 O-O Be7 d3 O-O a3 Be6 Be3 f5 Rc1",
497
    "c4 e5 Nc3 Nf6 g3 d5 cxd5 Nxd5 Bg2 Nb6 Nf3 Nc6 O-O Be7 a3 O-O b4 Be6 d3",
498
    "c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 d6 Nge2 h5 h4 Bg4",
499
    "c4 Nf6 Nc3? e5 Nf3 Nc6 g3 d5 cxd5 Nxd5 Bg2 Nb6 d3 Be7 O-O O-O",
500
    "c4 Nf6 g3? g6 Bg2 Bg7 Nc3 O-O e4 d6 Nge2 c5 O-O Nc6 d3 a6 h3 Rb8 a4",
501
    "c4 Nf6 g3? e5 Bg2 c6",
502
    "c4 Nf6 g3? e6 d4 d5 Nf3 dxc4 Bg2 a6 O-O Nc6",
503
 
504
    // Queen indian
505
    "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 O-O O-O Nc3 Ne4 Qc2 Nxc3 Qxc3 c5",
506
    "d4 e6 Nf3 Nf6 c4 b6 g3 Bb7 Bg2 Bb4 Bd2 Bxd2 Qxd2",
507
    "d4 e6 Nf3 Nf6 c4 b6 g3 Bb7 Bg2 c5 d5 exd5 Nh4 g6 Nc3 Bg7 O-O d6 Bg5 Qd7",
508
    "c4 Nf6 d4 e6 Nf3 b6 Nc3? Bb7 a3 d5 cxd5 Nxd5 Qc2",
509
    "c4 Nf6 d4 e6 Nf3 b6 e3 Bb7 Bd3 d5 cxd5 exd5 Nc3 Bd6",
510
    "d4 Nf6 c4 e6 Nf3 b6 a3 Bb7",
511
 
512
    // Nimzo indian
513
    "d4 e6 c4 Nf6 Nc3 Bb4 Bg5? h6 Bh4 c5 d5 d6",
514
    "c4 e6 d4 Nf6 Nc3 Bb4 a3? Bxc3+ bxc3 c5 f3? d5",
515
    "d4 Nf6 c4 e6 Nc3 Bb4 Qc2? d5 a3 Bxc3+ Qxc3 Ne4? Qc2 O-O e3 b6 Bd3",
516
    "d4 Nf6 c4 e6 Nc3 Bb4 Qc2? d5 a3 Bxc3+ Qxc3 O-O Bg5 dxc4 Qxc4 b6 Nf3 Ba6 Qa4 h6 Bh4",
517
    "d4 Nf6 c4 e6 Nc3 Bb4 Qc2? O-O a3 Bxc3+ Qxc3 b6 Bg5 Bb7 e3 d6",
518
    "d4 Nf6 c4 e6 Nc3 Bb4 Nf3 O-O Bg5 h6 Bh4 c5",
519
    "d4 Nf6 c4 e6 Nc3 Bb4 Nf3 O-O e3 c5 Bd3 d5",
520
    "d4 Nf6 c4 e6 Nc3 Bb4 Nf3 b6 e3 Bb7 Bd3 O-O O-O c5 Na4 d6 a3 Ba5 Rb1 Na6 Nd2 Qd7 Nc3",
521
    "d4 Nf6 c4 e6 Nc3 Bb4 f3? d5 a3 Bxc3+ bxc3 c5 cxd5? exd5 e3 c4",
522
    "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Bd3 d5 Nf3 O-O O-O Nc6? cxd5 exd5 dxc5 Bxc5 b3 Bg4 Bb2",
523
    "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Bd3 O-O Ne2 d5 cxd5 cxd4 exd4 Nxd5 O-O Nc6",
524
    "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3 d5 Nf3 c5 O-O dxc4 Bxc4 Nbd7 Qe2 b6 Rd1",
525
    "c4 Nf6 Nc3? e6 d4",
526
 
527
    // Benoni
528
    "d4 Nf6 Nf3 e6 c4 c5? d5 exd5 cxd5 d6 Nc3 g6 e4 Bg7",
529
    "d4 Nf6 Nf3 e6 c4 c5? d5 b5? dxe6 fxe6 cxb5 a6 e3 Be7 Nc3 O-O a4 Bb7",
530
    "d4 Nf6 c4 c5? d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4? Bg7 Bb5 Nfd7 a4 O-O Nf3 Na6 O-O Nc7",
531
    "d4 c5? d5 Nf6 c4 e6 Nc3 exd5 cxd5 d6 Nf3 g6 Bf4 a6 a4 Bg7 e4 O-O",
532
    "c4 Nf6 d4 g6? Nc3 Bg7 g3? O-O Bg2 c5 d5 e6 Nf3 exd5 cxd5 d6 O-O",
533
    "d4 c5? d5 Nf6 c4 e6 g3? exd5 cxd5 d6 Nc3 g6 Nf3 Bg7 Bg2 O-O",
534
 
535
    // Reti's opening
536
    "Nf3 d5 g3? g6 Bg2 Bg7 O-O? e5 d3 Ne7 Nbd2 O-O c4 c6",
537
    "Nf3 d5 g3? g6 Bg2 Bg7 d4 Nf6 c4 c6",
538
    "Nf3 d5 g3? g6 Bg2 Nf6 O-O Bg7 d4",
539
    "Nf3 Nf6 g3? g6? c4 Bg7 Bg2 O-O O-O? c5 d4 d6? d5 Na6 Nc3 Nc7",
540
    "Nf3 Nf6 g3? g6? c4 Bg7 Bg2 O-O O-O? c5 d4 cxd4 Nxd4 Nc6 Nc3 Nxd4 Qxd4 d6",
541
    "Nf3 Nf6 g3? g6? c4 Bg7 Bg2 O-O d4 c6 O-O d5 cxd5 cxd5",
542
    "Nf3 Nf6 g3? g6? c4 Bg7 Bg2 c6 Nc3 d5 cxd5 cxd5 d4",
543
    "Nf3 Nf6 g3? d5 d4 c5 Bg2 Nc6 O-O",
544
    "Nf3 Nf6 g3? d5 Bg2 c6 d4 Bf5 O-O g6",
545
    "Nf3 Nf6 d4",
546
    "Nf3 Nf6 c4 e6 d4 d5 Nc3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6 e4 c5 d5 c4 Bc2 e5 O-O Bd6 Ne2 O-O",
547
    "Nf3 d5 d4 Nf6 c4 e6 g3 dxc4 Bg2 Nc6 Qa4 Bb4 Bd2 Nd5 Bxb4 Nxb4 O-O Rb8",
548
    "Nf3 c5 c4 Nf6 Nc3 e6 g3 Be7? Bg2 O-O O-O a6? d4 cxd4 Nxd4 Qc7",
549
    "Nf3 c5 c4 Nf6 Nc3 e6 g3 b6 Bg2 Bb7 O-O Be7 d4 cxd4 Qxd4 d6",
550
    "Nf3 Nf6 c4 e6 d4 d5 Nc3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 Bb7 O-O",
551
    "g3? g6 Bg2 Bg7 c4 Nf6 Nc3 O-O Nf3 d6? d4 Nbd7 O-O e5 e4",
552
    "g3? g6 Bg2 Bg7 c4 Nf6 Nc3 O-O Nf3 c6 d4 d5 cxd5 cxd5 O-O Ne4 Nxe4 dxe4",
553
    "g3? d5 Bg2? Nf6? Nf3 c6 O-O Bf5 d3 e6 Nbd2 h6 b3 Be7 Bb2 O-O",
554
    "g3? d5 Bg2? e5 d3 Nf6 Nf3 Bd6",
555
    "g3? d5 Nf3 Nf6 Bg2 e6 O-O Be7 d3 O-O Nbd2 c5 e4 Nc6",
556
    "g3? Nf6 Bg2 d5 d3? c6? Nd2 e5 e4 Bd6 Ngf3 O-O O-O",
557
    "g3? Nf6 Bg2 d5 d3? c5 Nf3 Nc6",
558
    "g3? e5 Bg2? d5 d3 Nf6 Nf3 Nc6 O-O Be7 c4 O-O cxd5 Nxd5 Nc3 Be6",
559
    "g3? e5 c4 Nf6 Bg2 c6 d4 exd4 Qxd4",
560
 
561
    // Dutch
562
    "d4 f5? g3 Nf6 Bg2 g6 Nf3 Bg7 O-O O-O c4 d6 Nc3 Qe8",
563
    "c4 f5? d4 Nf6 Nc3 g6 Nf3 Bg7 e3 O-O Be2 d6 O-O Nc6",
564
    "d4 f5? Nf3 Nf6 g3 g6 Bg2 Bg7 c4 O-O Nc3 d6 O-O Nc6 d5",
565
 
566
    // Less usual openings
567
    "Nc3? d5 e4 d4 Nce2 e5 Nf3 Bd6 Ng3 Ne7",
568
    "Nc3? d5 d4 Nf6 Bg5 Nbd7 Nf3 h6 Bh4 c6 e3 e6 Bd3 Be7 O-O O-O",
569
    "Nc3? d5 Nf3 Nf6 d4 e6 Bg5 Nbd7 a3 Be7 e3 h6 Bf4 Nh5 Be5",
570
    "f4? d5 Nf3 Nf6 e3 g6 Be2 Bg7 O-O O-O d3? c5 Qe1 Nc6 Nc3 Re8",
571
    "f4? d5 Nf3 g6 g3 Bg7 Bg2 Nf6 O-O O-O d3 c5 Nc3 d4 Ne4",
572
    "f4? d5 Nf3 g6 e3 Bg7 Be2 Nf6",
573
    "f4? d5 e3 Nf6 Nf3 g6 d4 Bg7 c4 c5 dxc5 O-O Nc3 Ne4",
574
    "b3? e5 Bb2 Nc6 e3 Nf6 Bb5 Bd6",
575
    "b3? e6 Bb2 Nf6 e3 c5 Nf3 Be7 d4 cxd4",
576
    "e4 d6? d4 Nf6 Nc3 g6 Nf3 Bg7",
577
    "e4 d6? d4 Nf6 Nc3 g6 f4? Bg7",
578
    "d4 d6? e4 Nf6 Nc3 g6 Be3? Bg7 Qd2 c6",
579
    "e4 d6? d4 Nf6 Nc3 Nbd7 f4 e5 Nf3",
580
    "e4 d6? d4 g6 Nc3 Bg7 Nf3 Nf6 Be2",
581
    "e4 d6? d4 g6 c4 Bg7",
582
    "d4 g6? e4 Bg7 Nf3 d6 Nc3 Nf6 Be2 O-O O-O c6 h3 Qc7 Bf4 Nbd7 e5 dxe5 Nxe5 Nxe5 Bxe5 Qb6",
583
    "d4 g6? c4 Bg7 Nc3 d6 e4 Nf6 Nf3 O-O Be2 e5",
584
    "d4 g6? e4 Bg7 c4 d6 Nc3 Nc6? Be3 e5 d5 Nce7",
585
    "d4 Nf6 c4 g6? g3? c6 Bg2 d5 cxd5 cxd5 Nf3 Bg7 Nc3 O-O O-O Ne4 Ne5 Bf5",
586
    "d4 e6 g3? d5 Bg2 c5",
587
    "e4 e5 Bc4? Nf6 d3 c6 Nf3 d5 Bb3 Bb4+ Bd2 Bxd2+ Qxd2",
588
    "d4 e6 Nf3 Nf6 c4 d5 Bg5 Be7 Nc3 h6 Bh4 O-O",
589
    "e4 e5 Nc3? Nf6 Bc4 Nc6 Nf3 Bc5 d3 O-O",
590
 
591
    nullptr
592
};