import 'package:flutter/material.dart'; import 'state.dart'; import 'game.dart'; class ClassicGame extends StatefulWidget { const ClassicGame({super.key}); @override State createState() => _ClassicGameState(); } class _ClassicGameState extends State { TTCState turn = TTCState.x; List data = [ TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, TTCState.empty, ]; String get turnText => switch (turn) { TTCState.empty => "", TTCState.x => "X", TTCState.o => "O", }; void _nextTurn() { turn = switch (turn) { TTCState.x => TTCState.o, TTCState.o => TTCState.x, _ => TTCState.x }; } Widget _invalidChoiceAlert(TTCState existingValue) { return Dialog( child: Padding( padding: EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ const Text( "INVALID CHOICE", style: TextStyle(fontWeight: FontWeight.bold), ), Text("${existingValue.name.toUpperCase()} already claimed that"), ElevatedButton( onPressed: () => Navigator.pop(context), child: const Text("Ok")), ], ), ), ); } bool _checkValidChoice(int index) { if (data[index] == TTCState.empty) return true; showDialog( context: context, builder: (context) => _invalidChoiceAlert(data[index]), ); return false; } void _cellOnTap(int index) { if (!_checkValidChoice(index)) { return; } setState(() { data[index] = turn; _nextTurn(); }); } @override Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, children: [ const Spacer(flex: 5), Center( child: Text( "$turnText's turn", style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold), )), const Spacer(flex: 1), TTCGame( turn: turn, cellOnTapCallback: _cellOnTap, data: data, cellTextStyle: const TextStyle(fontSize: 40), ), const Spacer(flex: 5), ], ); } }