-
Notifications
You must be signed in to change notification settings - Fork 31
/
script.js
169 lines (140 loc) · 4.31 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/**
* Verkefni 7 – Gisk leikur
*
* Útfæra leik sem snýst um að giska á tölu milli 0 og 100.
*/
/**
* global fylki sem geymir fjölda ágiskana í leikjum
* Ef fylki er tómt hefur engin leikur verið spilaður.
* Ef fylki er [2, 3] hafa verið spilaðir tveir leikir þar sem:
* - Fyrsti kláraðist í tveim ágiskunum
* - Seinni kláraðist í þrem ágiskunum
*/
const GAMES = [];
/**
* Byrjar leikinn okkar með því að kalla í play().
* Eftir að að play() klárar, bíður notanda að spila annan leik með confirm()
* Ef notandi ýtir á "ok" er annar leikur spilaður
* Ef ýtt er á "cancel" er niðurstöðum leikja skilað með getResults() og alert()
*/
function start() {
alert('Velkomin í leikinn. Giskaðu á tölu');
do {
play();
} while (confirm('Spila annan?'));
alert(getResults());
}
/**
* Spilar einn leik. Sér um að:
* - Velja handahófskennda tölu í byrjun með randomNumber()
* - Biðja notanda um tölu með prompt()
* - Vinna úr inntaki frá notanda með parseGuess()
* - Láta vita hversu nálægt eða rétt gisk er með getResponse() og alert()
* - Halda utan um fjölda ágiskana
* - Vista fjölda ágiskana "games" fylki þegar búið að giska rétt
*
* Ef notandi ýtir á "cancel" þegar beðið er um ágiskun skal hætta í leik en
* ekki vista ágiskanir (nota "break" í lykkju.)
*
* Þarf að útfæra með lykkju og flæðistýringum.
*/
function play() {
// næsta lína kastar villu sem má sjá í "console" undir DevTools
const random = randomNumber(100);
console.log(random);
let correct = false;
let attempts = 0;
do {
const input = prompt('Giskaðu á tölu milli 0-100');
if (input === null) {
break;
}
const parsedInput = parseGuess(input);
correct = parsedInput === random;
alert(getResponse(parsedInput, random));
attempts++;
} while (!correct);
GAMES.push(attempts);
alert(`Rétt í ${attempts} ágiskunum`);
return true;
}
/**
* Skilar niðurstöðum um spilaða leiki sem streng.
* Fjölda leikja er skilað ásamt meðalfjölda giska, t.d.:
* "Þú spilaðir 10 leikir
* Meðalfjöldi ágiskana var 6"
* Ath að meðalfjöldi kemur í nýrri línu.
* Ef enginn leikur var spilaður er "Þú spilaðir engan leik" skilað.
*/
function getResults() {
const played = GAMES.length;
const average = calculateAverage();
const result = `Þú spilaðir ${played} leikir
Meðalfjöldi ágiskana var ${average.toFixed(2)}`;
return result;
}
/**
* Reiknar út og skilar meðal ágiskunum í öllum leikjum sem geymdir eru í
* global breytu "games". Skilar gildi með tveim aukastöfum.
* Ef games = [3, 4, 4] er niðurstaðan
* (3 + 4 + 4) / 3 = 3.666666667
* og er henni skilað sem 3.67
*
* Þarf að útfæra með lykkju.
*/
function calculateAverage() {
const played = GAMES.length;
let sum = 0;
for (const game of GAMES) {
sum += game;
}
const average = sum / played;
return average;
}
/**
* Tekur inn input sem streng og skilar þeirri tölu sem hægt er að ná þar úr.
* Ef ekki er hægt að ná tölu úr input er null skilað.
*/
function parseGuess(input) {
const parsed = parseInt(input, 10);
if (Number.isNaN(parsed)) {
return null;
}
return parsed;
}
/**
* Skilar svari sem birta á notanda sem streng, tekur inn tvær breytur
* - guess sem tölu, ágiskun notanda
* - correct sem tölu, rétt gildi
* Ef guess er < 0 eða ekki tala skal skila strengnum "Ekki rétt"
* Ef guess er nákvæmlega sama og correct skal skila strengnum "Rétt"
* Ef munur er undir 5 (|correct - guess| < 5) skal skila "Mjög nálægt"
* Ef munur er undir 10 skal skila "Nálægt"
* Ef munur er undir 20 skal skila "Frekar langt frá"
* Ef munur er undir 50 skal skila "Langt frá"
* Annars skal skila "Mjög langt frá"
*
* Þarf að útfæra með flæðistýringu.
* Math.abs skilar algildi tölu: |a| = Math.abs(a)
*/
function getResponse(guess, correct) {
const diff = Math.abs(correct - guess);
if (guess < 0 || isNaN(guess)) {
return 'Ekki rétt';
}
if (diff < 5) {
return 'Mjög nálægt';
}
if (diff < 10) {
return 'Nálægt';
}
return 'Mjög langt frá';
}
/**
* Skilar tölu af handahófi frá [0, n]
*/
function randomNumber(n) {
return Math.floor(Math.random() * (n + 1));
}
// Byrjar leik
start();