为一副通用纸牌设计数据结构

为一副通用纸牌设计数据结构

大家好,我是易安,今天我们来聊一道笔试题,这也是我曾经面试华为时做过的题,今天分享给大家。

题目:

如何设计一个通用的扑克牌数据结构?请解释如何继承它来实现特定的扑克游戏,以及如何继承这些数据结构来实现二十一点游戏。

建议:请先在IDE上尝试解法,然后再去看解决方案

解决方案:

首先,我们需要认识到“通用”的扑克牌可以有很多种。通用可能意味着可以用于类似扑克的游戏的标准牌组,或者甚至可以扩展到Uno或棒球卡。

实现特定的扑克牌游戏

假设这个牌组是一个标准的52张牌组,就像你在二十一点或扑克游戏中看到的那样。如果是这样,设计可能看起来像这样:

这里的结构很清晰:一副牌包含四种花色和13张牌。每张牌的数字值从1到13。如果您考虑一下扑克牌游戏,不同的游戏有不同的发牌和回收牌的方式。因此,我们可以在“Deck”类中有一组抽象方法,以允许子类实现其自己的发牌方式。我画的类图在这里:

img
img

Java版本:

这里只是写了大概的流程节点,关键需要你自己补充

要设计一个通用的扑克牌数据结构,可以考虑使用以下类来表示扑克牌:

public class Card {
    private final Suit suit; // 花色
    private final Rank rank; // 点数

    public Card(Suit suit, Rank rank) {
        this.suit = suit;
        this.rank = rank;
    }

    // Getter and Setter methods

    @Override
    public String toString() {
        return rank + " of " + suit;
    }
}

public enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES;
}

public enum Rank {
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING;
}

Card类有两个实例变量:suitrank,分别表示花色和点数。SuitRank分别是枚举类型,用于限定花色和点数的范围。通过这个类,我们可以轻松地创建一副扑克牌。

为了实现特定的扑克游戏,可以创建一个继承自Card的类,来表示具有特殊规则的游戏中的牌。例如,在五十二张牌的德州扑克中,有四种花色和十三种点数,但是在游戏中,有一张叫做“大王”的牌,它并不属于上述任何一种花色或点数。可以创建一个TexasHoldemCard类,继承自Card类,并添加一个名为isJoker()的方法,用于判断该牌是否为“大王”。

public class TexasHoldemCard extends Card {
    private boolean isJoker;

    public TexasHoldemCard(Suit suit, Rank rank) {
        super(suit, rank);
        this.isJoker = false;
    }

    public boolean isJoker() {
        return isJoker;
    }

    public void setJoker(boolean joker) {
        isJoker = joker;
    }
}

TexasHoldemCard类中,添加了一个名为isJoker()的方法,用于判断该牌是否为“大王”。如果是“大王”,则返回true;否则返回false

为了实现二十一点游戏,可以创建一个名为Blackjack的类,继承自Card类,用于表示二十一点游戏中的牌。在二十一点游戏中,每张牌都有一个点数,其中A牌可以表示1或11点,而J、Q、K牌都表示10点。因此,在Blackjack类中,需要添加一个名为getValue()的方法,用于返回该牌的点数。

public class BlackjackCard extends Card {
    public BlackjackCard(Suit suit, Rank rank) {
        super(suit, rank);
    }

    public int getValue() {
        switch (rank) {
            case TWO:
                return 2;
            case THREE:
                return 3;
            case FOUR:
             return 4;
        case FIVE:
            return 5;
        case SIX:
            return 6;
        case SEVEN:
            return 7;
        case EIGHT:
            return 8;
        case NINE:
            return 9;
        case TEN:
        case JACK:
        case QUEEN:
        case KING:
            return 10;
        case ACE:
            return 1; // A牌默认为1点
        default:
            throw new IllegalStateException("Unexpected value: " + rank);
    }
 }
}

BlackjackCard类中,添加了一个名为getValue()的方法,用于返回该牌的点数。在此方法中,使用了一个switch语句,根据不同的点数返回不同的点数值。需要注意的是,A牌的点数可以为1或11,但是在此方法中默认为1。

现在,我们已经设计了通用的扑克牌数据结构,并且使用继承的方式,实现了特定的扑克游戏和二十一点游戏。下面是一个简单的例子,展示如何使用上述代码:

public class Main {
    public static void main(String[] args) {
        Card card = new Card(Suit.HEARTS, Rank.ACE);
        System.out.println(card); // Output: ACE of HEARTS

        TexasHoldemCard joker = new TexasHoldemCard(Suit.CLUBS, Rank.ACE);
        joker.setJoker(true);
        System.out.println(joker.isJoker()); // Output: true

        BlackjackCard king = new BlackjackCard(Suit.SPADES, Rank.KING);
        System.out.println(king.getValue()); // Output: 10
    }
}

