diff options
Diffstat (limited to 'qml/pages')
| -rw-r--r-- | qml/pages/Goban.qml | 99 | 
1 files changed, 85 insertions, 14 deletions
| diff --git a/qml/pages/Goban.qml b/qml/pages/Goban.qml index c1e81bd..66002f7 100644 --- a/qml/pages/Goban.qml +++ b/qml/pages/Goban.qml @@ -1,6 +1,7 @@  import QtQuick 2.0  import "../javascript/goban_util.js" as Actions +import "../javascript/navigator.js" as TreeNavigator  Item { @@ -18,6 +19,8 @@ Item {      property bool limitLeft: true;      property bool limitRight: true; +    property bool completed: false; +      /*       * The current color to play :       * - true for white @@ -25,8 +28,23 @@ Item {       */      property bool currentPlayer: true; +    property bool initialPlayer: true; + +    property bool freePlay: false; + +    /** +     * The game tree. +     */      property variant tree; +    /** +     * Path in the tree. +     */ +    property variant path; + +    /* +     * History for cancelling a move. +     */      property variant history;      /* @@ -36,13 +54,14 @@ Item {       */      function start() { -        //currentPlayer = true; +        completed = false;          for (var i = 0; i < goban.rows * goban.columns; i++) {              repeater.itemAt(i).remove(false);          } -        var initial +        var initial; +        currentPlayer = initialPlayer;          i = 0; @@ -52,18 +71,19 @@ Item {          initial = tree[i];          history = []; +        path = [i + 1];          var aw = initial.AW;          if (aw !== undefined) {              aw.forEach(function (pos) { -                goban.getItemAt(pos[0], pos[1]).put(currentPlayer, false); +                goban.itemAt(pos).put(true, false);              });          }          var ab = initial.AB;          if (ab !== undefined) {              ab.forEach(function (pos) { -                goban.getItemAt(pos[0], pos[1]).put(!currentPlayer, false); +                goban.itemAt(pos).put(false, false);              });          }      } @@ -88,8 +108,8 @@ Item {              caseSize = maxWidth;          } -        console.log("Current player:", ret.current_player); -        currentPlayer = (ret.current_player === 'W'); +        initialPlayer = (ret.current_player === 'W'); +        console.log(ret.current_player);          /*           * Put the initials stones @@ -107,11 +127,17 @@ Item {          }          var currentHistory = history; -        var step = currentHistory.pop(); -        history = currentHistory; -        Actions.undo(goban, step); -        currentPlayer = step.player; +        var actions = currentHistory.pop(); +        actions.reverse(); + +        actions.forEach(function (x) { +            Actions.undo(goban, x); +            currentPlayer = x.player; +            path = x.path; +        }); + +        history = currentHistory;      }      /** @@ -119,6 +145,10 @@ Item {       */      function clickHandler(index) { +        if (completed) { +            return; +        } +          if ( (!limitLeft && Actions.isFirstCol(index, goban.columns))            || (!limitRight && Actions.isLastCol(index, goban.columns))            || (!limitTop && Actions.isFirstRow(index, goban.columns)) @@ -130,11 +160,52 @@ Item {          var step = Actions.addPiece(index, goban, currentPlayer, true, false, false);          if (step !== undefined) { -            currentPlayer = !currentPlayer; + +            /* +             * Update the path. +             */ +            var currentPosition = path[path.length - 1]; +            step.path = path; +            var action = TreeNavigator.checkAction(path, tree, currentPlayer, index); +            path = action; + + +            /* +             * Update the history with the last move. +             */              var currentHistory = history; -            currentHistory.push(step); +            var actions = [step]; + + +            if (action === undefined) { +                /* +                 * Switch to variation mode +                 */ +            } else { +                if (TreeNavigator.getCurrentAction(action, tree) === undefined) { +                    console.log("Level completed!"); +                    completed = true; +                    return; +                } else { +                    /* +                     * Play the openent move. +                     */ + +                    TreeNavigator.play(action, tree, currentPlayer, function(x, newPath) { +                        console.log(x); +                        var oponentAction = Actions.addPiece(x, goban, !currentPlayer, true, false, false) +                        oponentAction.path = path; +                        path = newPath; +                        actions.push(oponentAction); +                    }); + +                } + +            } +            currentHistory.push(actions);              history = currentHistory; +          }      } @@ -207,8 +278,8 @@ Item {              return repeater.itemAt(x + y * columns)          } -        function getElementAtIndex(index) { -            return repeater.itemAt(index); +        function itemAt(pos) { +            return repeater.itemAt(pos);          }          Repeater { | 
