|
390 | 390 | return TYPE_LEVEL[a] < TYPE_LEVEL[b] |
391 | 391 | } |
392 | 392 |
|
| 393 | + /** |
| 394 | + * 卡牌对比 |
| 395 | + * A < B True |
| 396 | + * A > B False |
| 397 | + * @author linyisonger |
| 398 | + * @date 2025-03-15 |
| 399 | + * @param {Card[]} a |
| 400 | + * @param {Card[]} b |
| 401 | + */ |
| 402 | + static comparisonByCards(a, b) { |
| 403 | + let groupType = Card.groupType(a) |
| 404 | + switch (groupType) { |
| 405 | + case GROUP_TYPE.LEAFLETS: |
| 406 | + case GROUP_TYPE.PAIRS: |
| 407 | + case GROUP_TYPE.FOUR: |
| 408 | + case GROUP_TYPE.TRIPLE: |
| 409 | + return Card.comparison(a[0], b[0]) |
| 410 | + case GROUP_TYPE.TRIPLE_WITH_PAIRS: |
| 411 | + case GROUP_TYPE.FOUR_WITH_SINGLE: |
| 412 | + let aGroup = groupBy(a, c => c.type) |
| 413 | + let bGroup = groupBy(b, c => c.type) |
| 414 | + let aCard = null |
| 415 | + let bCard = null |
| 416 | + for (const key in aGroup) if (aGroup[key].length >= 3) aCard = aGroup[key][0] |
| 417 | + for (const key in bCard) if (bCard[key].length >= 3) bCard = bCard[key][0] |
| 418 | + return Card.comparison(aCard, bCard) |
| 419 | + } |
| 420 | + } |
| 421 | + |
| 422 | + |
393 | 423 | /** |
394 | 424 | * 数组中最小卡牌下表 |
395 | 425 | * @author linyisonger |
|
452 | 482 | } |
453 | 483 | else if (groupType === GROUP_TYPE.PAIRS) { // 一对 |
454 | 484 | // 是否有黑桃 |
455 | | - let hasSpade = cards.some(c => c.suits === CARD_SUITS.SPADE) |
| 485 | + let hasSpade = target.some(c => c.suits === CARD_SUITS.SPADE) |
456 | 486 | // 单张卡牌类型 |
457 | 487 | let type = target[0].type |
458 | 488 | for (const key in holdGroup) { |
459 | 489 | if (holdGroup[key].length >= groupTypeNum) { // 张数大于等于2 |
460 | 490 | if (Card.comparisonByType(key, type)) delete holdGroup[key] // 当key < type 时 |
461 | 491 | if (hasSpade && key === type) delete holdGroup[key] // 相同 |
462 | 492 | } |
| 493 | + else delete holdGroup[key] |
463 | 494 | } |
464 | 495 | // 排序后取最小的组合的前两张 |
465 | 496 | let keys = Object.keys(holdGroup) |
|
474 | 505 | if (holdGroup[key].length >= groupTypeNum) { // 张数大于等于 牌型张数 |
475 | 506 | if (Card.comparisonByType(key, type)) delete holdGroup[key] // 当key < type 时 |
476 | 507 | } |
| 508 | + else delete holdGroup[key] |
477 | 509 | } |
| 510 | + // 排序后取最小的组合的前两张 |
| 511 | + let keys = Object.keys(holdGroup) |
478 | 512 | if (keys.length > 0) return holdGroup[keys[0]].slice(0, groupTypeNum) |
479 | 513 | } |
480 | 514 | return [] |
481 | 515 | } |
| 516 | + |
| 517 | + |
| 518 | + |
| 519 | + |
482 | 520 | } |
483 | 521 |
|
484 | 522 | class Round { |
|
571 | 609 | * @param {Round} round |
572 | 610 | */ |
573 | 611 | discard(round) { |
| 612 | + console.log('discard'); |
574 | 613 | if (this.status === PLAYER_STATUS.AUTO) { |
575 | 614 | console.log('自动', round.lastCards); |
576 | 615 | let cards = this.betterCards(round.lastCards) // 最小能大上的牌 |
|
658 | 697 | console.log('游戏结束'); |
659 | 698 | return; |
660 | 699 | } |
661 | | - |
662 | | - |
663 | | - this.currentRound.loadUILastCards(); |
| 700 | + console.log("nextPlayerDiscard"); |
664 | 701 | this.nextPlayer(); // 下一个玩家 |
665 | 702 | if (this.currentRound.end) { // 检测回合是否结束 |
| 703 | + console.log('检测回合是否结束'); |
| 704 | + uiEvent.publish('updateCardTable', []) |
666 | 705 | this.allRounds.push(this.currentRound); |
667 | 706 | this.nextRound(); |
668 | 707 | } |
|
682 | 721 |
|
683 | 722 | for (let i = 0; i < this.joinPlayers.length; i++) { |
684 | 723 | this.currentPlayer.pickup(); |
| 724 | + if (this.currentPlayer.status === PLAYER_STATUS.AUTO) uiEvent.publish('updateRobotBaseInfo', this.currentPlayer.holdCards) |
| 725 | + if (this.currentPlayer.status === PLAYER_STATUS.MANUAL) uiEvent.publish('updatePlayerHoldCards', this.currentPlayer.holdCards) |
685 | 726 | this.nextPlayer(); |
686 | 727 | } |
687 | 728 |
|
| 729 | + |
| 730 | + |
688 | 731 | if (this.allRounds.length === 0) { |
689 | 732 | console.log('最小牌面对比'); |
690 | 733 | // 牌面最小 |
|
699 | 742 | uiEvent.publish('updatePlayerBaseInfo', this.currentPlayer) |
700 | 743 | uiEvent.publish('updateRobotBaseInfo', this.joinPlayers[(minCardIndex + 1) % this.joinPlayers.length]) |
701 | 744 | uiEvent.subscribe('discard', (cards) => { |
702 | | - console.log('出牌', cards); |
| 745 | + // 隐藏玩家操作按钮 |
| 746 | + uiEvent.publish('hidePlayerOperationButtons') |
703 | 747 | // 出牌操作 |
704 | 748 | this.currentPlayer.holdCards = this.currentPlayer.holdCards.filter(h => !cards.find(c => c.type === h.type && c.suits === h.suits)) |
| 749 | + uiEvent.publish('updatePlayerHoldCards', this.currentPlayer.holdCards) |
705 | 750 | // 一条记录 |
706 | 751 | this.currentRound.allRecord.push(new Record(this.currentPlayer, cards)) |
707 | 752 | // 下一个出牌 |
708 | 753 | this.nextPlayerDiscard() |
709 | | - // 隐藏玩家操作按钮 |
710 | | - uiEvent.publish('hidePlayerOperationButtons') |
| 754 | + |
711 | 755 | }) |
712 | 756 |
|
713 | 757 | console.log('玩家牌面最小', this.currentPlayer); |
|
812 | 856 | */ |
813 | 857 | static cardConvertToImg(card) { |
814 | 858 | if (!card) return '' |
815 | | - return `<img src="${this.url}"/>` |
| 859 | + return `<img src="${card.url}"/>` |
816 | 860 | } |
817 | 861 |
|
818 | 862 |
|
|
845 | 889 | for (let i = 0; i < cardItemDomList.length; i++) { |
846 | 890 | const cardItemDom = cardItemDomList.item(i) |
847 | 891 | const cardItem = holdCards[i] |
848 | | - cardItemDom.hidden = !cardItem |
| 892 | + if (cardItem) cardItemDom.classList.remove('hidden') |
| 893 | + else cardItemDom.classList.add('hidden') |
849 | 894 | } |
850 | 895 | } |
851 | 896 |
|
|
934 | 979 |
|
935 | 980 | // 不符合规则 |
936 | 981 | let irregular = playerSelectedGroupType == null && playerSelectedCards.length // 选择不为空 但组为空 |
937 | | - || cardTableGroupType != null && playerSelectedGroupType != cardTableGroupType // 牌桌组类型不为空 并且 组类型 不相同 |
| 982 | + || cardTableGroupType != null && playerSelectedGroupType != cardTableGroupType && playerSelectedCards.length // 牌桌组类型不为空 并且 组类型 不相同 |
| 983 | + || Card.comparisonByCards(playerSelectedCards, cardTableCards) // 对比大小 |
| 984 | + |
938 | 985 |
|
939 | 986 | if (irregular) { |
940 | 987 | disBtn.classList.add('hidden') |
|
949 | 996 | }) |
950 | 997 |
|
951 | 998 |
|
952 | | - disBtn.addEventListener('click', function () { |
953 | | - let playerSelectedCards = UIController.playerSelectedCards // 玩家选择的手牌 |
954 | | - uiEvent('discard', playerSelectedCards) |
955 | | - }) |
956 | 999 | } |
957 | 1000 |
|
958 | 1001 |
|
|
968 | 1011 | const powerless = playerOperationButtons.querySelector('.powerless'); // 没有能大过的牌 |
969 | 1012 | const nonCompliance = playerOperationButtons.querySelector('.non-compliance'); // 不符合规则 |
970 | 1013 |
|
| 1014 | + powerless.classList.add('hidden'); |
971 | 1015 | nonCompliance.classList.add('hidden'); |
972 | 1016 |
|
973 | 1017 | passBtn.addEventListener('click', () => { |
974 | | - // 回合出牌 |
975 | 1018 | uiEvent.publish('discard', []) |
976 | 1019 | }) |
977 | 1020 |
|
| 1021 | + disBtn.addEventListener('click', function () { |
| 1022 | + let playerSelectedCards = UIController.playerSelectedCards // 玩家选择的手牌 |
| 1023 | + uiEvent.publish('discard', playerSelectedCards) |
| 1024 | + UIController.playerContainer.querySelectorAll(`.card-item.selected`).forEach(selected => selected.classList.remove('selected')) |
| 1025 | + }) |
| 1026 | + |
978 | 1027 | } |
979 | 1028 |
|
980 | 1029 | /** |
|
983 | 1032 | * @date 2025-03-17 |
984 | 1033 | */ |
985 | 1034 | static showPlayerOperationButtons() { |
| 1035 | + console.log('showPlayerOperationButtons'); |
986 | 1036 | const playerOperationButtons = UIController.playerContainer.querySelector('.player-operation-buttons') |
987 | 1037 | playerOperationButtons.classList.remove('hidden') |
988 | 1038 |
|
|
994 | 1044 | const passBtn = playerOperationButtons.querySelector('.pass-btn'); // 不要 |
995 | 1045 | const powerless = playerOperationButtons.querySelector('.powerless'); // 没有能大过的牌 |
996 | 1046 |
|
997 | | - if (hintCards.length) { |
| 1047 | + console.log(hintCards, playerOperationButtons); |
| 1048 | + if (hintCards.length || cardTableCards.length == 0) { |
998 | 1049 | disBtn.classList.remove('hidden') |
999 | 1050 | powerless.classList.add('hidden') |
1000 | 1051 | if (cardTableCards.length) passBtn.classList.remove('hidden') |
|
1013 | 1064 | * @date 2025-03-17 |
1014 | 1065 | */ |
1015 | 1066 | static hidePlayerOperationButtons() { |
| 1067 | + console.log('hidePlayerOperationButtons'); |
| 1068 | + |
1016 | 1069 | const playerOperationButtons = UIController.playerContainer.querySelector('.player-operation-buttons') |
1017 | 1070 | playerOperationButtons.classList.add('hidden') |
1018 | 1071 | } |
|
1024 | 1077 | const uiEvent = new EventBus() |
1025 | 1078 |
|
1026 | 1079 | UIController.initPlayerHoldCards() |
| 1080 | + UIController.initPlayerOperationButtons(); |
1027 | 1081 |
|
1028 | 1082 | uiEvent.subscribe('updateRobotHoldCards', UIController.updateRobotHoldCards) |
1029 | 1083 | uiEvent.subscribe('updatePlayerHoldCards', UIController.updatePlayerHoldCards) |
|
0 commit comments