通過JavaScript實(shí)現(xiàn)撲克牌游戲的示例代碼
首先,我們知道一副牌里有54張牌,然后牌里的數(shù)字是從 3 - 2 的里面總共有13張牌,然后 4 中花色 分別是 ♠? ♥? ♣? ♦? 另外加上2個(gè)大小王!第一步:我們肯定需要有一個(gè)數(shù)組來裝牌吧? 然后再書寫一個(gè)函數(shù),我們知道有多少張牌,然后牌里有多少花色是不是應(yīng)該用一個(gè)雙重循環(huán)將 number 里面的內(nèi)容 和 flower 里面的內(nèi)容 進(jìn)行一個(gè)循環(huán)嵌入?最后在用 push 生成一個(gè)對(duì)象放到數(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: "大王" })
}
輸出效果圖:
當(dāng)我們已經(jīng)拿到牌數(shù)組了,像平時(shí)我們打牌是不是都是隨機(jī)發(fā)放手里的牌的?那我們?cè)谶M(jìn)行一個(gè)打亂。這時(shí)候我們需要用到一個(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];
}
詳解:當(dāng)我們知道需要發(fā)牌的時(shí)候是隨機(jī)生成的字牌,然后我們已經(jīng)知道有54張牌,然后需要不重復(fù)的下標(biāo)需要用到 Set 來曬重,數(shù)組的長度是 54 但是下標(biāo)是 53 所以在生成隨機(jī)數(shù)的時(shí)候需要主要辨別。然后需要用到 map map的用意:通過指定函數(shù)處理數(shù)組(遍歷數(shù)組)的每個(gè)元素,并操作數(shù)組的元素或者下標(biāo),并返回處理后的數(shù)組。 當(dāng)我們已經(jīng)得到下標(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 比肯定是沒有辦法比的是不是?我們?cè)谧铋_始拿到牌組的內(nèi)容的時(shí)候就定義了 黑桃 < 紅心 < 梅花 < 方塊 這時(shí)候我們需要對(duì) 牌的 內(nèi)容 和 數(shù)字 進(jìn)行一個(gè)大小對(duì)對(duì)象的添加。然后再書寫一個(gè)函數(shù)進(jìn)行一個(gè)排序。排序需要用到 sort sort的用意:對(duì)數(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) {
return a.flower - b.flower;
}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})
}以上就是通過JavaScript實(shí)現(xiàn)撲克牌游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于JavaScript撲克牌游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
41個(gè)Web開發(fā)者必須收藏的JavaScript實(shí)用技巧
41個(gè)Web開發(fā)者必須收藏的JavaScript實(shí)用技巧,分享給大家,感興趣的小伙伴們可以參考一下2016-07-07
TypeScript中正確使用interface和type的方法實(shí)例
在ts中定義類型由兩種方式:接口(interface)和類型別名(type alias),interface只能定義對(duì)象類型,下面這篇文章主要給大家介紹了關(guān)于TypeScript中正確使用interface和type的相關(guān)資料,需要的朋友可以參考下2021-09-09
學(xué)習(xí)JavaScript設(shè)計(jì)模式之模板方法模式
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的模板方法模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01

