Marco
7c5439a635
We now color the squares of the last move. This makes the state of the board clearer and shows whose turn it is.
94 lines
2.4 KiB
Dart
94 lines
2.4 KiB
Dart
import 'dart:developer';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
|
|
|
import 'chess_square.dart';
|
|
import '../utils/chess_utils.dart';
|
|
|
|
class ChessBoard extends StatelessWidget {
|
|
final ChessBoardState bState;
|
|
final List<ChessSquare> squares;
|
|
|
|
const ChessBoard._({required this.bState, required this.squares});
|
|
|
|
factory ChessBoard({required ChessBoardState boardState}) {
|
|
List<ChessSquare> squares = List.empty(growable: true);
|
|
for (int i = 0; i < 64; i++) {
|
|
var column = (i % 8) + 1;
|
|
var row = (i ~/ 8) + 1;
|
|
|
|
final piece = boardState.position[ChessCoordinate(column, row)];
|
|
|
|
bool squareWasPartOfLastMove = false;
|
|
if (boardState.lastMove.to == ChessCoordinate(column, row) ||
|
|
boardState.lastMove.from == ChessCoordinate(column, row)) {
|
|
squareWasPartOfLastMove = true;
|
|
}
|
|
|
|
squares.add(
|
|
ChessSquare(
|
|
ChessCoordinate(column, row),
|
|
piece,
|
|
squareWasPartOfLastMove,
|
|
),
|
|
);
|
|
}
|
|
|
|
return ChessBoard._(bState: boardState, squares: squares);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
log("ChessBoard's build()");
|
|
|
|
return Container(
|
|
decoration: const BoxDecoration(
|
|
boxShadow: [BoxShadow(color: Colors.black, offset: Offset(10, 10))]),
|
|
child: _buildBoard(bState.bottomColor == ChessColor.black),
|
|
);
|
|
}
|
|
|
|
Row _buildChessRow(int rowNo, bool flipped) {
|
|
if (!flipped) {
|
|
return Row(
|
|
children: [
|
|
for (int i = 8 * rowNo - 8; i < 8 * rowNo; i++) squares.elementAt(i)
|
|
],
|
|
);
|
|
} else {
|
|
return Row(
|
|
children: [
|
|
for (int i = 8 * rowNo - 1; i >= 8 * rowNo - 8; i--)
|
|
squares.elementAt(i)
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
Column _buildBoard(bool flipped) {
|
|
List<Row> chessBoard = <Row>[];
|
|
|
|
if (!flipped) {
|
|
for (int row = 8; row > 0; row--) {
|
|
chessBoard.add(_buildChessRow(row, flipped));
|
|
}
|
|
} else {
|
|
for (int row = 1; row <= 8; row++) {
|
|
chessBoard.add(_buildChessRow(row, flipped));
|
|
}
|
|
}
|
|
|
|
return Column(children: [...chessBoard]);
|
|
}
|
|
|
|
ChessSquare getSquareAtCoordinate(ChessCoordinate coord) {
|
|
/* Calculate index in squares[] from column and row */
|
|
int index = (coord.row - 1) * 8 + (coord.column - 1);
|
|
|
|
log("getSquareAtCoordinates: index calculated to $index");
|
|
|
|
return squares.elementAt(index);
|
|
}
|
|
}
|