import 'package:flutter/material.dart'; import 'state.dart'; import 'game.dart'; import "util.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, ]; TTCState get winner => Util.checkWin(data); bool get ended => winner != TTCState.empty; String get turnText => switch (turn) { TTCState.empty => "", TTCState.x => "X", TTCState.o => "O", }; void _nextTurn() => turn = Util.nextTurn(turn); Widget _invalidChoiceAlert(TTCState existingValue) { return Dialog( child: Padding( padding: const EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ const Text( "INVALID CHOICE", style: TextStyle(fontWeight: FontWeight.bold), ), Text("${Util.stateText(existingValue)} 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(); }); } void _endedCellOnTap(int index) { showDialog( context: context, builder: (context) { return Dialog( child: Padding( padding: const EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ const Text( "GAME OVER", style: TextStyle(fontWeight: FontWeight.bold), ), Text("${Util.stateText(winner)} has already won"), ElevatedButton( onPressed: () => Navigator.pop(context), child: const Text("Ok")), ], ), ), ); }); } @override Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, children: [ const Spacer(flex: 5), Center( child: Text( !ended ? "$turnText's turn" : "${Util.stateText(winner)} wins", style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold), )), const Spacer(flex: 1), TTCGame( turn: turn, cellOnTapCallback: !ended ? _cellOnTap : _endedCellOnTap, data: data, cellTextStyle: const TextStyle(fontSize: 40), ), const Spacer(flex: 5), ], ); } }