BangleApps/apps/random/app.js

205 lines
4.5 KiB
JavaScript

let n = 1;
let diceSides = 6;
let replacement = false;
let min = 1;
let max = 10;
Bangle.loadWidgets();
Bangle.drawWidgets();
function showCoinMenu() {
E.showMenu({
'': {
'title': 'Coin flip',
'back': showMainMenu
},
'# of coins': {
value: n,
step: 1,
min: 1,
onchange: value => n = value
},
'Go': () => {
let resultMenu = {
'': {
'title': 'Result',
'back': showCoinMenu
}
};
let heads = 0;
for (let i = 0; i < n; i++) {
let coin = Math.random() < 0.5;
if (coin) heads++;
resultMenu[`${i + 1}: ${coin ? 'Heads' : 'Tails'}`] = () => { };
}
let tails = n - heads;
resultMenu[`${heads} heads, ${Math.round(100 * heads / n)}%`] = () => { };
resultMenu[`${tails} tails, ${Math.round(100 * tails / n)}%`] = () => { };
E.showMenu(resultMenu);
}
});
}
function showDiceMenu() {
E.showMenu({
'': {
'title': 'Dice roll',
'back': showMainMenu
},
'# of dice': {
value: n,
step: 1,
min: 1,
onchange: value => n = value
},
'# of sides': {
value: diceSides,
step: 1,
min: 2,
onchange: value => diceSides = value
},
'Go': () => {
let resultMenu = {
'': {
'title': 'Result',
'back': showDiceMenu
}
};
let sum = 0;
let min = diceSides + 1;
let max = 0;
for (let i = 0; i < n; i++) {
let roll = Math.floor(Math.random() * diceSides + 1);
sum += roll;
if (roll < min) min = roll;
if (roll > max) max = roll;
resultMenu[`${i + 1}: ${roll}`] = () => { };
}
resultMenu[`Sum: ${sum}`] = () => { };
resultMenu[`Min: ${min}`] = () => { };
resultMenu[`Max: ${max}`] = () => { };
resultMenu[`Average: ${sum / n}`] = () => { };
E.showMenu(resultMenu);
}
});
}
function showCardMenu() {
E.showMenu({
'': {
'title': 'Card draw',
'back': showMainMenu
},
'# of cards': {
value: Math.min(52, n),
step: 1,
min: 1,
max: 52,
onchange: value => n = value
},
'Replacement': {
value: replacement,
onchange: value => {
replacement = value;
if (replacement && n > 52) n = 52;
}
},
'Go': () => {
n = Math.min(n, 52);
const SUITS = ['Spades', 'Diamonds', 'Clubs', 'Hearts'];
const RANKS = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King'];
class Card {
constructor(suit, rank) {
this.suit = suit;
this.rank = rank;
}
//Can't use == to check equality, so using Java-inspired .equals()
equals(other) {
return this.suit == other.suit && this.rank == other.rank;
}
}
let resultMenu = {
'': {
'title': 'Result',
'back': showCardMenu
}
};
let cards = [];
for (let i = 0; i < n; i++) {
let newCard;
while (true) {
newCard = new Card(
SUITS[Math.floor(Math.random() * SUITS.length)],
RANKS[Math.floor(Math.random() * RANKS.length)]);
if (replacement) break; //If we are doing replacement, skip the check for duplicates and stop looping
if (!cards.map(card => card.equals(newCard)).includes(true)) break; //If there are no duplicates found, stop looping
}
cards.push(newCard);
resultMenu[`${newCard.rank} of ${newCard.suit}`] = () => { };
}
E.showMenu(resultMenu);
}
});
}
function showNumberMenu() {
E.showMenu({
'': {
'title': 'Number choice',
'back': showMainMenu
},
'Minimum': {
value: min,
step: 1,
onchange: value => min = value
},
'Maximum': {
value: max,
step: 1,
onchange: value => max = value
},
'# of choices': {
value: n,
min: 1,
step: 1,
onchange: value => n = value
},
'Go': () => {
let resultMenu = {
'': {
'title': 'Result',
'back': showNumberMenu
}
};
for (let i = 0; i < n; i++) {
let value = Math.floor(min + Math.random() * (max - min + 1));
resultMenu[`${i + 1}: ${value}`] = () => { };
}
E.showMenu(resultMenu);
}
});
}
function showMainMenu() {
E.showMenu({
'': {
'title': 'Random'
},
'Coin': showCoinMenu,
'Dice': showDiceMenu,
'Card': showCardMenu,
'Number': showNumberMenu
});
}
showMainMenu();