Files
1XJT/scoring/pages/compute/compute.vue
2025-11-12 15:09:03 +08:00

333 lines
7.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<!-- 顶部表头 -->
<view class="table-header">
<view class="header-player">玩家</view>
<view class="header-result">胜负</view>
<view class="header-score">得分</view>
</view>
<!-- 玩家信息区域 -->
<view class="player-row">
<view class="player-info">
<view class="player-avatar">
<!-- 兔子头像 SVG -->
<svg width="30" height="30" viewBox="0 0 30 30">
<ellipse cx="15" cy="20" rx="9" ry="6" fill="#ffffff"/>
<circle cx="15" cy="12" r="7" fill="#ffffff"/>
<ellipse cx="12" cy="8" rx="2" ry="4" fill="#ffffff"/>
<ellipse cx="18" cy="8" rx="2" ry="4" fill="#ffffff"/>
<ellipse cx="12" cy="8" rx="1" ry="3" fill="#ffb6c1"/>
<ellipse cx="18" cy="8" rx="1" ry="3" fill="#ffb6c1"/>
<circle cx="13" cy="12" r="1" fill="#333333"/>
<circle cx="17" cy="12" r="1" fill="#333333"/>
<circle cx="15" cy="14" r="0.8" fill="#ff69b4"/>
<path d="M14,16 Q15,17 16,16" stroke="#ff69b4" stroke-width="0.5" fill="none"/>
<circle cx="11" cy="13" r="1.5" fill="#ffb6c1" opacity="0.6"/>
<circle cx="19" cy="13" r="1.5" fill="#ffb6c1" opacity="0.6"/>
<rect x="10" cy="19" width="10" height="4" fill="#4169e1" rx="1"/>
<circle cx="20" cy="21" r="2" fill="#ffd700"/>
</svg>
</view>
<text class="player-name">玩家59306</text>
</view>
<view class="result-buttons">
<view
class="result-btn"
:class="{ active: result === 'win' }"
@tap="setResult('win')"
></view>
<view
class="result-btn"
:class="{ active: result === 'lose' }"
@tap="setResult('lose')"
></view>
</view>
<view class="score-display">
<text class="score-value">{{ score }}</text>
<button class="sum-btn" @tap="sumScore">Σ 合分</button>
</view>
</view>
<!-- 固定在底部的数字键盘 -->
<view class="keyboard">
<view
v-for="key in keys"
:key="key.value"
class="key"
:class="{
'operator': key.type === 'operator',
'minus': key.value === '-',
'submit-key': key.type === 'submit'
}"
@tap="pressKey(key.value, key.type)"
>{{ key.display }}</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
const result = ref('win');
const score = ref('0');
// 键盘布局 - 提交按钮在0的左侧
const keys = [
{ value: '1', display: '1', type: 'number' },
{ value: '2', display: '2', type: 'number' },
{ value: '3', display: '3', type: 'number' },
{ value: '+', display: '+', type: 'operator' },
{ value: '×', display: '×', type: 'delete' },
{ value: '4', display: '4', type: 'number' },
{ value: '5', display: '5', type: 'number' },
{ value: '6', display: '6', type: 'number' },
{ value: '-', display: '-', type: 'operator' },
{ value: '√', display: '√', type: 'operator' },
{ value: '7', display: '7', type: 'number' },
{ value: '8', display: '8', type: 'number' },
{ value: '9', display: '9', type: 'number' },
{ value: 'submit', display: '提交', type: 'submit' }, // 提交按钮在0的左侧
{ value: '0', display: '0', type: 'number' }
];
const setResult = (res) => {
result.value = res;
};
const pressKey = (key, type) => {
if (type === 'submit') {
// 提交分数
if (score.value !== '0') {
uni.showToast({
title: `分数 ${score.value} 已提交`,
icon: 'success'
});
// 实际应用中这里应该调用API提交分数
console.log('提交分数:', score.value);
// 重置分数
setTimeout(() => {
score.value = '0';
}, 1500);
}
} else if (key === '×') {
// 删除最后一个字符
if (score.value.length > 1) {
score.value = score.value.slice(0, -1);
} else {
score.value = '0';
}
} else if (key === '√') {
// 计算平方根
try {
const result = Math.sqrt(parseFloat(score.value));
score.value = result.toString();
} catch (error) {
score.value = '错误';
setTimeout(() => {
score.value = '0';
}, 1000);
}
} else {
// 添加数字或运算符
if (score.value === '0') {
score.value = key;
} else {
score.value += key;
}
}
};
const sumScore = () => {
uni.showToast({
title: '合分功能需要与后端API交互',
icon: 'none'
});
};
</script>
<style scoped>
.container {
min-height: 100vh;
background-color: #f5f5f5;
padding-bottom: 240rpx; /* 为底部键盘留出空间 */
}
/* 顶部表头 */
.table-header {
display: flex;
background-color: white;
padding: 30rpx 40rpx;
border-bottom: 1px solid #e0e0e0;
position: sticky;
top: 0;
z-index: 10;
}
.header-player {
flex: 1;
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.header-result {
width: 200rpx;
font-size: 32rpx;
color: #333;
font-weight: 500;
text-align: center;
}
.header-score {
width: 200rpx;
font-size: 32rpx;
color: #333;
font-weight: 500;
text-align: center;
}
/* 玩家信息区域 */
.player-row {
display: flex;
align-items: center;
padding: 30rpx 40rpx;
border-bottom: 1px solid #f5f5f5;
background-color: white;
}
.player-info {
flex: 1;
display: flex;
align-items: center;
}
.player-avatar {
width: 80rpx;
height: 80rpx;
border-radius: 16rpx;
background-color: #1e3a8a;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
}
.player-name {
font-size: 32rpx;
color: #333;
}
.result-buttons {
width: 200rpx;
display: flex;
background-color: #f0f0f0;
border-radius: 8rpx;
padding: 4rpx;
}
.result-btn {
flex: 1;
padding: 12rpx 0;
text-align: center;
font-size: 28rpx;
border-radius: 6rpx;
}
.result-btn.active {
background-color: #6a5acd;
color: white;
}
.score-display {
width: 200rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.score-value {
font-size: 36rpx;
color: #333;
font-weight: 500;
}
.sum-btn {
background-color: #6a5acd;
color: white;
border: none;
border-radius: 8rpx;
padding: 12rpx 20rpx;
font-size: 28rpx;
}
/* 固定在底部的数字键盘 */
.keyboard {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 1px;
background-color: #e0e0e0;
padding: 1px;
position: fixed;
bottom: 0;
left: 0;
right: 0;
max-width: 750rpx;
margin: 0 auto;
}
.key {
background-color: white;
display: flex;
align-items: center;
justify-content: center;
height: 120rpx;
font-size: 40rpx;
}
.key:active {
background-color: #f0f0f0;
}
.operator {
color: #6a5acd;
}
.minus {
color: #ff4757;
}
.submit-key {
background-color: #8a2be2;
color: white;
font-weight: 500;
}
/* 调整键盘布局使提交按钮在0的左侧 */
.keyboard {
grid-template-areas:
"num1 num2 num3 plus delete"
"num4 num5 num6 minus sqrt"
"num7 num8 num9 submit num0";
}
.key:nth-child(1) { grid-area: num1; }
.key:nth-child(2) { grid-area: num2; }
.key:nth-child(3) { grid-area: num3; }
.key:nth-child(4) { grid-area: plus; }
.key:nth-child(5) { grid-area: delete; }
.key:nth-child(6) { grid-area: num4; }
.key:nth-child(7) { grid-area: num5; }
.key:nth-child(8) { grid-area: num6; }
.key:nth-child(9) { grid-area: minus; }
.key:nth-child(10) { grid-area: sqrt; }
.key:nth-child(11) { grid-area: num7; }
.key:nth-child(12) { grid-area: num8; }
.key:nth-child(13) { grid-area: num9; }
.key:nth-child(14) { grid-area: submit; }
.key:nth-child(15) { grid-area: num0; }
</style>