85 lines
2.0 KiB
Dart
85 lines
2.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
|
|
|
import 'chess_square.dart';
|
|
import 'chess_utils.dart';
|
|
|
|
class ChessBoard extends StatelessWidget {
|
|
final ChessBoardState bState;
|
|
final List<ChessSquare> squares;
|
|
|
|
ChessBoard._({required this.bState, required this.squares});
|
|
|
|
factory ChessBoard({required ChessBoardState bState}) {
|
|
List<ChessSquare> squares = List.empty(growable: true);
|
|
for (int i = 0; i < 64; i++) {
|
|
var column = (i % 8) + 1;
|
|
var row = (i ~/ 8) + 1;
|
|
|
|
squares.add(
|
|
ChessSquare(
|
|
coordinate: ChessCoordinate(column, row),
|
|
),
|
|
);
|
|
}
|
|
|
|
return ChessBoard._(bState: bState, squares: squares);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
_placePieces();
|
|
|
|
return Column(
|
|
children: _buildBoard(bState.flipped),
|
|
);
|
|
}
|
|
|
|
void _placePieces() {
|
|
squares[0].containedPiece =
|
|
ChessPiece(ChessPieceName.blackBishop, 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)
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
List<Row> _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 chessBoard;
|
|
}
|
|
|
|
ChessSquare getSquareAtCoordinate(ChessCoordinate coord) {
|
|
/* Calculate index in squares[] from column and row */
|
|
int index = (coord.row - 1) * 8 + (coord.column - 1);
|
|
|
|
print("getSquareAtCoordinates: index calculated to $index");
|
|
|
|
return squares.elementAt(index);
|
|
}
|
|
}
|