HTML斗地主代码解析与实现html斗地主代码

HTML斗地主代码解析与实现html斗地主代码,

本文目录导读:

  1. 游戏规则
  2. 代码实现
  3. 完整代码

斗地主是一款经典的扑克牌游戏,拥有丰富的规则和策略,本文将详细介绍如何使用HTML、JavaScript和CSS实现一款简单的斗地主游戏,并提供完整的代码示例。

斗地主是一款二人或三人参与的扑克牌游戏,主要分为“摸牌”、“出牌”和“出完牌”三个阶段,游戏的目标是通过出牌将对手的牌库中的所有牌出完,本文将实现一个两人斗地主的简化版本。

游戏规则

为了实现斗地主游戏,我们需要明确以下规则:

  1. 牌型

    • 炸弹:任意三张相同点数的牌。
    • 三带一:任意一张带三张不同点数的牌。
    • 对子:任意两张相同点数的牌。
    • 单张:任意一张牌。
  2. 出牌规则

    • 每次必须出至少一张牌。
    • 不能出错牌(即不能出不符合牌型的牌)。
  3. 胜负判定

    • 首先比对炸弹,炸弹数量多者胜。
    • 若炸弹数量相同,比对三带一,三带一数量多者胜。
    • 若三带一数量相同,比对对子,对子数量多者胜。
    • 若所有牌型数量相同,比对单张,单张点数总和多者胜。
  4. 特殊规则

    • 炸弹必须使用至少三张牌。
    • 三带一必须使用至少四张牌。
    • 每次出牌后,剩余牌必须形成有效的牌型。

代码实现

HTML结构

我们首先创建一个HTML页面,用于显示游戏界面和控制台输出。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">HTML斗地主</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            background-color: #f0f0f0;
        }
        #gameContainer {
            max-width: 800px;
            margin: 20px auto;
            padding: 20px;
        }
        #player1 {
            background-color: #e0e0e0;
            padding: 10px;
            margin-bottom: 10px;
        }
        #player2 {
            background-color: #e0e0e0;
            padding: 10px;
            margin-bottom: 10px;
        }
        #score {
            margin-top: 20px;
        }
        .player {
            margin: 10px;
        }
    </style>
</head>
<body>
    <h1>HTML斗地主</h1>
    <div id="gameContainer">
        <div id="player1">玩家1:</div>
        <div id="player2">玩家2:</div>
        <div id="score">比分:0 - 0</div>
    </div>
    <script>
        // 游戏逻辑代码将被插入在这里
    </script>
</body>
</html>

JavaScript代码

我们编写JavaScript代码,实现斗地主游戏的功能。

1 创建牌库

我们需要创建一个牌库,包含所有扑克牌。

const suits = ['黑桃', '红心', '梅花', '方块'];
const values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
const cards = [];
suits.forEach(suit => {
    values.forEach(value => {
        cards.push(`${value}${suit}`);
    });
});

2 洗牌

每次游戏开始前,我们需要洗牌。

function shuffleCards() {
    const cardList = [...cards];
    Math.random().sort(cardList);
    return cardList;
}

3 分配牌

将洗好的牌分配给玩家。

function dealCards() {
    const cards = shuffleCards();
    const player1 = cards.slice(0, 2);
    const player2 = cards.slice(2);
    return { player1, player2 };
}

4 判断牌型

我们需要一个函数来判断给定的牌是否符合特定的牌型。

function checkHand(hand, target) {
    const valueMap = {
        '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10,
        'J': 11, 'Q': 12, 'K': 13, 'A': 14
    };
    const counts = Array(15).fill(0); // 0到14
    hand.forEach(card => {
        const value = valueMap[card[0]] || valueMap[card[1]];
        counts[value] += 1;
    });
    if (target === '炸弹') {
        return counts.some(c => c >= 3);
    } else if (target === '三带一') {
        return counts.some(c => c >= 3) && counts.some(c => c === 1);
    } else if (target === '对子') {
        return counts.some(c => c >= 2);
    } else {
        return true; // 单张
    }
}

5 出牌逻辑

玩家可以根据当前牌型出牌。

function playCard(player, card) {
    player = player.replace(new RegExp(card, '/g'), '');
    return player;
}

6 游戏循环

主游戏循环,处理玩家出牌和判定胜负。