在上述代码中,首先创建了一个普通的扑克牌对象,然后创建了一个继承自CardTexasHoldemCard对象,该对象被标记为“大王”,最后创建了一个继承自CardBlackjackCard对象,表示一张K牌,其点数为10。

运行该程序,输出结果为:

ACE of HEARTS
true
10

这表明我们成功地创建了一个通用的扑克牌数据结构,并使用继承的方式,实现了特定的扑克游戏和二十一点游戏。

完整代码如下:

public class Card {
    private final Suit suit; // 花色
    private final Rank rank; // 点数

    public Card(Suit suit, Rank rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public Suit getSuit() {
        return suit;
    }

    public Rank getRank() {
        return rank;
    }

    @Override
    public String toString() {
        return rank + " of " + suit;
    }
}

enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES;
}

enum Rank {
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING;
}

public class TexasHoldemCard extends Card {
    private boolean isJoker;

    public TexasHoldemCard(Suit suit, Rank rank) {
        super(suit, rank);
        this.isJoker = false;
    }

    public boolean isJoker() {
        return isJoker;
    }

    public void setJoker(boolean joker) {
        isJoker = joker;
    }
}

public class BlackjackCard extends Card {
    public BlackjackCard(Suit suit, Rank rank) {
        super(suit, rank);
    }

