
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<style>
.panel-row {
display: flex;
}
.panel {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 60px;
font-weight: bold;
font-size: 30px;
border: 2px solid black;
}
.panel-row:not(:last-child) .panel {
border-bottom: 0;
}
.panel:not(:last-child) {
border-right: 0;
}
.green {
background: linear-gradient(#6dd337, #358a1e);
}
.white {
background: linear-gradient(#f5f5f5, #c0c0c0);
}
.red {
background: linear-gradient(#e4243a, #9e0f1d);
}
.blue {
background: linear-gradient(#1990ff, #2264a1);
}
.gray {
background: linear-gradient(#5f5f5f, #7b7b7b);
}
</style>
<div id="attack25-panel"></div>
<script>
var PANEL_ROW = 5;
var PANEL_COLUMN = 5;
var panelState = [];
for (var row = 0; row < PANEL_ROW; row++) {
panelState.push([]);
for (var col = 0; col < PANEL_COLUMN; col++) {
panelState[row].push(null);
}
}
function updatePanel() {
var html = '';
for (var row = 0; row < panelState.length; row++) {
html += '<div class="panel-row">';
for (var col = 0; col < panelState[row].length; col++) {
var color = panelState[row][col] || "gray";
html += '<div class="panel ' + color + '">' + (row * PANEL_COLUMN + col + 1) + '</div>';
}
html += '</div>';
}
$("#attack25-panel").html(html);
}
function setPanel(number, color) {
var number = number - 1;
var row = Math.floor(number / PANEL_COLUMN);
var col = number % PANEL_COLUMN;
panelState[row][col] = color;
updatePanel();
}
updatePanel();
/* 例 */
setPanel(1, "red");
setPanel(7, "white");
setPanel(19, "blue");
setPanel(23, "green");
setPanel(24, "green");
setPanel(25, "green");
</script>
グローバル変数使ったりDOMを文字列で作ってたりして綺麗ではない上にjQueryをほぼ使ってないですが、なるべくシンプルに平易に書くとこんな感じでしょうか。
(どういう環境か分からなかったのでES5で書いてますが、できるならconst
とか使った方がいいです)
状態はpanelState
に[["red",null,"white",null,null],...]
という形で入っています。
setPanel()
でpanelState
の変更と画面の更新を行います。
画面更新(updatePanel()
)の度にpanelState
に従って#attack25-panel
の中身を一から書き直すコードになっています。
パフォーマンス的には微妙ですが、この程度の描画なら問題ないでしょう。
あとこのままだとsetPanel(26, "red")
とかやると死にます