function gameLoop() {
    // 判断当前牌型
    const player1Hand = [...player1Cards];
    const player2Hand = [...player2Cards];
    // 玩家1出牌
    const player1CurrentHand = player1Hand.filter(card => {
        // 检查是否符合出牌规则
        const isBomb = checkHand(player1CurrentHand, '炸弹');
        const isTrip = checkHand(player1CurrentHand, '三带一');
        const isPair = checkHand(player1CurrentHand, '对子');
        const isSingle = !isBomb && !isTrip && !isPair;
        if (!isSingle) {
            return false;
        }
        return true;
    });
    if (player1CurrentHand.length === 0) {
        // 玩家1输
        updateScore(0, 1);
        return;
    }
    const cardToPlay = player1CurrentHand[0];
    player1Cards = playCard(player1Cards, cardToPlay);
    showHand(player1Cards);
    // 判断胜负
    if (winCondition(player1Cards, player2Cards)) {
        updateScore(1, 2);
        return;
    }
    // 玩家2出牌
    const player2CurrentHand = player2Hand.filter(card => {
        const isBomb = checkHand(player2CurrentHand, '炸弹');
        const isTrip = checkHand(player2CurrentHand, '三带一');
        const isPair = checkHand(player2CurrentHand, '对子');
        const isSingle = !isBomb && !isTrip && !isPair;
        if (!isSingle) {
            return false;
        }
        return true;
    });
    if (player2CurrentHand.length === 0) {
        // 玩家2输
        updateScore(1, 2);
        return;
    }
    const cardToPlay = player2CurrentHand[0];
    player2Cards = playCard(player2Cards, cardToPlay);
    showHand(player2Cards);
    // 判断胜负
    if (winCondition(player1Cards, player2Cards)) {
        updateScore(1, 2);
    }
}
function showHand(hand) {
    // 显示玩家当前的牌
    return hand.join(', ');
}
function winCondition(player1, player2) {
    // 比较牌型
    const player1Bombs = player1.filter(card => {
        const value = card[0] || card[1];
        return value <= 14 && value >= 2 && value >= 2 && value >= 2;
    }).length;
    const player2Bombs = player2.filter(card => {
        const value = card[0] || card[1];
        return value <= 14 && value >= 2 && value >= 2 && value >= 2;
    }).length;
    if (player1Bombs > player2Bombs) {
        return true;
    } else if (player1Bombs < player2Bombs) {
        return false;
    } else {
        // 比较三带一
        const player1Triples = player1.filter(hand => {
            const values = hand.split('').map(c => c.slice(-1)).map(v => {
                const suit = c.slice(0);
                return parseInt(v) === 3;
            });
            return values.length >= 3;
        }).length;
        const player2Triples = player2.filter(hand => {
            const values = hand.split('').map(c => c.slice(-1)).map(v => {
                const suit = c.slice(0);
                return parseInt(v) === 3;
            });
            return values.length >= 3;
        }).length;
        if (player1Triples > player2Triples) {
            return true;
        } else if (player1Triples < player2Triples) {
            return false;
        } else {
            // 比较对子
            const player1Pairs = player1.filter(hand => {
                const values = hand.split('').map(c => c.slice(-1)).map(v => {
                    const suit = c.slice(0);
                    return parseInt(v) === 2;
                });
                return values.length >= 2;
            }).length;
            const player2Pairs = player2.filter(hand => {
                const values = hand.split('').map(c => c.slice(-1)).map(v => {
                    const suit = c.slice(0);
                    return parseInt(v) === 2;
                });
                return values.length >= 2;
            }).length;
            if (player1Pairs > player2Pairs) {
                return true;
            } else if (player1Pairs < player2Pairs) {
                return false;
            } else {
                // 比较单张
                const player1Singles = player1.reduce((acc, curr) => {
                    const value = curr.slice(-1);
                    return acc + (value === 14 ? 1 : 0);
                }, 0);
                const player2Singles = player2.reduce((acc, curr) => {
                    const value = curr.slice(-1);
                    return acc + (value === 14 ? 1 : 0);
                }, 0);
                return player1Singles > player2Singles;
            }
        }
    }
}

7 分数更新

当一方出完牌时,更新分数。

function updateScore(winner, loser) {
    document.getElementById('score').textContent = `比分:${winner} - ${loser}`;
}

8 游戏初始化

初始化游戏并开始循环。

function initGame() {
    const player1Cards = [];
    const player2Cards = [];
    const cards = shuffleCards();
    player1Cards = cards.slice(0, 2);
    player2Cards = cards.slice(2);
    showHand(player1Cards);
    showHand(player2Cards);
    gameLoop();
}
initGame();

完整代码

