桌遊說明
https://blog.duduzui.com/2013/06/dobble.html
規則設計:任意兩張牌都必有且僅有一種相同符號
該桌遊共有55張卡牌、每張卡牌有8種圖案
與現行程式碼不符,再想想
其他整理方向:
將產生排組、洗亂花色、洗牌分開
刪去第一輪、直接以第二輪的邏輯產製全部
寫test
程式碼如下
function newDobble(num) {
let pic = 0;
let dobble = new Array(num);
// let picNum=countPicNumber(num-1);
for (i = 0; i < num; i++) {
dobble[i] = new Array();
}
//第一輪
//從第一張牌開始跟下一張牌給予相同的花色
//直到倒數第二張牌結束
for (i = 0; i < num - 1; i++) {
dobble[Math.floor(i % num)].push(i);
dobble[Math.floor((i + 1) % num)].push(i);
pic++;
//每一次分配完就花色+1
}
// console.log('第一輪');
// console.log(dobble);
// console.log('第一輪pic:'+pic);
//第二輪
remained = num - 2;
//第一張牌剩下總數-自身-次張還沒配對
//下一張牌開始每次扣除前次已配對的部分,所以逐次減一
for (j = 0; j < num - 2; j++) {
//從第一張牌開始比對除了下一張牌以外的牌
//分別給予相同的花色
//次張在第一輪分配過了,所以從+2那一張開始
//remained表示要逐次分配的次數,故每次減一
for (k = j; k < j + remained; k++) {
dobble[j].push(pic);
dobble[k + 2].push(pic);
pic++;
}
remained--;
}
return dobble;
// // console.log('第二輪');
// for(i=0;i<num;i++){
// console.log(dobble[i]);
// }
// console.log('卡片總數:'+num);
// console.log('花色總數:'+pic);
}//function
function countPicNumber(num) {
if (num == 1)
return 1
else
return (num + countPicNumber(num - 1))
}
function randomPics(arrOfArr) {//打亂花色的排序
for (m = 0; m < arrOfArr.length; m++) {
for (i = 0; i < arrOfArr[m].length; i++) {
j = Math.floor((Math.random() * arrOfArr[m].length));
k = Math.floor((Math.random() * arrOfArr[m].length));
temp=arrOfArr[m][j];
arrOfArr[m][j] = arrOfArr[m][k];
arrOfArr[m][k]=temp;
}
}
}
function randomCards(num) {//打亂牌的排序
dobble = newDobble(num);
for (i = 0; i < num; i++) {
j = Math.floor((Math.random() * num));
k = Math.floor((Math.random() * num));
// console.log(j+','+k);
temp=dobble[j]
dobble[j] = dobble[k];
dobble[k]=temp
}
randomPics(dobble);
for (i = 0; i < num; i++) {
console.log(dobble[i]);
}
console.log('卡片總數:' + num);
}
console.log();
randomCards(5);
randomCards(6);
randomCards(7);
//比對單一陣列中是否有重複值
//比對陣列之間是否必有重複值
//比對陣列之間的重複值是否為唯一