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