将以上代码整合到一个HTML文件中:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">HTML斗地主</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            background-color: #f0f0f0;
        }
        #gameContainer {
            max-width: 800px;
            margin: 20px auto;
            padding: 20px;
        }
        #player1 {
            background-color: #e0e0e0;
            padding: 10px;
            margin-bottom: 10px;
        }
        #player2 {
            background-color: #e0e0e0;
            padding: 10px;
            margin-bottom: 10px;
        }
        #score {
            margin-top: 20px;
        }
        .player {
            margin: 10px;
        }
    </style>
</head>
<body>
    <h1>HTML斗地主</h1>
    <div id="gameContainer">
        <div id="player1">玩家1:</div>
        <div id="player2">玩家2:</div>
        <div id="score">比分:0 - 0</div>
    </div>
    <script>
        const suits = ['黑桃', '红心', '梅花', '方块'];
        const values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
        const cards = [];
        suits.forEach(suit => {
            values.forEach(value => {
                cards.push(`${value}${suit}`);
            });
        });
        function shuffleCards() {
            const cardList = [...cards];
            Math.random().sort(cardList);
            return cardList;
        }
        function dealCards() {
            const cards = shuffleCards();
            const player1 = cards.slice(0, 2);
            const player2 = cards.slice(2);
            return { player1, player2 };
        }
        function checkHand(hand, target) {
            const valueMap = {
                '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10,
                'J': 11, 'Q': 12, 'K': 13, 'A': 14
            };
            const counts = Array(15).fill(0); // 0到14
            hand.forEach(card => {
                const value = valueMap[card[0]] || valueMap[card[1]];
                counts[value] += 1;
            });
            if (target === '炸弹') {
                return counts.some(c => c >= 3);
            } else if (target === '三带一') {
                return counts.some(c => c >= 3) && counts.some(c => c === 1);
            } else if (target === '对子') {
                return counts.some(c => c >= 2);
            } else {
                return true; // 单张
            }
        }
        function playCard(player, card) {
            player = player.replace(new RegExp(card, '/g'), '');
            return player;
        }
        function showHand(hand) {
            return hand.join(', ');
        }
        function winCondition(player1, player2) {
            const player1Bombs = player1.filter(card => {
                const value = card[0] || card[1];
                return value <= 14 && value >= 2 && value >= 2 && value >= 2;
            }).length;
            const player2Bombs = player2.filter(card => {
                const value = card[0] || card[1];
                return value <= 14 && value >= 2 && value >= 2 && value >= 2;
            }).length;
            if (player1Bombs > player2Bombs) {
                return true;
            } else if (player1Bombs < player2Bombs) {
                return false;
            } else {
                const player1Triples = player1.filter(hand => {
                    const values = hand.split('').map(c => c.slice(-1)).map(v => {
                        const suit = c.slice(0);
                        return parseInt(v) === 3;
                    });
                    return values.length >= 3;
                }).length;
                const player2Triples = player2.filter(hand => {
                    const values = hand.split('').map(c => c.slice(-1)).map(v => {
                        const suit = c.slice(0);
                        return parseInt(v) === 3;
                    });
                    return values.length >= 3;
                }).length;
                if (player1Triples > player2Triples) {
                    return true;
                } else if (player1Triples < player2Triples) {
                    return false;
                } else {
                    const player1Pairs = player1.filter(hand => {
                        const values = hand.split('').map(c => c.slice(-1)).map(v => {
                            const suit = c.slice(0);
                            return parseInt(v) === 2;
                        });
                        return values.length >= 2;
                    }).length;
                    const player2Pairs = player2.filter(hand => {
                        const values = hand.split('').map(c => c.slice(-1)).map(v => {
                            const suit = c.slice(0);
                            return parseInt(v) === 2;
                        });
                        return values.length >= 2;
                    }).length;
                    if (player1Pairs > player2Pairs) {
                        return true;
                    } else if (player1Pairs < player2Pairs) {
                        return false;
                    } else {
                        const player1Singles = player1.reduce((acc, curr) => {
                            const value = curr.slice(-1);
                            return acc + (value === 14 ? 1 : 0);
                        }, 0);
                        const player2Singles = player2.reduce((acc, curr) => {
                            const value = curr.slice(-1);
                            return acc + (value === 14 ? 1 : 0);
                        }, 0);
                        return player1Singles > player2Singles;
                    }
                }
            }
        }
        function updateScore(winner, loser) {
            document.getElementById('score').textContent = `比分:${winner} - ${loser}`;
        }
        function initGame() {
            const player1Cards = [];
            const player2Cards = [];
            const cards = shuffleCards();
            player1Cards = cards.slice(0, 2);
            player2Cards = cards.slice(2);
            showHand(player1Cards);
            showHand(player2Cards);
            gameLoop();
        }
HTML斗地主代码解析与实现html斗地主代码,

发表评论