From b1af4038fb0305fac2c69ed0679b826f8cdd4d9f Mon Sep 17 00:00:00 2001 From: Lachfrosch Date: Fri, 24 May 2024 12:38:38 +0200 Subject: [PATCH] Added some basic logic to remove created matches and apply gravity so new blocks fall down --- lib/main.dart | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 4af611b..1d47e49 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'dart:math'; + import 'package:flutter/material.dart'; void main() { @@ -72,6 +73,15 @@ class _MyHomePageState extends State { void _initializeGrid() { _grid = List.generate(widget.gridSize, (_) => List.generate(widget.gridSize, (_) => Random().nextInt(5))); + _removeInitialMatches(); + } + + void _removeInitialMatches() { + bool hasMatches; + do { + hasMatches = _removeMatches(); + _applyGravity(); + } while (hasMatches); } @override @@ -133,6 +143,9 @@ class _MyHomePageState extends State { } else { if (_isValidMove(_selectedRow, _selectedCol, row, col)) { _swapTiles(_selectedRow, _selectedCol, row, col); + while (_removeMatches()) { + _applyGravity(); + } } _selectedRow = -1; _selectedCol = -1; @@ -141,14 +154,96 @@ class _MyHomePageState extends State { } bool _isValidMove(int row1, int col1, int row2, int col2) { - // Check if the two tiles are adjacent if ((row1 == row2 && (col1 - col2).abs() == 1) || (col1 == col2 && (row1 - row2).abs() == 1)) { - return true; + int temp = _grid[row1][col1]; + _grid[row1][col1] = _grid[row2][col2]; + _grid[row2][col2] = temp; + + bool isValid = _findMatches(row1, col1).isNotEmpty || + _findMatches(row2, col2).isNotEmpty; + + _grid[row2][col2] = _grid[row1][col1]; + _grid[row1][col1] = temp; + + return isValid; } return false; } + List> _findMatches(int row, int col) { + int color = _grid[row][col]; + List> matches = []; + + // Check horizontally + List horizontalMatch = []; + for (int c = col; c >= 0 && _grid[row][c] == color; c--) { + horizontalMatch.add(c); + } + for (int c = col + 1; c < widget.gridSize && _grid[row][c] == color; c++) { + horizontalMatch.add(c); + } + if (horizontalMatch.length >= 3) { + for (int c in horizontalMatch) { + matches.add([row, c]); + } + } + + // Check vertically + List verticalMatch = []; + for (int r = row; r >= 0 && _grid[r][col] == color; r--) { + verticalMatch.add(r); + } + for (int r = row + 1; r < widget.gridSize && _grid[r][col] == color; r++) { + verticalMatch.add(r); + } + if (verticalMatch.length >= 3) { + for (int r in verticalMatch) { + matches.add([r, col]); + } + } + + return matches; + } + + bool _removeMatches() { + List> allMatches = []; + + for (int row = 0; row < widget.gridSize; row++) { + for (int col = 0; col < widget.gridSize; col++) { + List> matches = _findMatches(row, col); + if (matches.isNotEmpty) { + allMatches.addAll(matches); + } + } + } + + for (var match in allMatches) { + _grid[match[0]][match[1]] = -1; // Mark the tile as removed + } + + return allMatches.isNotEmpty; + } + + void _applyGravity() { + for (int col = 0; col < widget.gridSize; col++) { + int emptyRow = widget.gridSize - 1; + for (int row = widget.gridSize - 1; row >= 0; row--) { + if (_grid[row][col] != -1) { + _grid[emptyRow][col] = _grid[row][col]; + if (emptyRow != row) { + _grid[row][col] = -1; + } + emptyRow--; + } + } + + for (int row = emptyRow; row >= 0; row--) { + _grid[row][col] = Random().nextInt(5); + } + } + } + void _swapTiles(int row1, int col1, int row2, int col2) { int temp = _grid[row1][col1]; _grid[row1][col1] = _grid[row2][col2];