Skip to content

Commit df2d1a3

Browse files
author
linyisonger
committed
增加手牌排序
1 parent fdb495c commit df2d1a3

File tree

1 file changed

+54
-21
lines changed

1 file changed

+54
-21
lines changed

093.七王五二三-人机对战.html

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
*/
3434

3535
const CARD_TYPE = {
36-
1: '1',
3736
2: '2',
3837
3: '3',
3938
4: '4',
@@ -53,8 +52,8 @@
5352
}
5453

5554
const CARD_SUITS = {
56-
DIAMOND: '分块',
57-
HEART: '红心',
55+
DIAMOND: '方片',
56+
HEART: '红桃',
5857
CLUB: '梅花',
5958
SPADE: '黑桃'
6059
}
@@ -112,7 +111,19 @@
112111
cards = []
113112
}
114113

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(); // 一副牌
116127
const playerList = [new Player(), new Player()] // 玩家列表
117128
const playIdx = 0 // 出牌玩家索引
118129
const maxCardCount = 5 // 最大手牌数
@@ -156,30 +167,53 @@
156167
* @param {Card} cardB
157168
*/
158169
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
163174
}
164175

165-
166176
/**
167-
* 最小卡牌
177+
* 手牌排序 从大到小排序
168178
* @author linyisonger
169179
* @date 2025-03-04
170180
* @param {Card[]} cards
171181
*/
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;
175197
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;
178199
}
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+
180213
}
181214

182215

216+
183217
/**
184218
* 开始游戏
185219
* @author linyisonger
@@ -209,6 +243,7 @@
209243
startPlayIdx++ // 补满切换下一个人
210244
}
211245
}
246+
playerList.map(p => cardSortByLevel(p.cards))
212247
}
213248

214249

@@ -218,14 +253,12 @@
218253
* @date 2025-03-04
219254
*/
220255
function startRound() {
221-
let startPlayIdx = playIdx; // 先出牌的玩家索引
256+
let startPlayIdx = cardMinLevelIndex(playerList.map(p => p.cards.last())); // 最小牌面显出 先出牌的玩家索引
222257
let passPlayerCount = 0; // 过牌玩家数量
223-
let round = new Round();
224-
let min
225-
258+
let round = new Round(); // 第一回合
226259

227260
// while (true) {
228-
//
261+
229262

230263

231264

0 commit comments

Comments
 (0)