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:
2026-05-08 11:52:49 -07:00
parent 375a0599c1
commit cd18c49d55
+148 -90
View File
@@ -30,20 +30,31 @@ class MainApp extends StatelessWidget {
} }
} }
class GameBoard extends StatelessWidget { class GameBoard extends StatefulWidget {
const GameBoard({super.key}); const GameBoard({super.key});
@override
State<GameBoard> createState() => _GameBoardState();
}
class _GameBoardState extends State<GameBoard> {
var text = "hello test lalala";
List<int> BOARD = [];
final _myGlobalKey = GlobalKey<ScaffoldState>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
gameReset(); logger.d(method: "GameBoard.build", "Rebuilding everything.");
var text = "hello test lalala";
return Row( return Row(
key: _myGlobalKey,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
// Player 1 Goal // Player 1 Goal
Column( Column(
children: [Center(child: PlayerSpot(text: SCORE[0].toString()))], children: [Center(child: PlayerSpot(spot: 0, board: BOARD))],
), ),
// Center holes // Center holes
Column( Column(
@@ -54,24 +65,12 @@ class GameBoard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( Column(children: [BoardSpot(spot: 13, board: BOARD)]),
children: [BoardSpot(spot: 11, text: BOARD[11].toString())], Column(children: [BoardSpot(spot: 12, board: BOARD)]),
), Column(children: [BoardSpot(spot: 11, board: BOARD)]),
Column( Column(children: [BoardSpot(spot: 10, board: BOARD)]),
children: [BoardSpot(spot: 10, text: BOARD[10].toString())], Column(children: [BoardSpot(spot: 09, board: BOARD)]),
), Column(children: [BoardSpot(spot: 08, board: BOARD)]),
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())],
),
], ],
), ),
Row( Row(
@@ -79,33 +78,37 @@ class GameBoard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( Column(children: [BoardSpot(spot: 01, board: BOARD)]),
children: [BoardSpot(spot: 00, text: BOARD[00].toString())], Column(children: [BoardSpot(spot: 02, board: BOARD)]),
), Column(children: [BoardSpot(spot: 03, board: BOARD)]),
Column( Column(children: [BoardSpot(spot: 04, board: BOARD)]),
children: [BoardSpot(spot: 01, text: BOARD[01].toString())], Column(children: [BoardSpot(spot: 05, board: BOARD)]),
), Column(children: [BoardSpot(spot: 06, board: BOARD)]),
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())],
),
], ],
), ),
Text(text), 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 // Player 2 Goal
Column( 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 { class BoardSpot extends StatefulWidget {
final String text;
final int spot; final int spot;
final List<int> board;
final double w; final double w;
final double h; final double h;
BoardSpot({ BoardSpot({
super.key, super.key,
required this.text, required this.board,
required this.spot, required this.spot,
this.w = 50, this.w = 50,
this.h = 50, this.h = 50,
@@ -131,13 +134,18 @@ class BoardSpot extends StatefulWidget {
} }
class _BoardSpotState extends State<BoardSpot> { class _BoardSpotState extends State<BoardSpot> {
String _text = ""; List<int> BOARD = [];
int _spot = 50; int _spot = -1;
@override @override
void initState() { void initState() {
BOARD = widget.board;
setState(() {
if (BOARD.isEmpty) {
BOARD = gameReset(BOARD);
}
});
_spot = widget.spot; _spot = widget.spot;
_text = widget.text;
super.initState(); super.initState();
} }
@@ -145,16 +153,14 @@ class _BoardSpotState extends State<BoardSpot> {
logger.d(method: "_playBoardSpot", "Playing spot '$_spot'"); logger.d(method: "_playBoardSpot", "Playing spot '$_spot'");
setState(() { setState(() {
logger.d(method: "_playBoardSpot", "Inside setState()"); logger.d(method: "_playBoardSpot", "Inside setState()");
if (widget.text == "Reset") { if (BOARD[_spot].toString() == "Reset") {
gameReset(); BOARD = gameReset(BOARD);
} }
if (widget.spot >= 12) { if (_spot >= 12) {
null; null;
} else { } 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, height: widget.h,
child: TextButton( child: TextButton(
onPressed: _playBoardSpot, onPressed: _playBoardSpot,
child: Center(child: Text(_text, textAlign: TextAlign.center)), child: Center(
child: Text(BOARD[_spot].toString(), textAlign: TextAlign.center),
),
), ),
); );
} }
} }
class PlayerSpot extends StatelessWidget { class PlayerSpot extends StatefulWidget {
final String text; 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 @override
Widget build(BuildContext context) { 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) { List<int> gameTurn(List<int> BOARD, int spot) {
logger.d(method: "gameTurn", "spot = $spot, marbles = $marbles"); if (BOARD.isEmpty) {
if ((boolTopPlayerTurn && spot <= 5) || (!boolTopPlayerTurn && spot >= 6)) { BOARD = gameReset(BOARD);
logger.d("Not this player's turn, try again.");
return;
} }
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) { while (marbles > 0) {
if (spot == 5 && !boolTopPlayerTurn) { if (spot == 06 && !boolTopPlayerTurn) {
marbleReward(boolTopPlayerTurn, 1); BOARD[07]++;
marbles--; marbles--;
} else if (spot == 11 && boolTopPlayerTurn) { spot++;
marbleReward(boolTopPlayerTurn, 1); } else if (spot == 13 && boolTopPlayerTurn) {
BOARD[00]++;
marbles--; marbles--;
spot++;
} }
if (marbles == 0) { if (marbles == 0) {
logger.d( logger.d(
method: "gameTurn", method: "gameTurn",
"Landed in player hole, go again! board = $BOARD, score = $SCORE", "Landed in player hole, go again! board = $BOARD",
); );
return; return BOARD;
} }
spot++; spot++;
marbleAdd(spot % 12); BOARD = marbleAdd(BOARD, spot % 14);
marbles--; 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. // 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 && if (BOARD[spot % 14] == 1 &&
((boolTopPlayerTurn && spot >= 6) || (!boolTopPlayerTurn && spot <= 5))) { ((boolTopPlayerTurn && spot >= 7) || (!boolTopPlayerTurn && spot <= 6))) {
// Spot 00 steals 11, 01 steals 10, ... 05 steals 06. // Spot 00 steals 11, 01 steals 10, ... 05 steals 06.
// This is a function of (spot_to_check = 11 - spot) // This is a function of (spot_to_check = 11 - spot)
int spotToCheck = 11 - spot; int spotToCheck = 13 - spot;
int theft = BOARD[spotToCheck]; int theft = BOARD[spotToCheck % 14];
marbleReward(boolTopPlayerTurn, theft); if (boolTopPlayerTurn) {
marbleRemove(spotToCheck, marbles); BOARD[00] += theft;
} else {
BOARD[07] += theft;
}
BOARD = marbleRemove(BOARD, spotToCheck % 14);
} }
boolTopPlayerTurn = !boolTopPlayerTurn; 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; bool boolTopPlayerTurn = false;
/* * /
void gameReset() { void gameReset() {
logger.d(method: "gameReset", "Started"); logger.d(method: "gameReset", "Started");
BOARD = []; BOARD = [];
for (int i = 0; i < 12; i++) { for (int i = 0; i < 12; i++) {
BOARD.add(4); BOARD.add(4);
} }
SCORE = [0, 0];
logger.d(method: "gameReset", "Finished"); 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"); logger.d(method: "marbleAdd[spot=$spot]", "Started");
BOARD[spot]++; BOARD[spot]++;
logger.d(method: "marbleAdd[spot=$spot]", "Finished"); logger.d(method: "marbleAdd[spot=$spot]", "Finished");
return BOARD;
} }
/* * /
void marbleReward(bool boolTopPlayer, int marbles) { void marbleReward(bool boolTopPlayer, int marbles) {
logger.d(method: "marbleReward[$boolTopPlayer, $marbles]", "Started"); logger.d(method: "marbleReward[$boolTopPlayer, $marbles]", "Started");
if (boolTopPlayer) { if (boolTopPlayer) {
@@ -317,21 +376,20 @@ void marbleReward(bool boolTopPlayer, int marbles) {
} }
logger.d(method: "marbleReward[$boolTopPlayer, $marbles]", "Finished"); 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"); logger.d(method: "marbleRemove", "Started");
// This should always be taking it down to 0, but doing the math anyways BOARD[spot] = 0;
// 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;
logger.d(method: "marbleRemove", "Finished"); logger.d(method: "marbleRemove", "Finished");
return BOARD;
} }
/* * /
class ButtonReset extends StatelessWidget { class ButtonReset extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BoardSpot(w: 50, h: 100, text: 'Reset', spot: 50); return BoardSpot(w: 50, h: 100, text: 'Reset', spot: 50);
} }
} }
// */