Compare commits

...

1 Commits
dev ... setpos

Author SHA1 Message Date
Calcitem a6b87e3819 flutter: Support setting position 2021-06-07 01:12:09 +08:00
10 changed files with 184 additions and 2 deletions

View File

@ -22,6 +22,7 @@ enum EngineType {
humanVsAi,
humanVsHuman,
aiVsAi,
setPosition,
humanVsCloud, // Not Implemented
humanVsLAN, // Not Implemented
testViaLAN, // Not Implemented

View File

@ -32,6 +32,10 @@
"@aiVsAi": {
"description": "AI Vs AI"
},
"setPosition": "Position Setzen",
"@setPosition": {
"description": "Set Position"
},
"humanVsCloud": "Mensch gegen Cloud",
"@humanVsCloud": {
"description": "Human Vs Cloud"

View File

@ -32,6 +32,10 @@
"@aiVsAi": {
"description": "AI Vs AI"
},
"setPosition": "Set Position",
"@setPosition": {
"description": "Set Position"
},
"humanVsCloud": "Human Vs Cloud",
"@humanVsCloud": {
"description": "Human Vs Cloud"

View File

@ -32,6 +32,10 @@
"@aiVsAi": {
"description": "AI Vs AI"
},
"setPosition": "مکان را ویرایش کنید",
"@setPosition": {
"description": "Set Position"
},
"humanVsCloud": "Human Vs Cloud",
"@humanVsCloud": {
"description": "Human Vs Cloud"

View File

@ -8,6 +8,7 @@
"humanVsAi": "人机对战",
"humanVsHuman": "双人对战",
"aiVsAi": "机器对战",
"setPosition": "编辑局面",
"humanVsCloud": "挑战云端",
"humanVsLAN": "联网对战",
"testViaLAN": "联网测试",

View File

@ -99,6 +99,7 @@ class Game {
isAi[PieceColor.black] = !Config.aiMovesFirst;
break;
case EngineType.humanVsHuman:
case EngineType.setPosition:
case EngineType.humanVsLAN:
case EngineType.humanVsCloud:
isAi[PieceColor.white] = isAi[PieceColor.black] = false;

View File

@ -455,6 +455,48 @@ class Position {
}
}
bool putPiece2(int s, String pt) {
var piece = pt;
var us = pt;
if (!(sqBegin <= s && s < sqEnd) || board[s] != Piece.noPiece) {
return false;
}
if (pieceOnBoardCount[us] != null) {
if (pieceOnBoardCount[us]! + 1 > rule.piecesCount) {
return false;
} else {
pieceOnBoardCount[us] = pieceOnBoardCount[us]! + 1;
}
}
if (pieceInHandCount[us] != null) {
pieceInHandCount[us] = pieceInHandCount[us]! - 1;
if (pieceInHandCount[us]! < 0) {
pieceInHandCount[us] = 0;
}
}
// TODO: Need?
if (phase == Phase.ready) {
start();
}
_grid[squareToIndex[s]!] = piece;
board[s] = piece;
record = "(" + fileOf(s).toString() + "," + rankOf(s).toString() + ")";
updateKey(s);
// TODO: need?
currentSquare = s;
return true;
}
bool putPiece(int s) {
var piece = Piece.noPiece;
var us = _sideToMove;

View File

@ -73,6 +73,8 @@ class _GamePageState extends State<GamePage>
late Animation animation;
bool disposed = false;
bool ltr = true;
var setPositionPieceColor = PieceColor.white;
var pieceColorIcon = Icons.looks_one_outlined;
final String tag = "[game_page]";
@override
@ -209,7 +211,8 @@ class _GamePageState extends State<GamePage>
// TODO
// WAR: Fix first tap response slow when piece count changed
if (position.phase == Phase.placing &&
if (Game.instance.engineType != EngineType.setPosition &&
position.phase == Phase.placing &&
position.pieceOnBoardCount[PieceColor.white] == 0 &&
position.pieceOnBoardCount[PieceColor.black] == 0) {
Game.instance.newGame();
@ -231,6 +234,13 @@ class _GamePageState extends State<GamePage>
return false;
}
// setPosition
if (Game.instance.engineType == EngineType.setPosition) {
print(
"$tag Engine type is set position. Put $setPositionPieceColor on $sq.");
return position.putPiece2(sq, setPositionPieceColor);
}
if (position.phase == Phase.ready) {
Game.instance.start();
}
@ -1167,6 +1177,7 @@ class _GamePageState extends State<GamePage>
EngineType.humanVsAi: Config.aiMovesFirst ? Icons.computer : Icons.person,
EngineType.humanVsHuman: Icons.person,
EngineType.aiVsAi: Icons.computer,
EngineType.setPosition: Icons.add_circle,
EngineType.humanVsCloud: Icons.person,
EngineType.humanVsLAN: Icons.person,
EngineType.testViaLAN: Icons.cast,
@ -1176,6 +1187,7 @@ class _GamePageState extends State<GamePage>
EngineType.humanVsAi: Config.aiMovesFirst ? Icons.person : Icons.computer,
EngineType.humanVsHuman: Icons.person,
EngineType.aiVsAi: Icons.computer,
EngineType.setPosition: Icons.add_circle_outline,
EngineType.humanVsCloud: Icons.cloud,
EngineType.humanVsLAN: Icons.cast,
EngineType.testViaLAN: Icons.cast,
@ -1490,6 +1502,109 @@ class _GamePageState extends State<GamePage>
);
}
Widget createSetPositionToolbar() {
var pieceColor = "White";
var phase = "Moving";
if (setPositionPieceColor == PieceColor.white) {
pieceColorIcon = Icons.looks_one_outlined;
} else if (setPositionPieceColor == PieceColor.black) {
pieceColorIcon = Icons.looks_two_outlined;
} else if (setPositionPieceColor == PieceColor.ban) {
pieceColorIcon = Icons.cancel_outlined;
}
var setPieceColorButton = TextButton(
child: Column(
// Replace with a Row for horizontal icon + text
children: <Widget>[
Icon(
pieceColorIcon,
color: AppTheme.toolbarIconColor,
),
],
),
onPressed: () => onSetPieceColorButtonPressed(),
);
var setPhaseButton = TextButton(
child: Column(
// Replace with a Row for horizontal icon + text
children: <Widget>[
Icon(
Game.instance.position.phase == Phase.moving
? Icons.swipe
: Icons.touch_app,
color: AppTheme.toolbarIconColor,
),
],
),
onPressed: () => onTakeBackButtonPressed(pop: false),
);
var undoButton = TextButton(
child: Column(
// Replace with a Row for horizontal icon + text
children: <Widget>[
Icon(
Icons.arrow_back,
color: AppTheme.toolbarIconColor,
),
],
),
onPressed: () => onStepForwardButtonPressed(pop: false),
);
var clearButton = TextButton(
child: Column(
// Replace with a Row for horizontal icon + text
children: <Widget>[
Icon(
Icons.cleaning_services,
color: AppTheme.toolbarIconColor,
),
],
),
onPressed: () => onStepForwardAllButtonPressed(pop: false),
);
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
color: Color(Config.boardBackgroundColor),
),
margin: EdgeInsets.symmetric(horizontal: GamePage.screenPaddingH),
padding: EdgeInsets.symmetric(vertical: 2),
child: Row(children: <Widget>[
Expanded(child: SizedBox()),
setPieceColorButton,
Expanded(child: SizedBox()),
setPhaseButton,
Expanded(child: SizedBox()),
undoButton,
Expanded(child: SizedBox()), //dashboard_outlined
clearButton,
Expanded(child: SizedBox()),
]),
);
}
onSetPieceColorButtonPressed() {
if (setPositionPieceColor == PieceColor.white) {
setPositionPieceColor = PieceColor.black;
} else if (setPositionPieceColor == PieceColor.black) {
if (rule.hasBannedLocations) {
setPositionPieceColor = PieceColor.ban;
} else {
setPositionPieceColor = PieceColor.white;
}
} else {
setPositionPieceColor = PieceColor.white;
}
setState(() {});
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
@ -1518,6 +1633,7 @@ class _GamePageState extends State<GamePage>
final board = createBoard();
final toolbar = createToolbar();
final historyNavToolbar = createHistoryNavigationToolbar();
final setPositionToolbar = createSetPositionToolbar();
return Scaffold(
backgroundColor: Color(Config.darkBackgroundColor),
@ -1528,7 +1644,9 @@ class _GamePageState extends State<GamePage>
? historyNavToolbar
: SizedBox(height: 0),
SizedBox(height: 1),
toolbar,
Game.instance.engineType == EngineType.setPosition
? setPositionToolbar
: toolbar,
]),
/*
body: Column(children: <Widget>[

View File

@ -29,6 +29,7 @@ enum DrawerIndex {
humanVsAi,
humanVsHuman,
aiVsAi,
setPosition,
preferences,
ruleSettings,
personalization,
@ -88,6 +89,11 @@ class _HomeDrawerState extends State<HomeDrawer> {
title: S.of(context).aiVsAi,
icon: Icon(Icons.computer),
),
DrawerListItem(
index: DrawerIndex.setPosition,
title: S.of(context).setPosition,
icon: Icon(Icons.place),
),
DrawerListItem(
index: DrawerIndex.preferences,
title: S.of(context).preferences,

View File

@ -83,6 +83,7 @@ class _NavigationHomeScreenState extends State<NavigationHomeScreen> {
DrawerIndex.humanVsAi: EngineType.humanVsAi,
DrawerIndex.humanVsHuman: EngineType.humanVsHuman,
DrawerIndex.aiVsAi: EngineType.aiVsAi,
DrawerIndex.setPosition: EngineType.setPosition,
};
drawerIndex = index;