小趣味:js编写斗地主规则(完整代码)

本文介绍了使用JavaScript编写斗地主游戏规则的过程,从设计扑克牌的数据结构,到实现各种牌型如单张、对子、顺子等的判断逻辑,并提供了完整的代码示例。同时,文章还涵盖了扑克牌的排序、特征值获取等辅助功能,最后进行了功能测试和规则校验。
摘要由CSDN通过智能技术生成

一.首先模拟我的自定义的扑克牌的数据结构:

 1 //扑克牌结构
 2 function Poker(id,value,type,order,color){
 3     this.id = id;
 4     this.value = value;//value 1-13代表 A-K 14代表大小王
 5     this.type = type;//type 1,2,3,4 分别代表红桃、方块、黑桃、梅花四种花色
 6     this.order = order;//排序和大小比较标志
 7     this.color = color;//颜色:0红色 1黑色
 8     //name属性表示名称 规则用不到
 9     switch(value){
10     case 1:
11         this.name = "A";
12         break;
13     case 2:
14         this.name = "2";
15         break;
16     case 3:
17         this.name = "3";
18         break;
19     case 4:
20         this.name = "4";
21         break;
22     case 5:
23         this.name = "5";
24         break;
25     case 6:
26         this.name = "6";
27         break;
28     case 7:
29         this.name = "7";
30         break;
31     case 8:
32         this.name = "8";
33         break;
34     case 9:
35         this.name = "9";
36         break;
37     case 10:
38         this.name = "10";
39         break;
40     case 11:
41         this.name = "J";
42         break;
43     case 12:
44         this.name = "Q";
45         break;
46     case 13:
47         this.name = "K";
48         break;
49     case 14:
50         this.name = "JOKER";
51         break;
52     default:
53         break;
54     }
55 }

二.模拟一副扑克牌

 1 function getPokers(){
 2     var value,type,order,name,color,pokers = [];
 3     for(var i=0;i<54;i++){
 4         value = Math.floor(i/4)+1;
 5         type = i%4+1;
 6         if([1,2,14].indexOf(value) >=0){
 7             order = value + 13;
 8         }
 9         else
10             order = value;
11         color = Math.ceil(type/2) - 1;
12         if([52,53].indexOf(i) >=0){
13             type = null;//大小王不需要类型 用颜色标识
14             color = i%2;
15         }
16         pokers.push(new Poker(i,value,type,order,color));
17     }
18     for(var index in pokers){
19         var item = pokers[index];
20         var t;
21         switch(item.type){
22         case 1:
23             t = "a";
24             break;
25         case 2:
26             t = "b";
27             break;
28         case 3:
29             t = "c";
30             break;
31         case 4:
32             t = "d";
33             break;
34         default:
35             t = "w";
36             break;
37         }
38         if(item.value === 14)
39             window[t+item.value+item.color] = item;
40         else
41             window[t+item.value] = item;
42     }
43     //以下是测试数据 方便测试规则用
44     _1san = [a3,c3,b3],
45     _2san = [a1,d1,b1],
46     _1san1 = [a3,c3,b3,a2],
47     _2san1 = [a1,d1,b1,c4],
48     _1san2 = [a3,c3,b3,a2,b2],
49     _2san2 = [a1,d1,b1,c4,b4],
50     _1si2 = [a3,c3,b3,b3,a2,b2],
51     _2si2 = [a1,d1,b1,c1,c4,b4],
52     _1zha = [a3,c3,b3,b3],
53     _2zha = [a1,d1,b1,c1],
54     _1ld = [a3,c3,b4,c4,a5,d5],
55     _2ld = [a12,c12,b13,c13,a1,d1],
56     _1dui = [a3,c3],
57     _2dui = [a1,d1],
58     _1sz = [a3,b4,d5,a6,a7],
59     _2sz = [a10,b11,d12,a13,a1],
60     _1fj = [a3,c3,b3,a2,a4,c4,b4,a6],
61     _2fj = [a13,c13,b13,a3,a1,c1,b1,a4],
62     _3fj = [a3,c3,b3,a2,c2,a4,c4,b4,a6,b6],
63     _4fj = [a13,c13,b13,a3,c3,a1,c1,b1,a4,b4],
64     _5fj = [a3,c3,b3,a2,c2,a4,c4,b4,a6,a5,b5,d5,a13,c13,b6],
65     _6fj = [a13,a12,c12,d12,a11,d11,c13,b13,a3,c3,a1,c1,b1,a4,b4],
66     _1dan = [c3],
67     _2dan = [c1];
68 }

