File indexing completed on 2024-04-28 15:07:51

0001 /* GCompris - GnumchEquality.qml
0002 *
0003 * SPDX-FileCopyrightText: 2014 Manuel Tondeur <manueltondeur@gmail.com>
0004 *
0005 * Authors:
0006 *   Joe Neeman (spuzzzzzzz@gmail.com) (GTK+ version)
0007 *   Manuel Tondeur <manueltondeur@gmail.com> (Qt Quick port)
0008 *
0009 *   SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 .pragma library
0012 .import QtQuick 2.12 as Quick
0013 .import "qrc:/gcompris/src/core/core.js" as Core
0014 
0015 var numberOfLevel
0016 var main
0017 var bonus
0018 var type
0019 var operator
0020 var modelCells
0021 var levels
0022 var useMultipleDataset
0023 var items
0024 var primeNumbers = [2, 3, 5, 7, 11, 13, 17, 19, 23]
0025 
0026 function start(items_, type_, useMultipleDataset_) {
0027     items = items_
0028     levels = items.levels
0029     useMultipleDataset = useMultipleDataset_
0030     bonus = items.bonus
0031     type = type_
0032     operator = items.operator
0033     modelCells = items.modelCells
0034     numberOfLevel = (useMultipleDataset) ? levels.length : 8
0035     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0036 }
0037 
0038 function stop() {
0039 }
0040 
0041 function initLevel() {
0042     if(type === "equality" || type === "inequality") {
0043         operator = levels[items.currentLevel].operator
0044     }
0045     fillAllGrid();
0046 }
0047 
0048 function nextLevel() {
0049     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0050 }
0051 
0052 function previousLevel() {
0053     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0054 }
0055 
0056 function getGoal() {
0057     var goal = 0
0058     if (useMultipleDataset) {
0059         goal = levels[items.currentLevel].goal
0060     }
0061     else {
0062         if (type == "multiples") {
0063             goal = items.currentLevel + 2
0064         } else if (type == "factors") {
0065             var goalsFactor = [4, 6, 8, 10, 12, 15, 18, 20]
0066             goal = goalsFactor[items.currentLevel]
0067         } else if (type == "primes") {
0068             goal = primeNumbers[items.currentLevel + 1] + 1
0069         }
0070     }
0071 
0072     return goal
0073 }
0074 
0075 function genNumber() {
0076     if (Math.random() < 0.5) {
0077         // Choose a good number
0078         return (getGoal())
0079     } else {
0080         // Choose a bad number
0081         var sign = Math.random() - 0.5
0082         sign = sign / Math.abs(sign)
0083         var number = getGoal() + (sign * Math.floor(((Math.random() * (getGoal() - 1)) + 1)))
0084         return number
0085     }
0086 }
0087 
0088 function genMultiple() {
0089     var number = getGoal() * Math.floor(Math.random() * 6 + 1)
0090     if (Math.random() < 0.5) {
0091         // Choose a good number
0092         return number
0093     } else {
0094         // Choose a bad number
0095         return number - 1
0096     }
0097 }
0098 
0099 function genFactor() {
0100     var goodOnes = []
0101     var badOnes = []
0102     for (var div = 1; div < getGoal() + 1; ++div) {
0103         if (getGoal() % div == 0) {
0104             goodOnes.push(div)
0105         } else {
0106             badOnes.push(div)
0107         }
0108     }
0109 
0110     if (Math.random() < 0.5) {
0111         // Choose a good number
0112         return goodOnes[Math.floor(Math.random() * goodOnes.length)]
0113     } else {
0114         // Choose a bad number
0115         return badOnes[Math.floor(Math.random() * badOnes.length)]
0116     }
0117 }
0118 
0119 function genPrime() {
0120     var badNumbers = [1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22]
0121     if (Math.random() < 0.5) {
0122         // Choose a good number
0123         var goodOnes = []
0124         for (var it = 0; it < primeNumbers.length; ++it) {
0125             if (getGoal() < primeNumbers[it])
0126                 break
0127 
0128             goodOnes.push(primeNumbers[it])
0129         }
0130         return goodOnes[Math.floor(Math.random() * goodOnes.length)]
0131     } else {
0132         // Choose a bad number
0133         var badOnes = []
0134         for (var it = 0; it < badNumbers.length; ++it) {
0135             if (getGoal() < badNumbers[it])
0136                 break
0137 
0138             badOnes.push(badNumbers[it])
0139         }
0140         return badOnes[Math.floor(Math.random() * badOnes.length)]
0141     }
0142 }
0143 
0144 function genTime() {
0145     // generate a time in millisecond between 3,000 and 10,000
0146     var time = Math.floor(((Math.random() * 10) + 3)) * 1000
0147     return time
0148 }
0149 
0150 function splitDivisionNumber(term) {
0151     var term1 = term * Math.floor(Math.random() * 6 + 1)
0152     var term2 = term1 / term
0153 
0154     return [term1, term2]
0155 }
0156 
0157 function splitMultiplicationNumber(term) {
0158     var factors = []
0159     for (var div = 1; div < term + 1; ++div) {
0160         if (getGoal() % div == 0) {
0161             factors.push(div)
0162         }
0163     }
0164     var term1 = factors[Math.floor(Math.random() * factors.length)]
0165     var term2 = Math.floor(term / term1);
0166 
0167     if (Math.random() < 0.5) {
0168         return [term1, term2]
0169     } else {
0170         return [term2, term1]
0171     }
0172 }
0173 
0174 
0175 function splitPlusNumber(term) {
0176     // Check if the term is odd
0177     var odd = term % 2
0178 
0179     var term1 = Math.floor(term / 2)
0180     var term2 = term1 + odd
0181 
0182     // Shift randomly the terms
0183     var shift = Math.floor((Math.random() * term1))
0184     term1 += shift
0185     term2 -= shift
0186 
0187     // Switch randomly the terms
0188     if (Math.random() < 0.5) {
0189         return [term1, term2]
0190     } else {
0191         return [term2, term1]
0192     }
0193 }
0194 
0195 function splitMinusNumber(term) {
0196     var term1 = term
0197     var term2 = 0
0198 
0199     // Shift randomly the terms
0200     var shift = Math.floor((Math.random() * (term + 1)))
0201     term1 += shift
0202     term2 += shift
0203 
0204     return [term1, term2]
0205 }
0206 
0207 function genPosition(direction, cellWidth, cellHeight) {
0208     var randomNumber = Math.floor(Math.random() * 5)
0209 
0210     if (direction == 0) {
0211         return [6 * randomNumber, 0, cellHeight * randomNumber]
0212     } else if (direction == 2) {
0213         return [randomNumber, cellWidth * randomNumber, 0]
0214     } else if (direction == 1) {
0215         return [6 * randomNumber + 5, cellWidth * 5, cellHeight * randomNumber]
0216     } else if (direction == 3) {
0217         return [30 + randomNumber, cellWidth * randomNumber, cellHeight * 5]
0218     }
0219 }
0220 
0221 function genMonster() {
0222     var monsters = ["Reggie", "Diaper", "Eater", "Fraidy", "Smarty", "Reggie"]
0223     var allowedMonsters = items.currentLevel % 7
0224     return monsters[Math.floor(Math.random()*allowedMonsters)]
0225 }
0226 
0227 function fillAllGrid() {
0228     modelCells.clear()
0229     if (type == "equality" || type == "inequality") {
0230         for (var it = 0; it < 36; it++) {
0231             var terms
0232             if (operator === " + ") {
0233                 terms = splitPlusNumber(
0234                             genNumber())
0235             } else if (operator === " - ") {
0236                 terms = splitMinusNumber(
0237                             genNumber())
0238             } else if(operator === " * ") {
0239                 terms = splitMultiplicationNumber(
0240                             genNumber())
0241             } else if(operator === " / ") {
0242                 terms = splitDivisionNumber(
0243                             genNumber())
0244             }
0245 
0246             modelCells.append({
0247                                    number1: terms[0],
0248                                    number2: terms[1],
0249                                    show: true
0250                                })
0251         }
0252     } else if (type == "primes") {
0253         for (var it = 0; it < 36; it++) {
0254             modelCells.append({"number1": genPrime(), "number2": -1, "show": true});
0255         }
0256     } else if (type == "factors") {
0257         for (var it = 0; it < 36; it++) {
0258             modelCells.append({"number1": genFactor(), "number2": -1, "show": true});
0259         }
0260     } else if (type == "multiples") {
0261         for (var it = 0; it < 36; it++) {
0262             modelCells.append({"number1": genMultiple(), "number2": -1, "show": true});
0263         }
0264     }
0265 }
0266 
0267 function isExpressionEqualsToGoal(position){
0268     if (operator === " + ") {
0269         if ((modelCells.get(position).number1 + modelCells.get(
0270                  position).number2) == (getGoal())) {
0271             return true
0272         } else {
0273             return false
0274         }
0275     } else if (operator === " - ") {
0276         if ((modelCells.get(position).number1 - modelCells.get(
0277                  position).number2) == (getGoal())) {
0278             return true
0279         } else {
0280             return false
0281         }
0282     } else if (operator === " * ") {
0283         if ((modelCells.get(position).number1 * modelCells.get(
0284                  position).number2) === (getGoal())) {
0285             return true
0286         } else {
0287             return false
0288         }
0289     } else if (operator === " / ") {
0290         if ((modelCells.get(position).number1 / modelCells.get(
0291                  position).number2) === (getGoal())) {
0292             return true
0293         } else {
0294             return false
0295         }
0296     }
0297 }
0298 
0299 function isAnswerCorrect(position) {
0300     if (type === "equality") {
0301         return isExpressionEqualsToGoal(position)
0302     } else if (type === "inequality") {
0303         return (!isExpressionEqualsToGoal(position))
0304     } else if (type === "multiples") {
0305         if ((modelCells.get(position).number1 / getGoal()) % 1 == 0) {
0306             return true
0307         } else {
0308             return false
0309         }
0310     } else if (type === "factors") {
0311         if ((getGoal() / modelCells.get(position).number1) % 1 == 0) {
0312             return true
0313         } else {
0314             return false
0315         }
0316     } else if (type == "primes") {
0317         for (var it = 0; it < primeNumbers.length; ++it) {
0318             if (primeNumbers[it] == modelCells.get(position).number1)
0319                 return true
0320         }
0321         return false
0322     }
0323 }