Skip to content
Snippets Groups Projects
Select Git revision
  • 7e56d9525a879a5e159dbeea2110ad19957c12dc
  • master default protected
  • 47-upgrade-framework-and-dependencies
  • 27-improve-app-metadata
  • 6-fix-display-grid
  • Release_1.9.0_38 protected
  • Release_1.8.2_37 protected
  • Release_1.8.1_36 protected
  • Release_1.8.0_35 protected
  • Release_1.7.0_34 protected
  • Release_1.6.0_33 protected
  • Release_1.5.0_32 protected
  • Release_1.4.3_31 protected
  • Release_1.4.2_30 protected
  • Release_1.4.1_29 protected
  • Release_1.4.0_28 protected
  • Release_1.3.1_27 protected
  • Release_1.3.0_26 protected
  • Release_1.2.1_25 protected
  • Release_1.2.0_24 protected
  • Release_1.1.0_23 protected
  • Release_1.0.21_22 protected
  • Release_1.0.20_21 protected
  • Release_1.0.19_20 protected
  • Release_1.0.18_19 protected
25 results

cpu_level_page.dart

Blame
  • cpu.dart 2.79 KiB
    import 'dart:math';
    
    import 'board.dart';
    import 'coordinate.dart';
    import 'match_page.dart';
    
    abstract class Cpu {
      final Color color;
      final Random _random = Random(DateTime.now().millisecond);
    
      Cpu(this.color);
    
      Color get otherPlayer => color == Color.red ? Color.yellow : Color.red;
    
      Future<int> chooseCol(Board board);
    }
    
    class DumbCpu extends Cpu {
      DumbCpu(super.player);
    
      @override
      Color get otherPlayer => color == Color.red ? Color.yellow : Color.red;
    
      @override
      Future<int> chooseCol(Board board) async {
        await Future.delayed(Duration(seconds: _random.nextInt(2)));
        int col = _random.nextInt(7);
    
        return col;
      }
    
      @override
      String toString() => 'DUMB CPU';
    }
    
    class HarderCpu extends Cpu {
      HarderCpu(super.player);
    
      @override
      Future<int> chooseCol(Board board) async {
        final List<double?> scores = List.filled(7, 0.0);
    
        await Future.delayed(Duration(seconds: 1 + _random.nextInt(2)));
        return _compute(board, 0, 1, scores);
      }
    
      int _compute(Board board, int step, int deepness, List<double?> scores) {
        for (var i = 0; i < 7; ++i) {
          final boardCopy = board.clone();
    
          final target = boardCopy.getColumnTarget(i);
          if (target == -1) {
            scores[i] = null;
            continue;
          }
    
          final coordinate = Coordinate(i, target);
    
          boardCopy.setBox(coordinate, color);
          if (boardCopy.checkWinner(coordinate, color)) {
            scores[i] = (scores[i] ?? 0) + deepness / (step + 1);
            continue;
          }
    
          for (var j = 0; j < 7; ++j) {
            final target = boardCopy.getColumnTarget(j);
            if (target == -1) {
              continue;
            }
    
            final coordinate = Coordinate(j, target);
    
            boardCopy.setBox(coordinate, otherPlayer);
            if (boardCopy.checkWinner(coordinate, otherPlayer)) {
              scores[i] = (scores[i] ?? 0) - deepness / (step + 1);
              continue;
            }
    
            if (step + 1 < deepness) {
              _compute(board, step + 1, deepness, scores);
            }
          }
        }
    
        return _getBestScoreIndex(scores);
      }
    
      int _getBestScoreIndex(List<double?> scores) {
        int bestScoreIndex = scores.indexWhere((s) => s != null);
        scores.asMap().forEach((index, score) {
          if (score != null &&
              (score > (scores[bestScoreIndex] ?? 0) ||
                  (score == scores[bestScoreIndex] && _random.nextBool()))) {
            bestScoreIndex = index;
          }
        });
        return bestScoreIndex;
      }
    
      @override
      String toString() => 'HARDER CPU';
    }
    
    class HardestCpu extends HarderCpu {
      HardestCpu(super.player);
    
      @override
      Future<int> chooseCol(Board board) async {
        final List<double?> scores = List.filled(7, 0);
    
        await Future.delayed(Duration(seconds: 2 + _random.nextInt(2)));
        return _compute(board, 0, 4, scores);
      }
    
      @override
      String toString() => 'HARDEST CPU';
    }