【注】:为了方便测试我将一副扑克牌放到了全局变量a1-a13,b1-b13,c1-c13,d1-d13 + w140+w141 a表示红桃 b表示方块 c表示黑桃 d表示梅花 w表示大小王

三.公共方法编写及介绍:

  1.扩展Array对象,添加移除方法(可以没有代码功能需要自己实现):

 1 //自定义数组移除方法
 2 Object.defineProperties(Array.prototype,{
 3     'removeAt':{
 4         value:function(index){
 5             return this.splice(index,1);
 6         },
 7         enumerable:false,
 8         writable:false,
 9         configurable:false
10     },
11     'remove':{
12         value:function(item){
13             var index = this.indexOf(item);
14             if(index >= 0)
15                 return this.removeAt(index);
16         },
17         enumerable:false,
18         writable:false,
19         configurable:false
20     }
21 })

  2.扑克牌排序(按照order字段和花色type字段排序) 

 1 /**
以下是用C语言编写的一个简单的单机斗地主游戏按规则出牌的源代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_CARDS 54 #define NUM_PLAYERS 3 // 定义扑克牌结构体 typedef struct { int value; // 牌面值,1-13表示A-K,14表示小王,15表示大王 char suit; // 花色,'S'表示黑桃,'H'表示红心,'C'表示梅花,'D'表示方块,'J'表示王牌 } Card; // 洗牌函数 void shuffle(Card* deck) { srand(time(NULL)); for (int i = 0; i < NUM_CARDS; i++) { int j = rand() % NUM_CARDS; Card temp = deck[i]; deck[i] = deck[j]; deck[j] = temp; } } // 初始化牌组 void initDeck(Card* deck) { char suits[4] = {'S', 'H', 'C', 'D'}; int values[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; for (int i = 0; i < NUM_CARDS; i++) { if (i < 52) { deck[i].value = values[i % 13]; deck[i].suit = suits[i / 13]; } else if (i == 52) { deck[i].value = 14; deck[i].suit = 'J'; } else if (i == 53) { deck[i].value = 15; deck[i].suit = 'J'; } } } // 发牌函数 void dealCards(Card* deck, Card* players[]) { int currentCard = 0; for (int i = 0; i < NUM_PLAYERS; i++) { players[i] = (Card*)malloc(17 * sizeof(Card)); // 每个玩家17张牌 for (int j = 0; j < 17; j++) { players[i][j] = deck[currentCard++]; } } } // 按规则出牌函数 void playCards(Card* cards, int numCards) { printf("出牌: "); for (int i = 0; i < numCards; i++) { printf("%c%d ", cards[i].suit, cards[i].value); } printf("\n"); } int main() { Card deck[NUM_CARDS]; Card* players[NUM_PLAYERS]; initDeck(deck); shuffle(deck); dealCards(deck, players); // 玩家1按规则出牌 playCards(players[0], 3); // 释放内存 for (int i = 0; i < NUM_PLAYERS; i++) { free(players[i]); } return 0; } ``` 这个示例代码实现了一个简单的单机斗地主游戏,包括洗牌、发牌和按规则出牌的功能。其中,`shuffle`函数用于洗牌,`initDeck`函数用于初始化牌组,`dealCards`函数用于发牌,`playCards`函数用于按规则出牌。 请注意,这只是一个简单的示例代码,可能不包含所有的规则和功能,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值