-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.html
171 lines (156 loc) · 6.67 KB
/
index.html
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
170
171
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Towers of Hanoi | Playground</title>
<link rel="stylesheet" type="text/css" href="src/css/style.css" />
<link rel="icon" href="src/favicon.ico" type="image/x-icon">
<script>
var blockSelected = undefined
var towerSelected = undefined
var data = [[], [], []]
var towers = undefined
var counter = undefined
var moveCount = 0
function towerClicked(index){
if (blockSelected == undefined){
if (data[index].length > 0){
// select the block on top
blockSelected = data[index][data[index].length - 1]
towerSelected = index
console.log('Block', blockSelected, 'selected from tower' + (index+1))
}
} else {
if (data[index].length == 0){
// place the block on the target tower
data[index] = [data[towerSelected].pop()]
} else if (data[index][data[index].length - 1] > blockSelected){
// place the block on the top of the target tower
data[index].push(data[towerSelected].pop())
} else {
moveCount -= 1
}
moveCount += 1
counter.innerHTML = moveCount
console.log('Block', blockSelected, 'dropped on tower' + (index+1))
blockSelected = undefined
towerSelected = undefined
}
updateUI()
}
function updateUI(){
// clears and updates the ui
for (let index=0; index < 3; index++){
towers[index].innerHTML = ""
// highlight selected pole
if (towerSelected == index){
towers[index].classList.add('selected')
} else {
towers[index].classList.remove('selected')
}
// populate towers with blocks
for (var block of data[index]) {
element = document.createElement('div')
element.classList.add('block'+(block+1))
element.classList.add('block')
element.style.width = (200 + (block*200))+"%"
towers[index].appendChild(element)
}
// add draggable properties to top block
if (data[index].length > 0){
towers[index].childNodes[towers[index].childNodes.length-1].draggable = true
towers[index].childNodes[towers[index].childNodes.length-1].ondragstart = (event) => {
dragHandler(index, event)
}
}
}
}
function dragHandler(tower, event){
console.log('dragging from', tower)
towerSelected = tower
blockSelected = data[tower][data[tower].length - 1]
}
function dropHandler(tower, event){
// console.log('dragged to', tower)
towerClicked(tower)
return false
}
function dragOverHandler(event){
event.preventDefault()
}
// #region Theme
const THEMES = {
dark: {
'--bg': '#000',
'--layer1': '#fff3',
'--fg': '#ccc'
},
light: {
'--bg': '#fff',
'--layer1': '#0008',
'--fg': '#222'
}
}
var CURRENT_SCHEME
const shiftColorTheme = theme => {
const root = document.querySelector(':root')
CURRENT_SCHEME = theme
for (const color in theme) {
root.style.setProperty(color, theme[color])
}
}
const toggleColorScheme = () => {
switch (CURRENT_SCHEME) {
case THEMES.dark:
shiftColorTheme(THEMES.light)
break
case THEMES.light:
default:
shiftColorTheme(THEMES.dark)
break
}
}
const goDark = () => { shiftColorTheme(THEMES.dark) }
const goLight = () => { shiftColorTheme(THEMES.light) }
// #endregion
</script>
</head>
<body>
<div class="themeButton" onclick="toggleColorScheme()">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-brightness-high-fill" viewBox="0 0 16 16">
<path d="M12 8a4 4 0 1 1-8 0 4 4 0 0 1 8 0M8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0m0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13m8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5M3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8m10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0m-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0m9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707M4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708"/>
</svg>
</div>
<div class="counter">0</div>
<div id="space">
<div class="towerSpace" onclick="towerClicked(0)" ondrop="dropHandler(0, event)" ondragover="dragOverHandler(event)">
<div class="tower">
<!-- <div class="block block2"></div>
<div class="block block1"></div> -->
</div>
</div>
<div class="towerSpace" onclick="towerClicked(1)" ondrop="dropHandler(1, event)" ondragover="dragOverHandler(event)">
<div class="tower"></div>
</div>
<div class="towerSpace" onclick="towerClicked(2)" ondrop="dropHandler(2, event)" ondragover="dragOverHandler(event)">
<div class="tower"></div>
</div>
</div>
<script>
towers = document.getElementsByClassName('tower')
counter = document.querySelector('.counter')
NUMBER_OF_BLOCKS = parseInt(prompt('Select the number of Hanoi blocks that you want'))
if (NUMBER_OF_BLOCKS > 10) {
alert('You are wasting your time\nOnly 10 are allowed')
NUMBER_OF_BLOCKS = 10
}
data = [[], [], []]
for (let x=NUMBER_OF_BLOCKS-1; x>=0; x--)
data[0].push(x)
updateUI()
toggleColorScheme()
</script>
</body>
</html>