diff --git a/lib/main.dart b/lib/main.dart index 5044f48..5d25137 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,20 +30,31 @@ class MainApp extends StatelessWidget { } } -class GameBoard extends StatelessWidget { +class GameBoard extends StatefulWidget { const GameBoard({super.key}); + @override + State createState() => _GameBoardState(); +} + +class _GameBoardState extends State { + var text = "hello test lalala"; + List BOARD = []; + + final _myGlobalKey = GlobalKey(); + @override Widget build(BuildContext context) { - gameReset(); - var text = "hello test lalala"; + 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 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 { - String _text = ""; - int _spot = 50; + List 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 { 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 { 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 board; - PlayerSpot({super.key, required this.text}); + PlayerSpot({super.key, required this.board, required this.spot}); + + @override + State createState() => _PlayerSpotState(); +} + +class _PlayerSpotState extends State { + List 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 gameTurn(List 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 BOARD = []; -List 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 gameReset(List 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 marbleAdd(List 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 marbleRemove(List 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); } } +// */