generated from me/template-mit
Kinda sorta working, but not really. The buttons are all playing on their own version of BOARD rather than the session version, so the plays are not compounding.
This commit is contained in:
+148
-90
@@ -30,20 +30,31 @@ class MainApp extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
class GameBoard extends StatelessWidget {
|
||||
class GameBoard extends StatefulWidget {
|
||||
const GameBoard({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
gameReset();
|
||||
State<GameBoard> createState() => _GameBoardState();
|
||||
}
|
||||
|
||||
class _GameBoardState extends State<GameBoard> {
|
||||
var text = "hello test lalala";
|
||||
List<int> BOARD = [];
|
||||
|
||||
final _myGlobalKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
logger.d(method: "GameBoard.build", "Rebuilding everything.");
|
||||
|
||||
return Row(
|
||||
key: _myGlobalKey,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
// Player 1 Goal
|
||||
Column(
|
||||
children: [Center(child: PlayerSpot(text: SCORE[0].toString()))],
|
||||
children: [Center(child: PlayerSpot(spot: 0, board: BOARD))],
|
||||
),
|
||||
// Center holes
|
||||
Column(
|
||||
@@ -54,24 +65,12 @@ class GameBoard extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Column(
|
||||
children: [BoardSpot(spot: 11, text: BOARD[11].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 10, text: BOARD[10].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 09, text: BOARD[09].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 08, text: BOARD[08].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 07, text: BOARD[07].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 06, text: BOARD[06].toString())],
|
||||
),
|
||||
Column(children: [BoardSpot(spot: 13, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 12, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 11, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 10, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 09, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 08, board: BOARD)]),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
@@ -79,33 +78,37 @@ class GameBoard extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Column(
|
||||
children: [BoardSpot(spot: 00, text: BOARD[00].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 01, text: BOARD[01].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 02, text: BOARD[02].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 03, text: BOARD[03].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 04, text: BOARD[04].toString())],
|
||||
),
|
||||
Column(
|
||||
children: [BoardSpot(spot: 05, text: BOARD[05].toString())],
|
||||
),
|
||||
Column(children: [BoardSpot(spot: 01, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 02, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 03, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 04, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 05, board: BOARD)]),
|
||||
Column(children: [BoardSpot(spot: 06, board: BOARD)]),
|
||||
],
|
||||
),
|
||||
Text(text),
|
||||
ButtonReset(),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
BOARD = gameReset(BOARD);
|
||||
});
|
||||
},
|
||||
child: Text("Reset"),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
BOARD = BOARD;
|
||||
logger.d(method: "Refresh", "Refreshed!");
|
||||
});
|
||||
},
|
||||
child: Text("Refresh"),
|
||||
),
|
||||
],
|
||||
),
|
||||
// Player 2 Goal
|
||||
Column(
|
||||
children: [Center(child: PlayerSpot(text: SCORE[1].toString()))],
|
||||
children: [Center(child: PlayerSpot(spot: 07, board: BOARD))],
|
||||
),
|
||||
],
|
||||
);
|
||||
@@ -113,14 +116,14 @@ class GameBoard extends StatelessWidget {
|
||||
}
|
||||
|
||||
class BoardSpot extends StatefulWidget {
|
||||
final String text;
|
||||
final int spot;
|
||||
final List<int> board;
|
||||
final double w;
|
||||
final double h;
|
||||
|
||||
BoardSpot({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.board,
|
||||
required this.spot,
|
||||
this.w = 50,
|
||||
this.h = 50,
|
||||
@@ -131,13 +134,18 @@ class BoardSpot extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _BoardSpotState extends State<BoardSpot> {
|
||||
String _text = "";
|
||||
int _spot = 50;
|
||||
List<int> BOARD = [];
|
||||
int _spot = -1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
BOARD = widget.board;
|
||||
setState(() {
|
||||
if (BOARD.isEmpty) {
|
||||
BOARD = gameReset(BOARD);
|
||||
}
|
||||
});
|
||||
_spot = widget.spot;
|
||||
_text = widget.text;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@@ -145,16 +153,14 @@ class _BoardSpotState extends State<BoardSpot> {
|
||||
logger.d(method: "_playBoardSpot", "Playing spot '$_spot'");
|
||||
setState(() {
|
||||
logger.d(method: "_playBoardSpot", "Inside setState()");
|
||||
if (widget.text == "Reset") {
|
||||
gameReset();
|
||||
if (BOARD[_spot].toString() == "Reset") {
|
||||
BOARD = gameReset(BOARD);
|
||||
}
|
||||
if (widget.spot >= 12) {
|
||||
if (_spot >= 12) {
|
||||
null;
|
||||
} else {
|
||||
gameTurn(_spot, BOARD[_spot]);
|
||||
BOARD = gameTurn(BOARD, _spot);
|
||||
}
|
||||
|
||||
_text = BOARD[_spot].toString();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -165,20 +171,38 @@ class _BoardSpotState extends State<BoardSpot> {
|
||||
height: widget.h,
|
||||
child: TextButton(
|
||||
onPressed: _playBoardSpot,
|
||||
child: Center(child: Text(_text, textAlign: TextAlign.center)),
|
||||
child: Center(
|
||||
child: Text(BOARD[_spot].toString(), textAlign: TextAlign.center),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class PlayerSpot extends StatelessWidget {
|
||||
final String text;
|
||||
class PlayerSpot extends StatefulWidget {
|
||||
final int spot;
|
||||
final List<int> board;
|
||||
|
||||
PlayerSpot({super.key, required this.text});
|
||||
PlayerSpot({super.key, required this.board, required this.spot});
|
||||
|
||||
@override
|
||||
State<PlayerSpot> createState() => _PlayerSpotState();
|
||||
}
|
||||
|
||||
class _PlayerSpotState extends State<PlayerSpot> {
|
||||
List<int> BOARD = [];
|
||||
int _spot = -2;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
BOARD = widget.board;
|
||||
_spot = widget.spot;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BoardSpot(w: 50, h: 100, text: text, spot: 50);
|
||||
return BoardSpot(w: 50, h: 100, spot: _spot, board: BOARD);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,69 +269,104 @@ marbleRemove (int spot, int marbles) {
|
||||
}
|
||||
*/
|
||||
|
||||
void gameTurn(int spot, int marbles) {
|
||||
logger.d(method: "gameTurn", "spot = $spot, marbles = $marbles");
|
||||
if ((boolTopPlayerTurn && spot <= 5) || (!boolTopPlayerTurn && spot >= 6)) {
|
||||
logger.d("Not this player's turn, try again.");
|
||||
return;
|
||||
List<int> gameTurn(List<int> BOARD, int spot) {
|
||||
if (BOARD.isEmpty) {
|
||||
BOARD = gameReset(BOARD);
|
||||
}
|
||||
marbleRemove(spot, marbles);
|
||||
int marbles = BOARD[spot];
|
||||
logger.d(method: "gameTurn", "spot = $spot, marbles = $marbles");
|
||||
|
||||
if (spot == 00 || spot == 07) {
|
||||
logger.d(method: "gameTurn", "RETURN: Cannot play a player spot!");
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
if (marbles == 0) {
|
||||
logger.d(method: "gameTurn", "RETURN: Cannot play an empty hole!");
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
if ((boolTopPlayerTurn && spot <= 06) || (!boolTopPlayerTurn && spot >= 07)) {
|
||||
logger.d("Not this player's turn, try again.");
|
||||
return BOARD;
|
||||
}
|
||||
BOARD = marbleRemove(BOARD, spot % 14);
|
||||
while (marbles > 0) {
|
||||
if (spot == 5 && !boolTopPlayerTurn) {
|
||||
marbleReward(boolTopPlayerTurn, 1);
|
||||
if (spot == 06 && !boolTopPlayerTurn) {
|
||||
BOARD[07]++;
|
||||
marbles--;
|
||||
} else if (spot == 11 && boolTopPlayerTurn) {
|
||||
marbleReward(boolTopPlayerTurn, 1);
|
||||
spot++;
|
||||
} else if (spot == 13 && boolTopPlayerTurn) {
|
||||
BOARD[00]++;
|
||||
marbles--;
|
||||
spot++;
|
||||
}
|
||||
if (marbles == 0) {
|
||||
logger.d(
|
||||
method: "gameTurn",
|
||||
"Landed in player hole, go again! board = $BOARD, score = $SCORE",
|
||||
"Landed in player hole, go again! board = $BOARD",
|
||||
);
|
||||
return;
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
spot++;
|
||||
marbleAdd(spot % 12);
|
||||
BOARD = marbleAdd(BOARD, spot % 14);
|
||||
marbles--;
|
||||
}
|
||||
|
||||
// TODO: Check if this is the only marble in the hole, and if it's on the player's side, and if so, steal all the marbles on the opposite side.
|
||||
if (BOARD[spot % 12] == 1 &&
|
||||
((boolTopPlayerTurn && spot >= 6) || (!boolTopPlayerTurn && spot <= 5))) {
|
||||
if (BOARD[spot % 14] == 1 &&
|
||||
((boolTopPlayerTurn && spot >= 7) || (!boolTopPlayerTurn && spot <= 6))) {
|
||||
// Spot 00 steals 11, 01 steals 10, ... 05 steals 06.
|
||||
// This is a function of (spot_to_check = 11 - spot)
|
||||
int spotToCheck = 11 - spot;
|
||||
int theft = BOARD[spotToCheck];
|
||||
marbleReward(boolTopPlayerTurn, theft);
|
||||
marbleRemove(spotToCheck, marbles);
|
||||
int spotToCheck = 13 - spot;
|
||||
int theft = BOARD[spotToCheck % 14];
|
||||
if (boolTopPlayerTurn) {
|
||||
BOARD[00] += theft;
|
||||
} else {
|
||||
BOARD[07] += theft;
|
||||
}
|
||||
BOARD = marbleRemove(BOARD, spotToCheck % 14);
|
||||
}
|
||||
|
||||
boolTopPlayerTurn = !boolTopPlayerTurn;
|
||||
logger.d(method: "gameTurn", "Finished, board = $BOARD, score = $SCORE");
|
||||
logger.d(method: "gameTurn", "Finished, board = $BOARD");
|
||||
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
List<int> BOARD = [];
|
||||
List<int> SCORE = [];
|
||||
bool boolTopPlayerTurn = false;
|
||||
|
||||
/* * /
|
||||
void gameReset() {
|
||||
logger.d(method: "gameReset", "Started");
|
||||
BOARD = [];
|
||||
for (int i = 0; i < 12; i++) {
|
||||
BOARD.add(4);
|
||||
}
|
||||
SCORE = [0, 0];
|
||||
logger.d(method: "gameReset", "Finished");
|
||||
}
|
||||
// */
|
||||
|
||||
void marbleAdd(int spot) {
|
||||
List<int> gameReset(List<int> BOARD) {
|
||||
logger.d(method: "gameReset", "Started, BOARD = $BOARD");
|
||||
BOARD = [];
|
||||
for (int i = 0; i < 14; i++) {
|
||||
BOARD.add(4);
|
||||
}
|
||||
BOARD[00] = 0;
|
||||
BOARD[07] = 0;
|
||||
logger.d(method: "gameReset", "Finished, BOARD = $BOARD");
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
List<int> marbleAdd(List<int> BOARD, int spot) {
|
||||
logger.d(method: "marbleAdd[spot=$spot]", "Started");
|
||||
BOARD[spot]++;
|
||||
logger.d(method: "marbleAdd[spot=$spot]", "Finished");
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
/* * /
|
||||
void marbleReward(bool boolTopPlayer, int marbles) {
|
||||
logger.d(method: "marbleReward[$boolTopPlayer, $marbles]", "Started");
|
||||
if (boolTopPlayer) {
|
||||
@@ -317,21 +376,20 @@ void marbleReward(bool boolTopPlayer, int marbles) {
|
||||
}
|
||||
logger.d(method: "marbleReward[$boolTopPlayer, $marbles]", "Finished");
|
||||
}
|
||||
// */
|
||||
|
||||
void marbleRemove(int spot, int marbles) {
|
||||
List<int> marbleRemove(List<int> BOARD, int spot) {
|
||||
logger.d(method: "marbleRemove", "Started");
|
||||
// This should always be taking it down to 0, but doing the math anyways
|
||||
// just t make sure nothing wonky is going on, like 4 being removed then
|
||||
// 5 being moved across the board or something. Which would likely be unrelated
|
||||
// code elsewhere, but oh well.
|
||||
|
||||
BOARD[spot] -= marbles;
|
||||
BOARD[spot] = 0;
|
||||
logger.d(method: "marbleRemove", "Finished");
|
||||
return BOARD;
|
||||
}
|
||||
|
||||
/* * /
|
||||
class ButtonReset extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BoardSpot(w: 50, h: 100, text: 'Reset', spot: 50);
|
||||
}
|
||||
}
|
||||
// */
|
||||
|
||||
Reference in New Issue
Block a user