Warning, file /education/gcompris/src/activities/bargame/bargame.js was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /* GCompris - bargame.js
0002  *
0003  * SPDX-FileCopyrightText: 2016 UTKARSH TIWARI <iamutkarshtiwari@kde.org >
0004  *
0005  * Authors:
0006  *   Yves Combe (GTK+ version)
0007  *   UTKARSH TIWARI <iamutkarshtiwari@kde.org > (Qt Quick port)
0008  *
0009  *   SPDX-License-Identifier: GPL-3.0-or-later
0010  */
0011 .pragma library
0012 .import GCompris 1.0 as GCompris
0013 .import QtQuick 2.12 as Quick
0014 .import "qrc:/gcompris/src/core/core.js" as Core
0015 
0016 var levelsProperties = [
0017     {
0018         "minNumberOfBalls": 1,
0019         "maxNumberOfBalls": 4,
0020         "elementSizeFactor": 0,
0021         "boardSize": 15
0022     },
0023     {
0024         "minNumberOfBalls": 2,
0025         "maxNumberOfBalls": 6,
0026         "elementSizeFactor": 4,
0027         "boardSize": 19
0028     },
0029     {
0030         "minNumberOfBalls": 3,
0031         "maxNumberOfBalls": 6,
0032         "elementSizeFactor": 7,
0033         "boardSize": 29
0034     }
0035 ];
0036 
0037 var moveCount = -1
0038 var numberOfLevel = 4
0039 var listWin = []
0040 var items
0041 var gameMode
0042 
0043 var url= "qrc:/gcompris/src/activities/bargame/resource/";
0044 
0045 function start(items_, gameMode_) {
0046     items = items_;
0047     gameMode = gameMode_;
0048     items.currentLevel = Core.getInitialLevel(numberOfLevel);
0049     initLevel();
0050 }
0051 
0052 function stop() {
0053     items.trigTuxMove.stop();
0054 }
0055 
0056 function initLevel() {
0057     if (items.isPlayer1Beginning === true) {
0058         initiatePlayer1();
0059         items.isPlayer1Turn = true;
0060     } else {
0061         initiatePlayer2();
0062         items.isPlayer1Turn = false;
0063     }
0064 
0065     items.okArea.enabled = true;
0066     calculateWinPlaces();
0067     moveCount = -1;
0068     items.numberOfBalls = levelsProperties[items.mode - 1].minNumberOfBalls
0069 
0070     // Hiding all visible balls
0071     for (var x = 0; x < items.answerBallsPlacement.columns; x++) {
0072         items.answerBallsPlacement.children[x].visible = false;
0073     }
0074 }
0075 
0076 function nextLevel() {
0077     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0078     initLevel();
0079 }
0080 
0081 function previousLevel() {
0082     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0083     initLevel();
0084 }
0085 
0086 function restartLevel() {
0087     items.trigTuxMove.stop();
0088     initLevel();
0089 }
0090 
0091 function calculateWinPlaces() {
0092     /* Calculates all the possible winning moves in the
0093     available board size. It generates a list all winning
0094     moves for the computer */
0095     var winners = [];
0096     var winnersList = [];
0097     var min = levelsProperties[items.mode - 1].minNumberOfBalls;
0098     var max = levelsProperties[items.mode - 1].maxNumberOfBalls;
0099     var boardSize = levelsProperties[items.mode - 1].boardSize;
0100     var period = (min + max);
0101 
0102     for (var x = 0; x < min; x++) {
0103         winnersList.push((boardSize - 1 - x) % period);
0104     }
0105 
0106     for (var x = period + 1; x < boardSize; x++) {
0107         if (winnersList.indexOf((x + 1) % period) >= 0) {
0108             winners.push(x);
0109         }
0110     }
0111 
0112     var levelWin = items.currentLevel * min;
0113 
0114     if (levelWin == 0) {
0115         winners = [];
0116     } else {
0117         winners = winners.slice(-levelWin);
0118         if (items.currentLevel == numberOfLevel - 1) {
0119             winners = winners.slice(1);
0120         }
0121     }
0122     listWin = winners;
0123 }
0124 
0125 function machinePlay() {
0126     function accessible(x) {
0127         if (listWin.indexOf(x + moveCount) >= 0) {
0128             return true;
0129         } else {
0130             return false;
0131         }
0132     }
0133 
0134     function randomNumber(minimum, maximum) {
0135         return Math.round(Math.random() * (maximum - minimum) + minimum);
0136     }
0137 
0138     var playable = [];
0139 
0140     var min = levelsProperties[items.mode - 1].minNumberOfBalls;
0141     var max = levelsProperties[items.mode - 1].maxNumberOfBalls;
0142     for (var x = min; x <= max; x++) {
0143         if (accessible(x)) {
0144             playable.push(x);
0145         }
0146     }
0147     var value;
0148     if (playable.length != 0) {
0149         value = playable[Math.floor(Math.random()*playable.length)];
0150     } else {
0151         value = randomNumber(min, max);
0152     }
0153 
0154     play(2, value);
0155 }
0156 
0157 function play(player, value) {
0158     for (var x = 0; x < value ; x++) {
0159         moveCount++;
0160         var boardSize = levelsProperties[items.mode - 1].boardSize;
0161         if (moveCount <= (boardSize - 1)) {
0162             items.answerBallsPlacement.children[moveCount].visible = true;
0163             if (player === 1) {
0164                 items.answerBallsPlacement.children[moveCount].source = url + "ball_1.svg";
0165             } else {
0166                 items.answerBallsPlacement.children[moveCount].source = url + "ball_2.svg";
0167             }
0168         }
0169         // one of the players has won
0170         if (moveCount == (boardSize - 1)) {
0171             items.okArea.enabled = false;
0172             if (gameMode === 2) {
0173                 items.isPlayer1Beginning = !items.isPlayer1Beginning;
0174             }
0175             if (player === 2) {
0176                 items.player1score.win();
0177                 items.player2score.endTurn();
0178                 items.bonus.good("flower");
0179             } else {
0180                 items.player1score.endTurn();
0181                 items.player2score.win();
0182                 if (gameMode === 1) {
0183                     items.bonus.bad("flower");
0184                 }
0185                 else {
0186                     items.bonus.good("flower");
0187                 }
0188             }
0189             return;
0190         }
0191     }
0192 
0193     items.isPlayer1Turn = !items.isPlayer1Turn;
0194 
0195     if (player === 1 && gameMode === 1) {
0196         items.player1score.endTurn();
0197         items.player2score.beginTurn();
0198         items.okArea.enabled = false;
0199         items.trigTuxMove.start();
0200     } else if (player === 2 && gameMode === 1) {
0201         items.player2score.endTurn();
0202         items.player1score.beginTurn();
0203         items.okArea.enabled = true;
0204     } else if (gameMode === 2) {
0205         if (player === 1) {
0206             items.player1score.endTurn();
0207             items.player2score.beginTurn();
0208         } else {
0209             items.player2score.endTurn();
0210             items.player1score.beginTurn();
0211         }
0212     }
0213 }
0214 
0215 //Initial values at the start of game when its player 1 turn
0216 function initiatePlayer1() {
0217     items.player2score.endTurn();
0218     items.player1score.beginTurn();
0219 }
0220 
0221 //Initial values at the start of game when its player 2 turn
0222 function initiatePlayer2() {
0223     items.player1score.endTurn();
0224     items.player2score.beginTurn();
0225 }
0226