Skip to content
Snippets Groups Projects
Select Git revision
  • 3f55bb0f76eeb6d545dddbbaf9ee641267c94815
  • master default protected
  • 87-upgrade-framework-and-dependencies
  • 70-improve-app-metadata
  • Release_0.9.0_77 protected
  • Release_0.8.2_76 protected
  • Release_0.8.1_75 protected
  • Release_0.8.0_74 protected
  • Release_0.7.0_73 protected
  • Release_0.6.0_72 protected
  • Release_0.5.0_71 protected
  • Release_0.4.2_70 protected
  • Release_0.4.1_69 protected
  • Release_0.4.0_68 protected
  • Release_0.3.1_67 protected
  • Release_0.3.0_66 protected
  • Release_0.2.1_65 protected
  • Release_0.2.0_64 protected
  • Release_0.1.1_63 protected
  • Release_0.1.0_62 protected
  • Release_0.0.61_61 protected
  • Release_0.0.60_60 protected
  • Release_0.0.59_59 protected
  • Release_0.0.58_58 protected
24 results

game_utils.dart

Blame
  • game_utils.dart 3.14 KiB
    import 'dart:async';
    import 'dart:math';
    import 'dart:typed_data';
    
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart' show rootBundle;
    import 'package:image/image.dart' as imglib;
    import 'package:puzzlegame/entities/moving_tile.dart';
    import 'package:puzzlegame/entities/tile.dart';
    import 'package:puzzlegame/provider/data.dart';
    
    class GameUtils {
      static String getImageAssetName(String imageCode) {
        return 'assets/images/' + imageCode + '.png';
      }
    
      static startGame(Data myProvider, String imageCode) {
        myProvider.updateIsShufflingBoard(true);
        myProvider.updateSelectedImage(imageCode);
    
        new Timer(new Duration(seconds: 1), () {
          GameUtils.splitImageInTiles(myProvider);
        });
      }
    
      static startRandomGame(Data myProvider) {
        List sizes = [3, 4, 5];
        sizes.shuffle();
        myProvider.updateTilesCount(sizes[0]);
    
        List images = myProvider.availableImages;
        images.shuffle();
    
        startGame(myProvider, images[0]);
      }
    
      static Future<void> resetGame(Data myProvider) async {
        myProvider.resetSelectedImage();
        myProvider.updateIsTipImageDisplayed(false);
      }
    
      static bool checkTilesetIsCleared(List<MovingTile> tiles) {
        for (Tile tile in tiles) {
          if (!tile.isCorrect()) {
            return false;
          }
        }
        return true;
      }
    
      static List<MovingTile> shuffleMovingTiles(List<MovingTile> tiles) {
        var random = new Random();
        int tilesCount = tiles.length;
    
        for (int i = 0; i < (10 * tilesCount); i++) {
          int indexTile1 = random.nextInt(tilesCount);
          int indexTile2 = random.nextInt(tilesCount);
    
          MovingTile swap = tiles[indexTile1];
          tiles[indexTile1] = tiles[indexTile2];
          tiles[indexTile2] = swap;
    
          int swapCol = tiles[indexTile1].currentCol;
          tiles[indexTile1].currentCol = tiles[indexTile2].currentCol;
          tiles[indexTile2].currentCol = swapCol;
    
          int swapRow = tiles[indexTile1].currentRow;
          tiles[indexTile1].currentRow = tiles[indexTile2].currentRow;
          tiles[indexTile2].currentRow = swapRow;
        }
    
        return tiles;
      }
    
      static Future<void> splitImageInTiles(Data myProvider) async {
        String imageAsset = getImageAssetName(myProvider.selectedImage);
        Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
    
        imglib.Image image = imglib.decodeImage(imageData) ?? imglib.Image.fromBytes(1, 1, []);
    
        int x = 0, y = 0;
        int width = (image.width / myProvider.tilesCount).round();
        int height = (image.height / myProvider.tilesCount).round();
    
        List<MovingTile> tiles = [];
        for (int i = 0; i < myProvider.tilesCount; i++) {
          for (int j = 0; j < myProvider.tilesCount; j++) {
            Uint8List tileData = new Uint8List.fromList(imglib.encodeJpg(imglib.copyCrop(
              image,
              x,
              y,
              width,
              height,
            )));
    
            tiles.add(MovingTile(
              Image.memory(tileData),
              myProvider.tileImageSize,
              j,
              i,
              j,
              i,
            ));
    
            x += width;
          }
          x = 0;
          y += height;
        }
    
        myProvider.updateTiles(shuffleMovingTiles(tiles));
        myProvider.updateIsShufflingBoard(false);
      }
    }