Skip to content

Commit 5d6c13a

Browse files
committed
🐛 allow repeat number
1 parent 259ba2c commit 5d6c13a

1 file changed

Lines changed: 65 additions & 43 deletions

File tree

src/App.vue

Lines changed: 65 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
</button>
2525
</div>
2626

27-
<div class="result" v-if="currentNumber !== null">
28-
<div class="number">{{ currentNumber }}</div>
27+
<div class="result" v-if="displayNumber !== null">
28+
<div class="number">{{ displayNumber }}</div>
2929
</div>
3030

3131
<div class="history-section" v-if="drawnNumbers.length > 0">
@@ -41,16 +41,16 @@
4141
</div>
4242
<div class="history">
4343
<div
44-
v-for="(num, index) in drawnNumbers"
45-
:key="num"
44+
v-for="item in drawnNumbers"
45+
:key="item.id"
4646
class="history-number"
47-
:class="{ 'new-number': index === drawnNumbers.length - 1 }"
47+
:class="{ 'new-number': item.id === drawnNumbers[drawnNumbers.length - 1].id }"
4848
:style="{
49-
'--gradient-opacity': 1 - (drawnNumbers.length - 1 - index) / drawnNumbers.length,
50-
'--gradient-delay': `${index * 0.1}s`
49+
'--gradient-opacity': 1 - (drawnNumbers.length - 1 - drawnNumbers.indexOf(item)) / drawnNumbers.length,
50+
'--gradient-delay': `${drawnNumbers.indexOf(item) * 0.1}s`
5151
}"
5252
>
53-
{{ num }}
53+
{{ item.number }}
5454
</div>
5555
</div>
5656
</div>
@@ -59,10 +59,11 @@
5959
<h3>Tips</h3>
6060
<ul class="tips-list">
6161
<li>Set your maximum number (1-100) to define the range</li>
62-
<li>Click "Draw" to randomly select a number</li>
63-
<li>Each number can only be drawn once</li>
64-
<li>Use "Clear History" to start fresh</li>
65-
<li>Numbers are drawn without replacement</li>
62+
<li>Click <span class="button-text draw">Draw</span> to randomly select a number</li>
63+
<li>Numbers can be drawn multiple times</li>
64+
<li>Use <span class="button-text clear">Clear History</span> to start fresh</li>
65+
<li>Each draw is completely random and independent</li>
66+
<li>History shows the last 10 drawn numbers</li>
6667
</ul>
6768
</div>
6869
</main>
@@ -77,53 +78,49 @@ export default {
7778
setup() {
7879
const maxNumber = ref(10)
7980
const currentNumber = ref(null)
81+
const displayNumber = ref(null)
8082
const drawnNumbers = ref([])
8183
const isDrawing = ref(false)
82-
const availableNumbers = ref([])
8384
const isValid = ref(true)
85+
let historyId = 0
8486
8587
const validateInput = () => {
8688
if (maxNumber.value < 1) maxNumber.value = 1
8789
if (maxNumber.value > 100) maxNumber.value = 100
8890
isValid.value = true
8991
}
9092
91-
const resetAvailableNumbers = () => {
92-
availableNumbers.value = Array.from(
93-
{ length: maxNumber.value },
94-
(_, i) => i + 1
95-
)
96-
}
97-
9893
const clearHistory = () => {
9994
drawnNumbers.value = []
100-
resetAvailableNumbers()
10195
currentNumber.value = null
96+
displayNumber.value = null
97+
historyId = 0
10298
}
10399
104100
const drawLot = () => {
105-
if (isDrawing.value || availableNumbers.value.length === 0) return
101+
if (isDrawing.value) return
106102
107103
isDrawing.value = true
108104
let startTime = null
109-
const duration = 2000 // 2 seconds
105+
const duration = 1000 // 1 second
110106
111107
const animate = (timestamp) => {
112108
if (!startTime) startTime = timestamp
113109
const progress = timestamp - startTime
114110
115111
if (progress < duration) {
116-
const randomIndex = Math.floor(Math.random() * availableNumbers.value.length)
117-
currentNumber.value = availableNumbers.value[randomIndex]
112+
// During animation, show random numbers from the same range
113+
displayNumber.value = Math.floor(Math.random() * maxNumber.value) + 1
118114
requestAnimationFrame(animate)
119115
} else {
120-
const randomIndex = Math.floor(Math.random() * availableNumbers.value.length)
121-
currentNumber.value = availableNumbers.value[randomIndex]
122-
drawnNumbers.value.push(currentNumber.value)
116+
// At the end of animation, generate the actual random number
117+
const finalNumber = Math.floor(Math.random() * maxNumber.value) + 1
118+
currentNumber.value = finalNumber
119+
displayNumber.value = finalNumber
120+
drawnNumbers.value.push({ id: historyId++, number: finalNumber })
123121
if (drawnNumbers.value.length > 10) {
124122
drawnNumbers.value.shift()
125123
}
126-
availableNumbers.value.splice(randomIndex, 1)
127124
isDrawing.value = false
128125
}
129126
}
@@ -132,16 +129,17 @@ export default {
132129
}
133130
134131
onMounted(() => {
135-
resetAvailableNumbers()
132+
validateInput()
136133
})
137134
138135
watch(maxNumber, () => {
139-
resetAvailableNumbers()
136+
validateInput()
140137
})
141138
142139
return {
143140
maxNumber,
144141
currentNumber,
142+
displayNumber,
145143
drawnNumbers,
146144
isDrawing,
147145
drawLot,
@@ -231,18 +229,21 @@ header {
231229
border: none;
232230
border-radius: 6px;
233231
font-size: 1.1rem;
234-
font-weight: bold;
232+
font-weight: 600;
235233
cursor: pointer;
236-
transition: transform 0.2s ease, background-color 0.2s ease;
234+
transition: all 0.3s ease;
235+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
237236
238237
&:hover:not(:disabled) {
239238
transform: translateY(-2px);
240239
background-color: darken(#4a90e2, 10%);
240+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
241241
}
242242
243243
&:disabled {
244244
background-color: #ccc;
245245
cursor: not-allowed;
246+
opacity: 0.7;
246247
}
247248
}
248249
@@ -390,17 +391,38 @@ header {
390391
font-weight: 600;
391392
transition: all 0.3s ease;
392393
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
394+
395+
&:hover:not(:disabled) {
396+
transform: translateY(-2px);
397+
background: #c0392b;
398+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
399+
}
400+
401+
&:disabled {
402+
background: #ccc;
403+
cursor: not-allowed;
404+
opacity: 0.7;
405+
}
393406
}
394407
395-
.clear-button:hover:not(:disabled) {
396-
background: #c0392b;
397-
transform: translateY(-2px);
398-
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
399-
}
400-
401-
.clear-button:disabled {
402-
background: #ccc;
403-
cursor: not-allowed;
404-
opacity: 0.7;
408+
.button-text {
409+
display: inline-block;
410+
padding: 0.2rem 0.5rem;
411+
border-radius: 4px;
412+
font-weight: 600;
413+
font-size: 0.9em;
414+
margin: 0 0.2rem;
415+
416+
&.draw {
417+
background-color: var(--primary-color);
418+
color: white;
419+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
420+
}
421+
422+
&.clear {
423+
background-color: #e74c3c;
424+
color: white;
425+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
426+
}
405427
}
406428
</style>

0 commit comments

Comments
 (0)