super_tik_tac_toe/lib/classic.dart

130 lines
3.3 KiB
Dart
Raw Permalink Normal View History

2024-12-21 06:36:11 -05:00
import 'package:flutter/material.dart';
import 'state.dart';
import 'game.dart';
2024-12-21 08:34:49 -05:00
import "util.dart";
2024-12-21 06:36:11 -05:00
class ClassicGame extends StatefulWidget {
const ClassicGame({super.key});
@override
State<ClassicGame> createState() => _ClassicGameState();
}
class _ClassicGameState extends State<ClassicGame> {
TTCState turn = TTCState.x;
2024-12-21 07:42:49 -05:00
List<TTCState> data = [
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
TTCState.empty,
];
2024-12-30 12:18:12 -05:00
TTCState get winner => Util.checkWin(data);
bool get ended => winner != TTCState.empty;
2024-12-21 06:36:11 -05:00
String get turnText => switch (turn) {
TTCState.empty => "",
TTCState.x => "X",
TTCState.o => "O",
};
2024-12-30 12:18:12 -05:00
void _nextTurn() => turn = Util.nextTurn(turn);
2024-12-21 06:36:11 -05:00
2024-12-21 07:42:49 -05:00
Widget _invalidChoiceAlert(TTCState existingValue) {
return Dialog(
child: Padding(
2024-12-21 08:34:49 -05:00
padding: const EdgeInsets.all(10),
2024-12-21 07:42:49 -05:00
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text(
"INVALID CHOICE",
style: TextStyle(fontWeight: FontWeight.bold),
),
2024-12-30 12:18:12 -05:00
Text("${Util.stateText(existingValue)} already claimed that"),
2024-12-21 07:42:49 -05:00
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: const Text("Ok")),
],
),
),
2024-12-21 06:36:11 -05:00
);
}
2024-12-21 07:42:49 -05:00
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();
});
}
2024-12-21 08:34:49 -05:00
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),
),
2024-12-30 12:18:12 -05:00
Text("${Util.stateText(winner)} has already won"),
2024-12-21 08:34:49 -05:00
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: const Text("Ok")),
],
),
),
);
});
}
2024-12-21 06:36:11 -05:00
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
const Spacer(flex: 5),
Center(
child: Text(
2024-12-30 12:18:12 -05:00
!ended ? "$turnText's turn" : "${Util.stateText(winner)} wins",
2024-12-21 06:36:11 -05:00
style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
)),
const Spacer(flex: 1),
TTCGame(
turn: turn,
2024-12-21 08:34:49 -05:00
cellOnTapCallback: !ended ? _cellOnTap : _endedCellOnTap,
2024-12-21 07:42:49 -05:00
data: data,
cellTextStyle: const TextStyle(fontSize: 40),
2024-12-21 06:36:11 -05:00
),
const Spacer(flex: 5),
],
);
}
}