Дарт — Как начать мою игру в крестики-нолики в определенной шкале сложности (ЛЕГКО)

#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 ...
  }
}