super_tik_tac_toe/lib/classic.dart

140 lines
3.4 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,
];
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),
],
);
}
}