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, ]; bool ended = false; TTCState? winner; 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: const 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; winner = Util.checkWin(data); if (winner != null && winner != TTCState.empty) { ended = true; } _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("${winner?.name.toUpperCase()} 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" : "${winner?.name.toUpperCase()} 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), ], ); } }