#flutter #dart #methods #tic-tac-toe
Вопрос:
Я работаю над игрой в крестики-нолики в flutter/dart. Я поставил 3 различных трудности: ЛЕГКУЮ,СРЕДНЮЮ,ТРУДНУЮ. Когда пользователь запускает игру в крестики-нолики, я хочу, чтобы она сразу начиналась с ЛЕГКОЙ настройки сложности, без необходимости выбирать «легко». Как бы я это сделал? Приведенный ниже код-это моя логика для различных трудностей и простое диалоговое окно для задания трудностей. Но как мне запустить игру в ПРОСТОМ режиме по умолчанию?
displayMessage(computerPlayer " MOVED, X's TURN");
if (_gameChoice == 1) {
getRandomMove();
}
if (_gameChoice == 2) {
if (winningCheck == 0) {
getWinningMove();
}
if (winningCheck == 0) {
getRandomMove();
}
}
if (_gameChoice == 3) {
if (winningCheck == 0) {
getWinningMove();
}
if (winningCheck == 0 amp;amp; blockingCheck == 0) {
getBlockingMove();
}
if (winningCheck == 0 amp;amp; blockingCheck == 0) {
getRandomMove();
}
}
}
// Get winning move
void getWinningMove() {
// First see if there's a move O can make to win
for (int i = 0; i < boardSize; i ) {
if (_mBoard[i] != humanPlayer amp;amp; _mBoard[i] != computerPlayer) {
String curr = _mBoard[i];
_mBoard[i] = computerPlayer;
print(computerPlayer " made a winning move to " "$i");
if (checkWinner() == 3) {
winningCheck = 1;
return;
} else
_mBoard[i] = curr;
winningCheck = 0;
}
}
}
// Get Blocking move
void getBlockingMove() {
for (int i = 0; i < boardSize; i ) {
if (_mBoard[i] != humanPlayer amp;amp; _mBoard[i] != computerPlayer) {
String curr = _mBoard[i]; // Save the current number
_mBoard[i] = humanPlayer;
if (checkWinner() == 2) {
_mBoard[i] = computerPlayer;
blockingCheck = 1;
print(computerPlayer " made a blocking move to" ' $i');
return;
} else
_mBoard[i] = curr;
blockingCheck = 0;
}
}
}
// Get random move
void getRandomMove() {
var move;
// Generate random move
var count = 0;
do {
count = count 1;
move = rnd.nextInt(9);
print("Computer random move is " '$move');
} while (
(_mBoard[move] == humanPlayer || _mBoard[move] == computerPlayer) amp;amp;
(count < 9));
if ((_mBoard[move] == humanPlayer) || (_mBoard[move] == computerPlayer)) {
return;
} else {
print("Computer is making a move to " '$move');
_mBoard[move] = computerPlayer;
return;
}
}
Future _showSimpleDialogue() async {
switch (await showDialog(
context: context,
/*it shows a popup with few options which you can select, for option we
created enums which we can use with switch statement, in this first switch
will wait for the user to select the option which it can use with switch cases*/
builder: (BuildContext context) {
return SimpleDialog(
title: Text('Select the Difficulty Level'),
children: <Widget>[
SimpleDialogOption(
child: Text('Easy'),
onPressed: () {
Navigator.pop(context, Choice.EASY);
computerTurn();
},
),
new SimpleDialogOption(
child: Text('Medium'),
onPressed: () {
Navigator.pop(context, Choice.MEDIUM);
computerTurn();
},
),
new SimpleDialogOption(
child: Text('Hard'),
onPressed: () {
Navigator.pop(context, Choice.HARD);
computerTurn();
},
),
],
);
},
)) {
case Choice.EASY:
_gameChoice = 1;
break;
case Choice.MEDIUM:
_gameChoice = 2;
break;
case Choice.HARD:
_gameChoice = 3;
break;
}
print('The selection was Choice = ' '$_gameChoice');
}```
Ответ №1:
Решение состоит в том, чтобы использовать параметр StatefulWidget. Его объект состояния инициализирует _gameChoice для выбора.ЛЕГКО, и его значение может быть обновлено позже, если пользователь выберет другой уровень сложности.
class TicTacToe extends StatefulWidget {
@override
_TicTacToeState createState() => _TicTacToeState();
}
class _TicTacToeState extends State<TicTacToe> {
var difficulty = Choice.EASY;
@override
Widget build(BuildContext context) {
return ...
}
}