Add helper functions and fix the bug that replayed the move sent from the server.
This commit is contained in:
parent
8572aa73e6
commit
cf12bc08c4
@ -1,12 +1,16 @@
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:mchess/utils/chess_utils.dart';
|
import 'package:mchess/utils/chess_utils.dart';
|
||||||
|
|
||||||
typedef ChessPositionType = Map<ChessCoordinate, ChessPiece>;
|
typedef ChessPositionType = Map<ChessCoordinate, ChessPiece>;
|
||||||
|
typedef ChessMoveHistory = List<ChessMove>;
|
||||||
|
|
||||||
class ChessPosition {
|
class ChessPosition {
|
||||||
static final ChessPosition _instance = ChessPosition._internal();
|
static final ChessPosition _instance = ChessPosition._internal();
|
||||||
late ChessPositionType position;
|
final ChessPositionType position;
|
||||||
|
|
||||||
|
ChessMoveHistory history = ChessMoveHistory.empty(growable: true);
|
||||||
|
|
||||||
static ChessPosition getInstance() {
|
static ChessPosition getInstance() {
|
||||||
return _instance;
|
return _instance;
|
||||||
@ -62,11 +66,17 @@ class ChessPosition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChessPositionType get currentPosition => position;
|
ChessPositionType get currentPosition => position;
|
||||||
|
ChessMove get lastMove => history.last;
|
||||||
|
|
||||||
void recordMove(ChessCoordinate from, ChessCoordinate to) {
|
void recordMove(ChessCoordinate from, ChessCoordinate to) {
|
||||||
position[to] = position[from] ?? const ChessPiece.none();
|
position[to] = position[from] ?? const ChessPiece.none();
|
||||||
position[from] = const ChessPiece.none();
|
position[from] = const ChessPiece.none();
|
||||||
|
|
||||||
|
history.add(ChessMove(from: from, to: to));
|
||||||
|
|
||||||
logPosition(position);
|
logPosition(position);
|
||||||
|
|
||||||
|
logHistory(history);
|
||||||
}
|
}
|
||||||
|
|
||||||
void logPosition(ChessPositionType p) {
|
void logPosition(ChessPositionType p) {
|
||||||
@ -86,4 +96,10 @@ class ChessPosition {
|
|||||||
|
|
||||||
log(logString);
|
log(logString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void logHistory(ChessMoveHistory hist) {
|
||||||
|
hist.forEach((element) {
|
||||||
|
log('${element.from.toAlphabetical()} -> ${element.to.toAlphabetical()}');
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
||||||
import 'package:mchess/chess_bloc/chess_events.dart';
|
import 'package:mchess/chess_bloc/chess_events.dart';
|
||||||
|
import 'package:mchess/chess_bloc/chess_position.dart';
|
||||||
import 'package:mchess/utils/chess_utils.dart';
|
import 'package:mchess/utils/chess_utils.dart';
|
||||||
import 'package:web_socket_channel/web_socket_channel.dart';
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
||||||
|
|
||||||
@ -64,11 +64,17 @@ class ServerConnection {
|
|||||||
if (splitString[0] == ('mv')) {
|
if (splitString[0] == ('mv')) {
|
||||||
var startSquare = ChessCoordinate.fromString(splitString[1]);
|
var startSquare = ChessCoordinate.fromString(splitString[1]);
|
||||||
var endSquare = ChessCoordinate.fromString(splitString[2]);
|
var endSquare = ChessCoordinate.fromString(splitString[2]);
|
||||||
|
if (ChessMove(from: startSquare, to: endSquare) ==
|
||||||
|
ChessPosition.getInstance().lastMove) {
|
||||||
|
//This is our own move that got resent by the server. Do not process.
|
||||||
|
} else {
|
||||||
|
log('lastMove: from: ${ChessPosition.getInstance().lastMove.from} to: ${ChessPosition.getInstance().lastMove.to}');
|
||||||
|
log('constructed move: from: $startSquare to: $endSquare)}');
|
||||||
|
log('Move received : ${startSquare.toAlphabetical()}:${endSquare.toAlphabetical()}');
|
||||||
|
|
||||||
log('Move received : ${splitString[1]}:${splitString[2]}');
|
ChessBloc.getInstance().add(OpponentPieceMoved(
|
||||||
|
startSquare: startSquare, endSquare: endSquare));
|
||||||
ChessBloc.getInstance().add(
|
}
|
||||||
OpponentPieceMoved(startSquare: startSquare, endSquare: endSquare));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -91,6 +91,23 @@ class ChessCoordinate {
|
|||||||
return '$colStr$rowStr';
|
return '$colStr$rowStr';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String toAlphabetical() {
|
||||||
|
Map<int, String> columnMap = {
|
||||||
|
1: "a",
|
||||||
|
2: "b",
|
||||||
|
3: "c",
|
||||||
|
4: "d",
|
||||||
|
5: "e",
|
||||||
|
6: "f",
|
||||||
|
7: "g",
|
||||||
|
8: "h"
|
||||||
|
};
|
||||||
|
String rowStr = row.toString();
|
||||||
|
String colStr = columnMap[column]!;
|
||||||
|
|
||||||
|
return '$colStr$rowStr';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
operator ==(other) {
|
operator ==(other) {
|
||||||
return other is ChessCoordinate &&
|
return other is ChessCoordinate &&
|
||||||
@ -136,6 +153,23 @@ class ChessPiece extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ChessMove {
|
||||||
|
ChessCoordinate from;
|
||||||
|
ChessCoordinate to;
|
||||||
|
|
||||||
|
ChessMove({required this.from, required this.to});
|
||||||
|
|
||||||
|
@override
|
||||||
|
operator ==(other) {
|
||||||
|
return other is ChessMove && other.from == from && other.to == to;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
return hash2(from, to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PieceMovedFrom {
|
class PieceMovedFrom {
|
||||||
ChessCoordinate fromSquare;
|
ChessCoordinate fromSquare;
|
||||||
ChessPiece? movedPiece;
|
ChessPiece? movedPiece;
|
||||||
|
Loading…
Reference in New Issue
Block a user