super_tik_tac_toe/lib/classic.dart

130 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'state.dart';
import 'game.dart';
import "util.dart";
class ClassicGame extends StatefulWidget {
const ClassicGame({super.key});
@override
State<ClassicGame> createState() => _ClassicGameState();
}
class _ClassicGameState extends State<ClassicGame> {
TTCState turn = TTCState.x;
List<TTCState> 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),
],
);
}
}