我們說下想要實(shí)現(xiàn),一副牌里有54張,我們可以知道 3 - 2 的牌總共有13張,這分為4個(gè)花色是 ?? ?? ?? ?? 另外加上2個(gè)大小王!第一步:形成一個(gè)數(shù)組, 就要寫一個(gè)函數(shù),利用牌數(shù)量和花色,這樣可以用來形成一個(gè)雙重循環(huán)將 number 里面的內(nèi)容 和 flower 里面的內(nèi)容 進(jìn)行一個(gè)循環(huán)嵌入?最后在用 push 生成一個(gè)對象放到數(shù)組的后面?再到最后放入 大小王 。
const number = ['3', '4', '5', '6', '7', '8', '9', '10', "J", "Q", "K", "A", '2']; const flower = ["??", "??", "??", "??"]; // 黑桃 < 紅心 < 梅花 < 方塊 /** 生成一個(gè)撲克牌,然后分發(fā)3副牌,1副牌中有17張牌,然后有四種顏色,底牌留三張。按照大小進(jìn)行排序 * 54 張 * 大小王 * 張三: 17 * 李四: 17 * 王五: 17 * 底牌: 3 * * 排序 方塊3 黑桃3 升序 黑桃3-方塊3 如果點(diǎn)數(shù)相同,按花色排 */
語法:
//系統(tǒng)牌 const number = ['3', '4', '5', '6', '7', '8', '9', '10', "J", "Q", "K", "A", '2']; const flower = ["??", "??", "??", "??"]; // 黑桃 < 紅心 < 梅花 < 方塊 //牌組 let arr = []; //生成牌的函數(shù) poker(); //生成一副牌 function poker() { for (let n = 0; n < number.length; n++) { for (let j = 0; j < flower.length; j++) { arr.push({ name: flower[j] + number[n]}) } } arr.push({ name: "小王" }, { name: "大王" }) }
輸出效果圖:
都知道牌要隨機(jī),那我們在進(jìn)行一個(gè)打亂??梢蕴砑右粋€(gè)隨機(jī)生成的函數(shù)和一個(gè)去重生成下標(biāo)的數(shù)組。
語法:
//系統(tǒng)牌 const number = ['3', '4', '5', '6', '7', '8', '9', '10', "J", "Q", "K", "A", '2']; const flower = ["??", "??", "??", "??"]; // 黑桃 < 紅心 < 梅花 < 方塊 //牌組 let arr = []; //生成牌的函數(shù) poker(); //打亂后的拆開后的牌組 let [zhangsan, wangwu, lisi, d] = create(); //打印輸出 console.log(zhangsan); console.log(wangwu); console.log(lisi); console.log(d); //生成一副牌 function poker() { for (let n = 0; n < number.length; n++) { for (let j = 0; j < flower.length; j++) { arr.push({ name: flower[j] + number[n]}) } } arr.push({ name: "小王" }, { name: "大王" }) } //生成一個(gè)隨機(jī)數(shù) function random(min, max) { if (max == undefined) { max = min; min = 0; } if (min > max) { [min, max] = [max, min]; } let number = parseInt(Math.random() * (max - min + 1) + min) return number; } //打亂 function create() { let a = new Set(); while (a.size < 54) { a.add(random(0, 53)); } let arrindex = [...a]; arr = arrindex.map(item => arr[item]); let zhangsan = arr.slice(0, 17); let wangwu = arr.slice(17, 34); let lisi = arr.slice(34, 51); let d = arr.slice(51); return [zhangsan, wangwu, lisi, d]; }
詳解:可以隨機(jī)54張牌,這里就是不重復(fù)的下標(biāo)需要用到 Set 來曬重,但我們知道需要隨機(jī)機(jī)數(shù)的時(shí)候需要主要辨別。那就要用到map map的用意:通過指定函數(shù)處理數(shù)組(遍歷數(shù)組)的每個(gè)元素,并操作數(shù)組的元素或者下標(biāo),并返回處理后的數(shù)組。 下標(biāo),我們可以用 arr 里面的元素進(jìn)行找到,然后并將進(jìn)行返回出來,然后再使用 slice slice的用意:用于把數(shù)組中的字符串元素轉(zhuǎn)換成數(shù)字?jǐn)?shù)組,元素是通過指定的分隔符進(jìn)行分隔的。進(jìn)行一個(gè)返回接收 我們知道 zhangsan、wangwu、lisi 是有 17 張牌的 而底牌只有三張可以得到手牌。并將函數(shù)里面的內(nèi)容返回出去進(jìn)行一個(gè)接收輸出。
輸出效果圖:
在到最后我們需要一個(gè)排序。當(dāng) 3 和 3 比肯定是沒有辦法比的是不是?我們首先會對牌定義花色,再去對比數(shù)組。那我們要寫一個(gè)函數(shù)進(jìn)行一個(gè)排序。排序需要用到 sort sort的用意:對數(shù)組的元素進(jìn)行排序,不是真實(shí)按照數(shù)字排列去排序的,按照字符進(jìn)行一個(gè)比較。當(dāng)需要比較數(shù)字需要重寫。例如sort((a,b)=> a-b)升序 sort((a,b)=> b-a) 降序! 在生成牌組里面需要添加 花色的大小 和 數(shù)字 的大小 ,最后進(jìn)行一些列的優(yōu)化代碼如下:
語法:
const number = ['3', '4', '5', '6', '7', '8', '9', '10', "J", "Q", "K", "A", '2']; const flower = ["??", "??", "??", "??"]; // 黑桃 < 紅心 < 梅花 < 方塊 let arr = []; poker(); let [zhangsan, wangwu, lisi, d] = create(); sort(zhangsan); sort(wangwu); sort(lisi); sort(d); console.log("張三:",zhangsan); console.log("王五:",wangwu); console.log("王五:",lisi); console.log("底牌:",d); //排序 function sort(arr) { arr.sort((a,b)=>{if (a.number == b.number) {</p> <p> return a.flower - b.flower;</p> <p> }else{ return a.number - b.number; }}) } //生成一個(gè)隨機(jī)數(shù) function random(min, max) { if (max == undefined) { max = min; min = 0; } if (min > max) { [min, max] = [max, min]; } let number = parseInt(Math.random() * (max - min + 1) + min) return number; } //打亂 function create() { let a = new Set(); while (a.size < 54) { a.add(random(0, 53)); } let arrindex = [...a]; arr = arrindex.map(item => arr[item]); let zhangsan = arr.slice(0, 17); let wangwu = arr.slice(17, 34); let lisi = arr.slice(34, 51); let d = arr.slice(51); return [zhangsan, wangwu, lisi, d]; } //生成一副牌 function poker() { for (let n = 0; n < number.length; n++) { for (let j = 0; j < flower.length; j++) { arr.push({ name: flower[j] + number[n],flower:j,number:n}) } } arr.push({ name: "小王" ,number:53}, { name: "大王" ,number:54}) }
請關(guān)注我們其它相關(guān)文章!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127822.html
摘要:原文從零到一,擼一個(gè)在線斗地主上篇作者背景朋友來深圳玩,若說到在深圳有什么好玩的,那當(dāng)然是宅在家里斗地主了可是天算不如人算,撲克牌丟了幾張不全大熱天的,誰愿意出去買牌啊。 原文:從零到一,擼一個(gè)在線斗地主(上篇) | AlloyTeam作者:TAT.vorshen 背景:朋友來深圳玩,若說到在深圳有什么好玩的,那當(dāng)然是宅在家里斗地主了!可是天算不如人算,撲克牌丟了幾張不全……大熱天的,...
摘要:系統(tǒng)結(jié)構(gòu)系統(tǒng)考慮使用和實(shí)現(xiàn)服務(wù)器端邏輯,前端使用。邏輯流程主要邏輯包括用戶進(jìn)入游戲等待對家進(jìn)入游戲游戲過程結(jié)束統(tǒng)計(jì)這個(gè)過程。 1. 系統(tǒng)結(jié)構(gòu) 系統(tǒng)考慮使用Nodejs和SocketIo實(shí)現(xiàn)服務(wù)器端邏輯,前端使用HTML5。showImg(https://segmentfault.com/img/remote/1460000007643089); 2. 邏輯流程 1 . 主要邏輯包括用戶...
摘要:系統(tǒng)結(jié)構(gòu)系統(tǒng)考慮使用和實(shí)現(xiàn)服務(wù)器端邏輯,前端使用。邏輯流程主要邏輯包括用戶進(jìn)入游戲等待對家進(jìn)入游戲游戲過程結(jié)束統(tǒng)計(jì)這個(gè)過程。 1. 系統(tǒng)結(jié)構(gòu) 系統(tǒng)考慮使用Nodejs和SocketIo實(shí)現(xiàn)服務(wù)器端邏輯,前端使用HTML5。showImg(https://segmentfault.com/img/remote/1460000007643089); 2. 邏輯流程 1 . 主要邏輯包括用戶...
摘要:原文從零到一,擼一個(gè)在線斗地主下篇作者上篇回顧我們說了斗地主游戲的渲染展示部分,最后也講了下中交互的情況,下篇的重點(diǎn)就是游戲邏輯。 原文:從零到一,擼一個(gè)在線斗地主(下篇) | AlloyTeam作者:TAT.vorshen 上篇回顧:我們說了斗地主游戲的渲染展示部分,最后也講了下canvas中交互的情況,下篇的重點(diǎn)就是游戲邏輯。 邏輯主要分成兩塊:流程邏輯和撲克牌對比邏輯。 gith...
閱讀 570·2023-03-27 18:33
閱讀 761·2023-03-26 17:27
閱讀 658·2023-03-26 17:14
閱讀 612·2023-03-17 21:13
閱讀 546·2023-03-17 08:28
閱讀 1836·2023-02-27 22:32
閱讀 1330·2023-02-27 22:27
閱讀 2212·2023-01-20 08:28