48 lines
1.4 KiB
Dart
48 lines
1.4 KiB
Dart
import 'state.dart';
|
|
|
|
class Util {
|
|
static Iterable<TTCState> getRow(int index, List<TTCState> data) =>
|
|
data.getRange(index, index + 3);
|
|
static Iterable<TTCState> getCol(int index, List<TTCState> data) => [
|
|
data[index],
|
|
data[index + 3],
|
|
data[index + 3 * 2],
|
|
];
|
|
static Iterable<TTCState> getCross(int index, List<TTCState> data) {
|
|
if (index == 0) {
|
|
return [data[0], data[4], data[8]];
|
|
}
|
|
return [data[3], data[4], data[6]];
|
|
}
|
|
|
|
static TTCState checkRow(Iterable<TTCState> row) =>
|
|
row.reduce((value, element) => (element == TTCState.empty ||
|
|
value == TTCState.empty ||
|
|
element != value)
|
|
? TTCState.empty
|
|
: value);
|
|
|
|
static TTCState checkBoard(Iterable<TTCState> rowValues) =>
|
|
rowValues.reduce((value, element) {
|
|
if (value != TTCState.empty) {
|
|
return value;
|
|
}
|
|
if (element != TTCState.empty) {
|
|
return element;
|
|
}
|
|
|
|
return TTCState.empty;
|
|
});
|
|
|
|
static TTCState checkWin(List<TTCState> data) {
|
|
Iterable<TTCState> rows =
|
|
Iterable.generate(3, (i) => checkRow(getRow(i, data)));
|
|
Iterable<TTCState> cols =
|
|
Iterable.generate(3, (i) => checkRow(getCol(i, data)));
|
|
Iterable<TTCState> crosses =
|
|
Iterable.generate(2, (i) => checkRow(getCross(i, data)));
|
|
|
|
return checkBoard([...rows, ...cols, ...crosses]);
|
|
}
|
|
}
|