|
33 | 33 | */ |
34 | 34 |
|
35 | 35 | const CARD_TYPE = { |
36 | | - 1: '1', |
37 | 36 | 2: '2', |
38 | 37 | 3: '3', |
39 | 38 | 4: '4', |
|
53 | 52 | } |
54 | 53 |
|
55 | 54 | const CARD_SUITS = { |
56 | | - DIAMOND: '分块', |
57 | | - HEART: '红心', |
| 55 | + DIAMOND: '方片', |
| 56 | + HEART: '红桃', |
58 | 57 | CLUB: '梅花', |
59 | 58 | SPADE: '黑桃' |
60 | 59 | } |
|
112 | 111 | cards = [] |
113 | 112 | } |
114 | 113 |
|
115 | | - const deckOfCards = generateDeckOfCards().slice(0, 7); // 一副牌 |
| 114 | + |
| 115 | + Array.prototype.first = function () { |
| 116 | + if (this.length === 0) return null |
| 117 | + return this[0] |
| 118 | + } |
| 119 | + |
| 120 | + Array.prototype.last = function () { |
| 121 | + if (this.length === 0) return null |
| 122 | + return this[this.length - 1] |
| 123 | + } |
| 124 | + |
| 125 | + |
| 126 | + const deckOfCards = generateDeckOfCards(); // 一副牌 |
116 | 127 | const playerList = [new Player(), new Player()] // 玩家列表 |
117 | 128 | const playIdx = 0 // 出牌玩家索引 |
118 | 129 | const maxCardCount = 5 // 最大手牌数 |
|
156 | 167 | * @param {Card} cardB |
157 | 168 | */ |
158 | 169 | function cardComparison(cardA, cardB) { |
159 | | - if (TYPE_LEVEL[cardA.type] < TYPE_LEVEL[cardB.type]) return true; |
160 | | - if (TYPE_LEVEL[cardA.type] > TYPE_LEVEL[cardB.type]) return false; |
161 | | - if (SUITS_LEVEL[cardA.suits] > SUITS_LEVEL[cardB.suits]) return true; |
162 | | - return false; |
| 170 | + if (TYPE_LEVEL[cardA.type] < TYPE_LEVEL[cardB.type]) return true; // A牌面小于B牌面 True |
| 171 | + if (TYPE_LEVEL[cardA.type] > TYPE_LEVEL[cardB.type]) return false; // A牌面大于B牌面 False |
| 172 | + if (SUITS_LEVEL[cardA.suits] < SUITS_LEVEL[cardB.suits]) return true; // A牌面等于B牌面 且A花色小于B花色 True |
| 173 | + return false; // 其他 False |
163 | 174 | } |
164 | 175 |
|
165 | | - |
166 | 176 | /** |
167 | | - * 最小卡牌 |
| 177 | + * 手牌排序 从大到小排序 |
168 | 178 | * @author linyisonger |
169 | 179 | * @date 2025-03-04 |
170 | 180 | * @param {Card[]} cards |
171 | 181 | */ |
172 | | - function minCard(cards) { |
173 | | - if (cards.length == 1) return cards[0] |
174 | | - let min = cards[0] |
| 182 | + function cardSortByLevel(cards) { |
| 183 | + cards.sort((a, b) => cardComparison(a, b) ? 1 : -1); |
| 184 | + return cards |
| 185 | + } |
| 186 | + |
| 187 | + |
| 188 | + /** |
| 189 | + * 卡牌最小牌面 |
| 190 | + * @author linyisonger |
| 191 | + * @date 2025-03-06 |
| 192 | + * @param {Card[]} cards |
| 193 | + */ |
| 194 | + function cardMinLevelIndex(cards) { |
| 195 | + if (cards.length === 0) return -1; // 处理空数组 |
| 196 | + let minIndex = 0; |
175 | 197 | for (let i = 1; i < cards.length; i++) { |
176 | | - const card = cards[i]; |
177 | | - if (!cardComparison(min, card)) min = card |
| 198 | + if (cardComparison(cards[i], cards[minIndex])) minIndex = i; |
178 | 199 | } |
179 | | - return min |
| 200 | + return minIndex; |
| 201 | + } |
| 202 | + |
| 203 | + |
| 204 | + /** |
| 205 | + * 出牌 |
| 206 | + * @author linyisonger |
| 207 | + * @date 2025-03-06 |
| 208 | + * @param {Card[]} hold 持有 |
| 209 | + * @param {Card[]} target 目标 |
| 210 | + */ |
| 211 | + function bringOut(hold, target) { |
| 212 | + |
180 | 213 | } |
181 | 214 |
|
182 | 215 |
|
| 216 | + |
183 | 217 | /** |
184 | 218 | * 开始游戏 |
185 | 219 | * @author linyisonger |
|
209 | 243 | startPlayIdx++ // 补满切换下一个人 |
210 | 244 | } |
211 | 245 | } |
| 246 | + playerList.map(p => cardSortByLevel(p.cards)) |
212 | 247 | } |
213 | 248 |
|
214 | 249 |
|
|
218 | 253 | * @date 2025-03-04 |
219 | 254 | */ |
220 | 255 | function startRound() { |
221 | | - let startPlayIdx = playIdx; // 先出牌的玩家索引 |
| 256 | + let startPlayIdx = cardMinLevelIndex(playerList.map(p => p.cards.last())); // 最小牌面显出 先出牌的玩家索引 |
222 | 257 | let passPlayerCount = 0; // 过牌玩家数量 |
223 | | - let round = new Round(); |
224 | | - let min |
225 | | - |
| 258 | + let round = new Round(); // 第一回合 |
226 | 259 |
|
227 | 260 | // while (true) { |
228 | | - // |
| 261 | + |
229 | 262 |
|
230 | 263 |
|
231 | 264 |
|
|
0 commit comments