mchess-client/lib/chessapp/chess_board.dart

85 lines
2.0 KiB
Dart
Raw Normal View History

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;
const 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);
}
}