I decided to give it a try as well...
I started with your code, and figured it would be fastest using an array so ended up doing what made sense to me - but haven't put many comments in yet so it might be hard to follow.
The board can be any size, just change the Columns and Rows global variables and everything else will adapt. I fixed a number of issues - now it wont let you make a move until all other blocks have stopped moving, if you make an invalid move it will reverse it, as long as you hold down on a block you can move it back or another direction (you have to let go to finalize the move), multi touch will only allow one move at a time...
after a move has completed it makes an array of all possible moves and then sorts them by the number of blocks that will be removed. This will prioritize a move of two sets of 3 over one of 5 in a row. This could be changed by making the scoring work differently, but this is a start... it shows the recommended move as soon as it has calculated it for testing purposes, or you can click the Hint button.
https://www.rieperts.com/games/forum/Match3.c3p