You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
5.2 KiB
220 lines
5.2 KiB
import 'dart:developer';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:my_flutter_puzzle/models/user_info.dart';
|
|
import 'package:my_flutter_puzzle/widgets/puzzle_widgets/puzzle_widgets.dart';
|
|
|
|
class PuzzleScreen extends StatefulWidget {
|
|
const PuzzleScreen({
|
|
Key? key,
|
|
required this.initialList,
|
|
required this.id,
|
|
required this.myInfo,
|
|
}) : super(key: key);
|
|
|
|
final List<int> initialList;
|
|
final String id;
|
|
final UserData myInfo;
|
|
|
|
@override
|
|
_PuzzleScreenState createState() => _PuzzleScreenState();
|
|
}
|
|
|
|
class _PuzzleScreenState extends State<PuzzleScreen> {
|
|
late final List<int> myList;
|
|
late final List<int> opponentList;
|
|
int _moves = 0;
|
|
|
|
onClick(index) {
|
|
log('-----------------------');
|
|
log('Tapped index: $index');
|
|
|
|
int emptyTilePosIndex = myList.indexOf(0);
|
|
int emptyTilePosRow = emptyTilePosIndex ~/ 4;
|
|
int emptyTilePosCol = emptyTilePosIndex % 4;
|
|
|
|
int currentTileRow = index ~/ 4;
|
|
int currentTileCol = index % 4;
|
|
|
|
//current element moves up
|
|
|
|
if ((currentTileRow - 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) {
|
|
setState(() {
|
|
myList[emptyTilePosIndex] = myList[index];
|
|
myList[index] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
|
|
//current element moves down
|
|
|
|
else if ((currentTileRow + 1 == emptyTilePosRow) && (currentTileCol == emptyTilePosCol)) {
|
|
setState(() {
|
|
myList[emptyTilePosIndex] = myList[index];
|
|
myList[index] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
|
|
//current element moves left
|
|
|
|
else if ((currentTileRow == emptyTilePosRow) && (currentTileCol + 1 == emptyTilePosCol)) {
|
|
setState(() {
|
|
myList[emptyTilePosIndex] = myList[index];
|
|
myList[index] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
|
|
//current element moves right
|
|
|
|
else if ((currentTileRow == emptyTilePosRow) && (currentTileCol - 1 == emptyTilePosCol)) {
|
|
setState(() {
|
|
myList[emptyTilePosIndex] = myList[index];
|
|
myList[index] = 0;
|
|
_moves++;
|
|
});
|
|
} else {
|
|
if (currentTileCol == emptyTilePosCol) {
|
|
int low;
|
|
int high;
|
|
|
|
// multiple elements move up
|
|
|
|
if (emptyTilePosRow < currentTileRow) {
|
|
low = emptyTilePosRow;
|
|
high = currentTileRow;
|
|
|
|
int i = low;
|
|
while (i < high) {
|
|
setState(() {
|
|
myList[(i * 4) + emptyTilePosCol] = myList[(((i + 1) * 4) + emptyTilePosCol)];
|
|
});
|
|
|
|
i += 1;
|
|
}
|
|
setState(() {
|
|
myList[(high * 4) + emptyTilePosCol] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
|
|
//multiple elements move down
|
|
|
|
else {
|
|
low = emptyTilePosRow;
|
|
high = currentTileRow;
|
|
|
|
int i = low;
|
|
while (i > high) {
|
|
setState(() {
|
|
myList[(i * 4) + emptyTilePosCol] = myList[(((i - 1) * 4) + emptyTilePosCol)];
|
|
});
|
|
|
|
i -= 1;
|
|
}
|
|
setState(() {
|
|
myList[(high * 4) + emptyTilePosCol] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
}
|
|
|
|
// multiple elements move left
|
|
|
|
// multiple elements move right
|
|
|
|
if (currentTileRow == emptyTilePosRow) {
|
|
int low;
|
|
int high;
|
|
|
|
// multiple elements move left
|
|
|
|
if (emptyTilePosCol < currentTileCol) {
|
|
low = emptyTilePosCol;
|
|
high = currentTileCol;
|
|
|
|
int i = low;
|
|
while (i < high) {
|
|
setState(() {
|
|
myList[(emptyTilePosRow * 4) + i] = myList[(emptyTilePosRow * 4) + (i + 1)];
|
|
});
|
|
|
|
i += 1;
|
|
}
|
|
setState(() {
|
|
myList[high + (emptyTilePosRow * 4)] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
|
|
//multiple elements move right
|
|
|
|
else {
|
|
low = emptyTilePosCol;
|
|
high = currentTileCol;
|
|
|
|
int i = low;
|
|
while (i > high) {
|
|
setState(() {
|
|
myList[(i + (emptyTilePosRow * 4))] = myList[(i - 1) + (emptyTilePosRow * 4)];
|
|
});
|
|
|
|
i -= 1;
|
|
}
|
|
setState(() {
|
|
myList[high + (emptyTilePosRow * 4)] = 0;
|
|
_moves++;
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// _databaseClient.updateGameState(
|
|
// id: widget.id,
|
|
// mydata: widget.myInfo,
|
|
// numberList: myList,
|
|
// moves: _moves,
|
|
// );
|
|
|
|
log('List: $myList');
|
|
log('-----------------------');
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
myList = widget.initialList;
|
|
opponentList = widget.initialList;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: Colors.white,
|
|
body: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
// PLAYER 1 puzzle --> my (own)
|
|
Column(
|
|
children: [
|
|
const PlayerText(
|
|
displayName: 'PLAYER 1',
|
|
),
|
|
// TODO: Change font size
|
|
MovesText(
|
|
moves: _moves,
|
|
fontSize: 60,
|
|
),
|
|
],
|
|
),
|
|
Container(
|
|
height: MediaQuery.of(context).size.height * 0.6,
|
|
width: 2,
|
|
color: Colors.black,
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|