import 'package:flutter/material.dart'; import '../provider/data.dart'; import '../utils/board_utils.dart'; class Cell { bool isMined = false; bool isExplored = false; bool isMarked = false; bool isExploded = false; int minesCountAround = 0; Cell( @required this.isMined, ); Container widget(Data myProvider, int row, int col) { bool showSolution = myProvider.gameWin || myProvider.gameFail; Color backgroundColor = this.getBackgroundColor(myProvider); String imageAsset = this.getImageAssetName(myProvider.skin, showSolution); return Container( decoration: BoxDecoration( color: backgroundColor, border: Border.all( color: Colors.grey, width: 1, ), ), child: GestureDetector( child: Image( image: AssetImage(imageAsset), fit: BoxFit.fill, ), onTap: () { if (!myProvider.isBoardMined) { myProvider.updateCells(BoardUtils.createBoard(myProvider, row, col)); myProvider.updateIsBoardMined(true); } if (!(myProvider.gameWin || myProvider.gameFail)) { if (myProvider.reportMode) { BoardUtils.reportCell(myProvider, row, col); } else { BoardUtils.walkOnCell(myProvider, row, col); } } BoardUtils.checkGameIsFinished(myProvider); }, ), ); } String getImageAssetName(String skin, bool showSolution) { String imageAsset = 'assets/skins/' + skin + '_tile_unknown.png'; if (!showSolution) { // Running game if (this.isExplored) { if (this.isMined) { // Boom imageAsset = 'assets/skins/' + skin + '_tile_mine.png'; } else { // Show mines count around imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png'; } } else { if (this.isMarked) { // Danger! imageAsset = 'assets/skins/' + skin + '_tile_flag.png'; } } } else { // Finished game if (this.isMined) { if (this.isExploded) { // Mine exploded imageAsset = 'assets/skins/' + skin + '_tile_mine.png'; } else { // Mine not found imageAsset = 'assets/skins/' + skin + '_tile_mine_not_found.png'; } } else { // Show all mines counts imageAsset = 'assets/skins/' + skin + '_tile_' + this.minesCountAround.toString() + '.png'; } } return imageAsset; } Color getBackgroundColor(Data myProvider) { if (myProvider.gameWin) { return Colors.green[300]; } else if (myProvider.gameFail) { return Colors.pink[200]; } return Colors.white; } }