added some game logic (move queen)
This commit is contained in:
parent
8bdaf0c5dd
commit
29aadc0925
@ -39,17 +39,50 @@ namespace toruschess {
|
|||||||
memcpy(m_places, start_field, sizeof(start_field));
|
memcpy(m_places, start_field, sizeof(start_field));
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Move> Field::validMoves(const Pos &p) {
|
void tryDirection(QList<Move> &moves, const Field *field, int thePiece, const Pos &from, int dx, int dy) {
|
||||||
|
for (int d = 1; d < 8; d++) {
|
||||||
|
Pos to = Pos(from.x() + d*dx, from.y() + d*dy);
|
||||||
|
int toPlace = field->place(to);
|
||||||
|
if (0 == toPlace) {
|
||||||
|
moves.push_back(Move(field, from, to)); /* move */
|
||||||
|
} else if (0 > toPlace * thePiece) {
|
||||||
|
moves.push_back(Move(field, from, to)); /* beat */
|
||||||
|
for (int c = 7; c > d; c--) {
|
||||||
|
to = Pos(from.x() + c*dx, from.y() + c*dy);
|
||||||
|
toPlace = field->place(to);
|
||||||
|
if (0 == toPlace) {
|
||||||
|
moves.push_back(Move(field, from, to)); /* move */
|
||||||
|
} else if (0 > toPlace * thePiece) {
|
||||||
|
moves.push_back(Move(field, from, to)); /* beat */
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Move> Field::validMoves(const Pos &from) const {
|
||||||
QList<Move> moves;
|
QList<Move> moves;
|
||||||
int thePlace = place(p);
|
int thePlace = place(from);
|
||||||
Piece thePiece = (Piece) qAbs(thePlace);
|
Piece thePiece = (Piece) qAbs(thePlace);
|
||||||
switch (thePiece) {
|
switch (thePiece) {
|
||||||
|
case QUEEN:
|
||||||
|
tryDirection(moves, this, thePiece, from, 1, 1);
|
||||||
|
tryDirection(moves, this, thePiece, from, 1, -1);
|
||||||
|
tryDirection(moves, this, thePiece, from, 1, 0);
|
||||||
|
tryDirection(moves, this, thePiece, from, 0, 1);
|
||||||
|
break;
|
||||||
case NOPIECE:
|
case NOPIECE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return moves;
|
return moves;
|
||||||
}
|
}
|
||||||
bool Field::validMove(const Move &m) {
|
bool Field::validMove(const Move &m) const {
|
||||||
QList<Move> moves = validMoves(m.from());
|
QList<Move> moves = validMoves(m.from());
|
||||||
return moves.contains(m);
|
return moves.contains(m);
|
||||||
}
|
}
|
||||||
|
@ -86,8 +86,8 @@ namespace toruschess {
|
|||||||
int place(const Pos &p) const { return m_places[p.y()][p.x()]; }
|
int place(const Pos &p) const { return m_places[p.y()][p.x()]; }
|
||||||
int& place(const Pos &p) { return m_places[p.y()][p.x()]; }
|
int& place(const Pos &p) { return m_places[p.y()][p.x()]; }
|
||||||
|
|
||||||
QList<Move> validMoves(const Pos &p);
|
QList<Move> validMoves(const Pos &from) const;
|
||||||
bool validMove(const Move &m);
|
bool validMove(const Move &m) const;
|
||||||
bool move(const Move &m);
|
bool move(const Move &m);
|
||||||
bool undo(const Move &m);
|
bool undo(const Move &m);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user