    public int getValue() {
        switch (rank) {
            case TWO:
                return 2;
            case THREE:
                return 3;
            case FOUR:
                return 4;
            case FIVE:
                return 5;
            case SIX:
                return 6;
            case SEVEN:
                return 7;
            case EIGHT:
                return 8;
            case NINE:
                return 9;
            case TEN:
            case JACK:
            case QUEEN:
            case KING:
                return 10;
            case ACE:
                return 1// A牌默认为1点
            default:
                throw new IllegalStateException("Unexpected value: " + rank);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Card card = new Card(Suit.HEARTS, Rank.ACE);
        System.out.println(card); // Output: ACE of HEARTS

        TexasHoldemCard joker = new TexasHoldemCard(Suit.CLUBS, Rank.ACE);
        joker.setJoker(true);
        System.out.println(joker.isJoker()); // Output: true

        BlackjackCard king = new BlackjackCard(Suit.SPADES, Rank.KING);
        System.out.println(king.getValue()); // Output: 10
    }
}

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/9769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内外人工智能AI工具网站大全(一键收藏,应有尽有)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 国内外人工智能AI工具网站大全(一键收藏,应有尽有)摘要一、AI写作工具二、AI图像工具2.1、常用AI图像工具2.2、AI图片插画生成2.3、AI图片背景移除…

分享10个前端开发者需要掌握的DOM技巧

Web开发不断发展,掌握最新的趋势和最佳实践对每位开发者来说都至关重要。Web开发的最重要方面之一就是使用文档对象模型(DOM)。在本文中,我们将探讨10个必须掌握的DOM技巧和技巧,配有代码示例,这将帮助您成…

Kotlin 是后端开发的未来

Kotlin 是后端开发的未来 严格类型、命名参数、多范式语言 您今天遇到的每个后端开发人员都会说他们使用 JavaScript、Python、PHP 或 Ruby 编写代码。近年来,您会遇到一小部分人转而使用 Kotlin 作为他们创建 Web 服务器的语言选择。由于我在学习Ktor,所…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤: 在Linux中安装Git在Linux中安装maven编写shell脚本(拉取代码、编译、打包、启动)为用户授予执行shell脚本的权限执行shell脚本 执行过程:Linux服务器(编译、打包、启动&#x…

巧用千寻位置GNSS软件|点测量状态栏与工具栏全解析

众所周知,点测量是提供点位坐标多种模式测量、测量模式切换、测量数据简单成图等多种方式的点位地理信息测量功能。下面我们来解析在千寻位置GNSS软件中点测量功能下的各状态栏和工具栏。图5.1-1点击【测量】->【点测量】,如图5.1-1 所示,…

面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YA…

Android 设置背景颜色透明度

前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的,那为什么又需要我们做透明度呢,原因就是咱们的设计小哥哥、小姐姐们没有自己做处理,如果处理了的话,我们直接使用设计标注的AHEX颜色就行&a…

Vue+echart 图根据网页自适应resize缩放

const chartBar null;data{return {chartBar :null} }//关键代码activated() {// 由于给echart添加了resize事件, 在组件激活时需要重新resize绘画一次, 否则出现空白bug// if (this.chartBar) {this.chartBar.resize();// }},chartBar echarts.init(document.getElementBy…

信息安全和网络安全

安全五要素: 机密 完整 并且能判断数据是否被篡改 可用 可控 可审查性 对于网络及网络交易,信息安全的基本需求是: 机密性完整性不可抵赖性 计算机系统安全保护的五个等级: 注释:其中的安全标记保护级是属于强…

【Spring】—Spring中Bean的配置、作用域

一、Bean的配置 Spring用于生产和管理Spring容器中的Bean,需要开发者对Spring的配置文件进行配置。在实际开发中,最常采用XML格式的配置方式,即通过XML文件来注册并管理Bean之间的依赖关系。 在Spring中,XML配置文件的根元素是…

深度学习在表面缺陷检测领域的应用

随着工业对原材料质量要求的提高,圆钢表面缺陷检测已成为工业生产的重要组成部分。 表面缺陷检测技术主要分为两类,即传统的无损检测方法和机器视觉检测方法,后者因其实时性和高精度而得到更广泛的应用。 作为现代工业生产的重要原材料&…

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料分类效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention多输入分类预测,CNN-BiLSTM结合注意力机制多输…

【教程】解决VSCode中Python第三方库无法自动补全

背景 学习ROS的时候,发现ROS的第三方库无法自动补齐 解决过程 查询到的一个解决方法是,禁用Pylance扩展 禁用之后第三方库可以自动补齐了但是原来自带库的语法高亮消失了此解决方法不是上策 解决方法 打开 .vscode 文件夹下面的 setting.json 文件 …

QN88封装国产FPGA

QN88GW1N-9管脚名GW2A-18管脚名AL3S10EG4S201VCCVCCIO_L1_1VCC_12VSSVSSIO_L2_1IO_L1_13IOL2AVCCO7IO_L3_1,MOSI,D1IO_L2_14IOL5A/JTAGSEL_N/LPLL_T_inIOL7A/LPLL1_T_inIO_L4_1IO_L1N_15IOL11A/TMSIOR25B/TMSIO_L5_1,SPICSNIO_L1P_16IOL11B/TCKIOR26A/TCKINITNGND7IOL12B/TDIIO…

常见漏洞扫描工具AWVS、AppScan、Nessus的使用

HVV笔记——常见漏洞扫描工具AWVS、AppScan、Nessus的使用1 AWVS1.1 安装部署1.2 激活1.3 登录1.4 扫描web应用程序1.4.1 需要账户密码登录的扫描1.4.2 利用录制登录序列脚本扫描1.4.3 利用定制cookie扫描1.5 扫描报告分析1.5.1 AWVS报告类型1.5.2 最常用的报告类型&#xff1a…

Hive小文件问题

1、小文件产生的原因 数据源本身有很多小文件:reduce数量多导致生成的小文件增多:使用动态分区导致小文件增多: 2、小文件危害 HDFS内存资源消耗过大,并限制了数据存储规模:在HDFS中,具体的文件保存在da…

静态链表常用操作(节点计数/查找/增加/删除)

1.封装计算链表节点个数的API 代码心得: cnt是count的缩写,用来计数。节点,我们一般指的是链表中数据的地址(指针)。比如节点1就是第一个结构体的地址,节点2就是第2个结构体的地址,以此类推。…

Adaptive AUTOSAR架构和特性介绍

概述 本文主要内容分为两章节。第一章节简要介绍了AUTOSAR的软件架构,设计理念以及方法论,对Classic Platform和Adaptive Platform做了简单的比较。第二章主要介绍了Adaptive Platform的特性。 第一章 AUTOSAR架构介绍 AUTOSAR(AUTomotive Open System ARchitecture)是汽车…

MySQL性能优化(四)性能优化总结

文章目录连接优化服务端链接优化客户端连接优化配置的优化架构优化数据库高可用:数据库慢查询慢查询日志profiling工具表结构和存储引擎的优化存储引擎:表结构SQL与索引的优化案例- 执行计划 ExplainID序号select type查询类型type 针对单表的访问方法Sy…

ChatGPT 与 MindShow 一分钟搞定一个PPT

前言 PPT制作是商务、教育和各种场合演讲的重要组成部分。然而,很多人会花费大量时间和精力在内容生成和视觉设计方面。为了解决这个问题,我们可以利用两个强大的工具——ChatGPT和MindShow,来提高制作PPT的效率。 一、ChatGPT 与 MindShow…