昨天突然想起上学时玩的文曲星(电子词典),里面有个猜数字的小游戏,于是拿 ECharts 试着做了一下,大体思路如下:
heatmap 虚拟按键实现
heatmap 数据准备
// 准备 heatmap 的按钮数据,用 '-1' 作为退格按钮、'-2'作为猜数按钮
var btnData = (function() {
var res = [];
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
if (j > 0) {
res.push([i, j, '' + (j * 3 + i - 2)]);
} else {
res.push([i, j, '' + (0 - i)]);
}
}
}
return res;
})();
heatmap 所在 x、y 坐标轴数据
var categoryX = ['0', '1', '2'];
var categoryY = ['0', '1', '2', '3'];
heatmap 部分配置项
option = {
title: {
text: '文曲星词典猜数字游戏'
},
tooltip: {
show: false
},
grid: {
width: '30%',
height: '60%',
left: '10px',
top: '30%'
},
xAxis: {
show: false,
type: 'category',
data: categoryX,
splitArea: {
show: true
}
},
yAxis: {
show: false,
type: 'category',
data: categoryY,
splitArea: {
show: true
}
},
series: [{
id: 'btnPanel',
type: 'heatmap',
label: {
normal: {
show: true,
formatter: function(params) {
if (params.data[2] < 0) {
return params.data[2] == -1 ? '⬅' : '猜';
}
return params.data[2];
}
}
},
data: btnData
}]
};
graphic 输入框、提示框实现
输入框、提示框生成函数( 4个方块数字框 + 提示框),这个函数返回的 JSON 对象用于 option.graphic 配置
// 输入框、提示框生成函数( 4个方块数字框 + 提示框)
function graphicObj(arr, msg) {
var res = [];
for (var i = 0; i < 4; i++) {
res.push({
type: 'group',
id: 'textGroup' + i,
left: 50 + i * 60,
top: 50,
children: [{
type: 'rect',
z: 100,
left: 'center',
top: 'center',
shape: {
width: 40,
height: 50
},
style: {
fill: '#fff',
stroke: '#999',
lineWidth: 2,
shadowBlur: 8,
shadowOffsetX: 3,
shadowOffsetY: 3,
shadowColor: 'rgba(0,0,0,0.3)'
}
},
{
type: 'text',
z: 100,
top: 'middle',
left: 'center',
style: {
text: typeof(arr[arr.length - 4 + i]) === 'undefined' ? '' : arr[arr.length - 4 + i],
font: '20px "STHeiti", sans-serif'
}
}
]
});
}
res.push({
type: 'text',
z: 100,
top: '50',
left: '400',
style: {
text: msg,
font: '20px "STHeiti", sans-serif'
}
});
return res;
}
交互部分实现
监听 heatmap 上的点击事件
// 点击热力图时调用 btnClick 函数
myChart.on('click', function(params) {
if (params.seriesId === 'btnPanel' && times > 0) {
btnClick(params.data[2]);
}
});
btnClick 函数定义
// 按钮点击响应函数
function btnClick(btnID) {
if (btnID === '-1') {
inputList.pop();
} else if (btnID === '-2') {
return inputList.length === 4 ? guess(inputList) : alert('请先填入 4 个数字再猜!');
} else {
inputList.length === 4 ? inputList[3] = btnID : inputList.push(btnID);
}
myChart.setOption({
graphic: graphicObj(inputList, msgList.join('\n'))
});
}
guess 函数定义
猜数函数
function guess(arr) {
if (arr.length != 4) {
return alert('请猜4位数字');
}
var info;
var A = 0;
var B = 0;
times--;
for (var i = 0; i < 4; i++) {
if (secretNumList.indexOf(arr[i]) === i) {
A++;
} else if (secretNumList.indexOf(arr[i]) != -1) {
B++;
}
}
if (A === 4) {
info = arr.join('') + ' 猜中了!!!';
times = 0;
} else {
info = arr.join('') + ' ' + A + 'A' + B + 'B , 你还有' + times + '次机会...';
}
msgList.push(info);
inputList = [];
myChart.setOption({
graphic: graphicObj(inputList, msgList.join('\n'))
});
}
本文分享自 ZXand618的ECharts之旅 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!