File indexing completed on 2024-05-12 15:21:40
0001 /* GCompris - tens_complement_swap.js 0002 * 0003 * SPDX-FileCopyrightText: 2022 Samarth Raj <mailforsamarth@gmail.com> 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 * 0006 */ 0007 .pragma library 0008 .import "qrc:/gcompris/src/core/core.js" as Core 0009 0010 var numberOfLevel; 0011 var items; 0012 var datasets = []; 0013 var currentDatasetLevel = 0; 0014 var numberOfDatasetLevel; 0015 var previousSelectedCard = undefined; 0016 0017 function start(items_) { 0018 items = items_ 0019 datasets.length = 0; 0020 for(var indexForDataset = 0; indexForDataset < items.levels.length; indexForDataset++) { 0021 for(var indexForLevel = 0; indexForLevel < items.levels[indexForDataset].value.length; indexForLevel++) { 0022 datasets.push(items.levels[indexForDataset].value[indexForLevel]); 0023 } 0024 } 0025 numberOfDatasetLevel = items.levels.length; 0026 numberOfLevel = datasets.length; 0027 items.currentLevel = Core.getInitialLevel(numberOfLevel); 0028 initLevel(); 0029 } 0030 0031 function stop() { 0032 clearListModels(); 0033 } 0034 0035 function initLevel() { 0036 clearListModels(); 0037 previousSelectedCard = undefined; 0038 for(var indexOfListModel = 0; indexOfListModel < datasets[items.currentLevel].length; indexOfListModel++) { 0039 var model = []; 0040 var valueArray = getValueArray(datasets[items.currentLevel][indexOfListModel]); 0041 for(var indexOfDisplayArray = 0; indexOfDisplayArray < valueArray.length - 1; indexOfDisplayArray++) { 0042 var card = {}; 0043 if(!Number.isNaN(parseInt(valueArray[indexOfDisplayArray]))) { 0044 card = { 0045 "type": "numberCard", 0046 "value": valueArray[indexOfDisplayArray].toString(), 0047 "rowNumber": indexOfListModel, 0048 "selected": false, 0049 "selectable": true 0050 } 0051 } 0052 else { 0053 card = { 0054 "type": "symbolCard", 0055 "value": valueArray[indexOfDisplayArray].toString() 0056 } 0057 } 0058 model.push(card); 0059 } 0060 var resultCard = { 0061 "type": "resultCard", 0062 "value": valueArray[valueArray.length - 1].toString(), 0063 } 0064 model.push(resultCard); 0065 items.equations.append({ 0066 "listmodel": model, 0067 "isGood": false, 0068 "isValidationImageVisible": false 0069 }); 0070 } 0071 } 0072 0073 function clearListModels() { 0074 items.equations.clear(); 0075 } 0076 0077 /* 0078 * For a given array of numbers this function returns an array of elements to be displayed. 0079 * It calculates the number of pairs to display and an additional number if the size is odd. 0080 */ 0081 function getValueArray(numberArray) { 0082 var valueArray = []; 0083 var totalSum = 0; 0084 var indexOfNumberValue = 0; 0085 var countOfNumbers = numberArray.randomValues ? numberArray.numberOfElements : numberArray.numberValue.length; 0086 var numberOfPairs = Math.floor(countOfNumbers / 2); 0087 var values = []; 0088 if(numberArray.randomValues) { 0089 var numberOfPairsFilled = 0; 0090 while(numberOfPairsFilled != numberOfPairs) { 0091 // Get a number between 1 and 9 0092 var randomNumber = Math.floor(1 + Math.random() * 9); 0093 0094 // Avoid having twice the same numbers 0095 // If we have more than 10 numbers, it's impossible to avoid repetition. 0096 if(values.length < 10 && values.indexOf(randomNumber) > -1) { 0097 continue; 0098 } 0099 0100 values.push(randomNumber); 0101 values.push(10 - randomNumber); 0102 numberOfPairsFilled ++; 0103 }; 0104 if(countOfNumbers % 2 != 0) { 0105 // Add a random number at the end between 1 and 9 0106 values.push(Math.floor(Math.random() * 9) + 1); 0107 } 0108 } 0109 else { 0110 values = numberArray.numberValue; 0111 } 0112 if(numberArray.randomizeOrder == undefined || numberArray.randomizeOrder == true) { 0113 var maxNumberOfShuffles = 10; 0114 do { 0115 // Shuffle the numbers before creating the model. 0116 // Make sure at least the first computation is not correct to avoid having the possibility to have all good answers at start 0117 Core.shuffle(values); 0118 maxNumberOfShuffles--; 0119 } while(values[0] + values[1] == 10 && maxNumberOfShuffles > 0); 0120 } 0121 0122 for(var i = 0; i < numberOfPairs; i++) { 0123 valueArray.push("("); 0124 valueArray.push(values[indexOfNumberValue].toString()); 0125 totalSum += values[indexOfNumberValue]; 0126 indexOfNumberValue++; 0127 valueArray.push("+"); 0128 valueArray.push(values[indexOfNumberValue].toString()); 0129 totalSum += values[indexOfNumberValue]; 0130 indexOfNumberValue++; 0131 valueArray.push(")"); 0132 if(i != numberOfPairs - 1) { 0133 valueArray.push("+"); 0134 } 0135 } 0136 if(countOfNumbers % 2 != 0) { 0137 valueArray.push("+"); 0138 valueArray.push(values[indexOfNumberValue].toString()); 0139 totalSum += values[indexOfNumberValue]; 0140 } 0141 valueArray.push("="); 0142 valueArray.push(totalSum.toString()); 0143 return valueArray; 0144 } 0145 0146 function swapCards(firstCard, secondCard) { 0147 var selectedEquation = items.equations.get(firstCard.rowNumber).listmodel; 0148 var firstPosition = Math.min(firstCard.columnNumber, secondCard.columnNumber); 0149 var secondPosition = Math.max(firstCard.columnNumber, secondCard.columnNumber); 0150 if(firstPosition != secondPosition) { 0151 selectedEquation.move(firstPosition, secondPosition, 1); 0152 selectedEquation.move(secondPosition - 1, firstPosition, 1); 0153 } 0154 } 0155 0156 function selectCard(currentSelectedCard) { 0157 items.equations.get(currentSelectedCard.rowNumber).isValidationImageVisible = false; 0158 if(previousSelectedCard != undefined) { 0159 if(previousSelectedCard.rowNumber == currentSelectedCard.rowNumber) { 0160 swapCards(currentSelectedCard, previousSelectedCard) 0161 } 0162 items.equations.get(currentSelectedCard.rowNumber).listmodel.get(currentSelectedCard.columnNumber).selected = false; 0163 items.equations.get(previousSelectedCard.rowNumber).listmodel.get(previousSelectedCard.columnNumber).selected = false; 0164 previousSelectedCard = undefined; 0165 } 0166 else { 0167 previousSelectedCard = currentSelectedCard; 0168 } 0169 0170 } 0171 0172 function nextLevel() { 0173 items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel); 0174 initLevel(); 0175 } 0176 0177 function previousLevel() { 0178 items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel); 0179 initLevel(); 0180 } 0181 0182 function checkAnswer() { 0183 var isAllCorrect = true; 0184 for(var indexOfRows = 0; indexOfRows < items.equations.count; indexOfRows++) { 0185 var numberCardCounter = 0; 0186 var sum = 0; 0187 var isRowCorrect = true; 0188 var currentRow = items.equations.get(indexOfRows); 0189 var currentEquation = currentRow.listmodel; 0190 for(var indexOfCards = 0; indexOfCards < currentEquation.count - 1; indexOfCards++) { 0191 var currentCard = currentEquation.get(indexOfCards); 0192 if(currentCard.type == "numberCard") { 0193 if(numberCardCounter != 2) { 0194 sum += parseInt(currentCard.value); 0195 } 0196 numberCardCounter++; 0197 if(numberCardCounter == 2) { 0198 if(sum != 10) { 0199 isRowCorrect = false; 0200 break; 0201 } 0202 numberCardCounter = 0; 0203 sum = 0; 0204 } 0205 } 0206 } 0207 currentRow.isGood = isRowCorrect; 0208 currentRow.isValidationImageVisible = true; 0209 isAllCorrect = isAllCorrect & isRowCorrect; 0210 } 0211 if(isAllCorrect) { 0212 items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav"); 0213 items.bonus.good("flower"); 0214 } 0215 else { 0216 items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav"); 0217 } 0218 }