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