今天預計實作接龍紙牌的拖曳規則
檢查方式很簡單,首先將昨日的:move
函數內的變數result
判斷先改成用let
宣告,
因為不能任意插入前面的順序,所以增加判斷只有新目標位置futureIndex
等於目標牌堆陣列的長度cardStacks[to].length
時才可以進行移動。
futureIndex
就需要等於0futureIndex
就需要等於1futureIndex
就要為N,以此類推...function limitLocalMove(evt) {
// 限制同個牌堆無法拖曳
let result = evt.from !== evt.to;
// 取得牌堆的來源、目標名稱,對應reactive`cardStacks`內的名稱
const from = getDomName(evt.from);
const to = getDomName(evt.to);
const { index, futureIndex } = evt.draggedContext;
// 只能移動目標牌堆的最後一張牌
result = result && futureIndex == cardStacks[to].length;
if (result) {
// 中間略
}
return result;
}
先初始化改為39張牌均分給3個牌堆且將所有牌都闔上,
這樣接下來才能測試闔牌狀態不能拖曳。
const cardStacks = reactive({
first: [],
second: [],
third: []
});
onMounted(() => {
const data = geneateDeck(39, false);
cardStacks.first = data.slice(0, 13);// 梅花A~梅花K
cardStacks.second = data.slice(13, 26);// 方塊A~~方塊K
cardStacks.third = data.slice(26); // 紅心A~~紅心K
});
因為多一個牌堆除了調整樣板,但同樣也在新牌堆樣板添加ref="third"
,方便接下來在:move
中判斷拖曳來源的DOM
是對應cardStacks
內的哪個陣列。
看到這邊聰明的讀者大概想到又要調整:move
函數內的變數result
,Bingo!
只需要在函數內if (result) {
的上方添加底下程式碼:
// 移動的牌必須是開著的
result = result && cardStacks[from][index].isOpen;
到此闔牌無法移動已經完成,但今天的工作還沒結束。
因為目前全部的牌都處於蓋牌狀態,為了開發測試需要所以決定簡單調整樣板補上@click
的事件,讓所有的牌只要點了就會開牌。
<Card :value="element.value" :isOpen="element.isOpen" @click="() => element.isOpen = true" />
今天雖然實作拖曳至牌尾、預防隨意拖曳牌堆的限制,但在紙牌接龍的情況其實還有:
這部分就留待明日繼續煩惱囉😁
程式碼: https://github.com/kabuto412rock/ithelp-pokergame/tree/day12