super_tik_tac_toe/lib/game.dart

101 lines
2.4 KiB
Dart
Raw Normal View History

2024-12-21 06:36:11 -05:00
import 'package:flutter/material.dart';
import 'state.dart';
/// Board of a single game of tic tac toe
2024-12-21 07:42:49 -05:00
class TTCGame extends StatelessWidget {
2024-12-21 06:36:11 -05:00
const TTCGame({
super.key,
required this.turn,
2024-12-21 07:42:49 -05:00
required this.data,
2024-12-27 15:46:37 -05:00
this.cellOnTapCallback,
2024-12-21 07:42:49 -05:00
this.cellTextStyle,
2024-12-21 06:36:11 -05:00
});
final TTCState turn;
2024-12-21 07:42:49 -05:00
final List<TTCState> data;
2024-12-21 06:36:11 -05:00
2024-12-21 07:42:49 -05:00
/// styling for text in cell
final TextStyle? cellTextStyle;
2024-12-21 06:36:11 -05:00
2024-12-21 07:42:49 -05:00
/// hook into end of turn cycle;
2024-12-27 15:46:37 -05:00
final void Function(int)? cellOnTapCallback;
2024-12-21 06:36:11 -05:00
2024-12-21 08:34:49 -05:00
@override
Widget build(BuildContext context) {
List<Widget> cells = data
.map((state) => Text(
state != TTCState.empty ? state.name.toUpperCase() : "",
style: cellTextStyle,
))
.toList();
return GameHash(
cellOnTapCallback: cellOnTapCallback,
children: cells,
);
}
}
class GameHash extends StatelessWidget {
const GameHash({super.key, required this.children, this.cellOnTapCallback});
final List<Widget> children;
2024-12-27 15:46:37 -05:00
final void Function(int)? cellOnTapCallback;
2024-12-21 08:34:49 -05:00
2024-12-21 06:36:11 -05:00
Border _genCellBorder(
int index, {
BorderSide borderSide = const BorderSide(),
}) {
return Border(
top: index < 3 ? BorderSide.none : borderSide,
bottom: index > 5 ? BorderSide.none : borderSide,
left: [0, 3, 6].contains(index) ? BorderSide.none : borderSide,
right: [2, 5, 8].contains(index) ? BorderSide.none : borderSide,
);
}
2024-12-21 08:34:49 -05:00
MapEntry<int, Widget> _genCell(int index, Widget content) {
return MapEntry(
index,
Container(
decoration: BoxDecoration(border: _genCellBorder(index)),
child: HashCell(
stateSetCallback: () {
if (cellOnTapCallback != null) {
cellOnTapCallback!(index);
}
},
child: content,
),
),
);
}
2024-12-21 06:36:11 -05:00
@override
Widget build(BuildContext context) {
return GridView.count(
crossAxisCount: 3,
shrinkWrap: true,
2024-12-21 08:34:49 -05:00
children: children.asMap().map(_genCell).values.toList(),
2024-12-21 06:36:11 -05:00
);
}
}
2024-12-21 08:34:49 -05:00
class HashCell extends StatelessWidget {
const HashCell({
2024-12-21 06:36:11 -05:00
super.key,
2024-12-21 08:34:49 -05:00
required this.child,
2024-12-21 06:36:11 -05:00
this.stateSetCallback,
});
2024-12-21 08:34:49 -05:00
final Widget child;
2024-12-21 06:36:11 -05:00
final VoidCallback? stateSetCallback;
@override
Widget build(BuildContext context) => InkWell(
2024-12-21 08:34:49 -05:00
onTap: stateSetCallback,
2024-12-27 15:46:37 -05:00
child: IgnorePointer(
child: Center(child: child),
),
2024-12-21 08:34:49 -05:00
);
2024-12-21 06:36:11 -05:00
}