diff --git a/lib/game.dart b/lib/game.dart index c147434..3656a91 100644 --- a/lib/game.dart +++ b/lib/game.dart @@ -6,8 +6,8 @@ class TTCGame extends StatelessWidget { const TTCGame({ super.key, required this.turn, - required this.cellOnTapCallback, required this.data, + this.cellOnTapCallback, this.cellTextStyle, }); @@ -18,7 +18,7 @@ class TTCGame extends StatelessWidget { final TextStyle? cellTextStyle; /// hook into end of turn cycle; - final Function cellOnTapCallback; + final void Function(int)? cellOnTapCallback; @override Widget build(BuildContext context) { @@ -39,7 +39,7 @@ class GameHash extends StatelessWidget { const GameHash({super.key, required this.children, this.cellOnTapCallback}); final List children; - final Function? cellOnTapCallback; + final void Function(int)? cellOnTapCallback; Border _genCellBorder( int index, { @@ -93,6 +93,8 @@ class HashCell extends StatelessWidget { @override Widget build(BuildContext context) => InkWell( onTap: stateSetCallback, - child: Center(child: child), + child: IgnorePointer( + child: Center(child: child), + ), ); } diff --git a/lib/main.dart b/lib/main.dart index b895bc5..051aa2c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import 'clasic.dart'; +import 'package:super_tic_tac_toe/super.dart'; +import 'classic.dart'; void main() { runApp(const MyApp()); @@ -75,7 +76,7 @@ class _MyHomePageState extends State { padding: const EdgeInsets.all(10), child: type == GameType.classicTTC ? const ClassicGame() - : const Center(child: Text("Under Construction")), + : const SuperGame(), )); } } diff --git a/lib/super.dart b/lib/super.dart new file mode 100644 index 0000000..0eb4c00 --- /dev/null +++ b/lib/super.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:super_tic_tac_toe/game.dart'; +import 'package:super_tic_tac_toe/state.dart'; +import 'package:super_tic_tac_toe/util.dart'; + +class SuperGame extends StatefulWidget { + const SuperGame({super.key}); + + @override + State createState() => _SuperGameState(); +} + +class _SuperGameState extends State { + TTCState turn = TTCState.x; + List> data = Util.emptyBoardSuper; + List subGameEnded = [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + ]; + + List subGameWinners = [ + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + ]; + int nextPlay = -1; + + void _swapTurn() { + switch (turn) { + case TTCState.x: + turn = TTCState.o; + break; + case TTCState.o: + turn = TTCState.x; + break; + default: + turn = TTCState.x; + } + } + + Widget _subGameDialog(int subGame) { + return Dialog( + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "${Util.stateText(turn)} select cell", + style: const TextStyle(fontWeight: FontWeight.bold), + ), + TTCGame( + turn: turn, + cellOnTapCallback: (int i) { + nextPlay = i; + setState(() { + data[subGame][i] = turn; + _swapTurn(); + }); + Navigator.pop(context); + }, + data: data[subGame], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ElevatedButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text("Close")) + ], + ), + ], + ), + ), + ); + } + + void _showSubGameDialog(int i) { + if (nextPlay == i || nextPlay == -1) { + showDialog( + context: context, + builder: (context) => _subGameDialog(i), + ); + } else { + ScaffoldMessenger.of(context) + ..clearSnackBars() + ..showSnackBar( + SnackBar( + content: Text( + "You can only play at [${(nextPlay % 3) + 1}," + "${(nextPlay / 3).floor() + 1}]", + ), + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const Spacer(flex: 5), + Center( + child: Text( + "${Util.stateText(turn)}'s Turn", + style: const TextStyle(fontSize: 25), + ), + ), + const Spacer(flex: 1), + GameHash( + cellOnTapCallback: _showSubGameDialog, + children: data + .map( + (game) => Padding( + padding: const EdgeInsets.all(15), + child: TTCGame( + turn: turn, + data: game, + ), + ), + ) + .toList()), + const Spacer(flex: 5), + ], + ); + } +} diff --git a/lib/util.dart b/lib/util.dart index 62ed3be..671e9fc 100644 --- a/lib/util.dart +++ b/lib/util.dart @@ -1,6 +1,32 @@ import 'state.dart'; class Util { + static List get emptyBoardClassic => [ + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + TTCState.empty, + ]; + + static List> get emptyBoardSuper => [ + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + emptyBoardClassic, + ]; + + static String stateText(TTCState state) => state.name.toUpperCase(); + static Iterable getRow(int index, List data) => data.getRange(index, index + 3); static Iterable getCol(int index, List data) => [