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

news2024/12/22 19:39:52

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

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

题目:

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

建议:请先在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 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wps 不显示公式_当Excel中使用函数不显示结果只显示公式时,该怎么解决呢?

在使用Excel过程中,有时候Excel中使用函数后,不显示结果只显示公式。 如下面使用vlookup函数时,只显示公式不显示结果。 遇到这种情况我们该怎么处理呢? 接下来,介绍几种造成该情况的原因以及相对应的解决方法。 1.如果…

BarTender.Application COM 多次调用引发后台进程数不断增加的问题

引用文章方法测试,目前未发现问题. Closing Instance Of Bartender – BarTender Support Portal (seagullscientific.com) Closing Instance Of Bartender FollowFollowed by one person Legacy Poster 9 years ago Hello again, Ive got BarTender automating…

LLM:Vicuna 7B模型简单部署体验

0、引入1、保存权重文件到阿里云盘2、部署环境3、上传权重文件到30904、下载安装源码4.1 下载编译安装源码4.2 安装5、开始使用6、直接使用我的镜像立即开启人机对话Debug:可能的报错0、引入 随着ChatGPT的火热,科技公司们各显神通,针对大语…

设计模式之中介者模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、中介者模式是什么? 中介者模式是一种行为型的软件设计模式,也称为仲裁者模式,顾名思义&am…

nginx--基本配置

目录 1.安装目录 2.文件详解 2.编译参数 3.Nginx基本配置语法 1./etc/nginx/nginx.conf 2./etc/nginx/conf.d/default.conf 3.启动重启命令 4.设置404跳转页面 1./etc/nginx/conf.d/default.conf修改 ​2. 重启 5.最前面内容模块 6.事件模块 1.安装目录 # etc cd …

排序-时间复杂度

技巧:先处理 内层 一次排序,在处理外面 直接插入排序 升序 最坏(遇到降序):O(N^2) 等差数列 123…(n-1) (n^2-n)/2 最好(有序) O(N) 希尔排序 gap 任何数字/2都是1 gap/3 1 保证gap最后是1 gap是多少 就分了多少组,每组数据可能少一点&…

根文件系统移植:bulidroot根文件系统搭建详细步骤

bulidroot根文件系统 文章目录bulidroot根文件系统1.buildroot 下载2 配置 buildroot1、配置 Target options2、配置 Toolchain3、 配置 System configuration4、配置 Filesystem images5、 禁止编译 Linux 内核和 uboot6、配置 Target packages3 编译 buildroot4 buildroot 根…

第一章 计算机网络概述

计算机网络基本概念 计算机网络是计算机技术与通信技术相互融合的产物计算机网络是互连的、自治的计算机的集合 自治——互连的计算机系统彼此独立,不存在主从或者控制与被控制关系互连——利用通信链路连接相互独立的计算机系统 目前最大的、应用最广泛的计算机网…

函数栈帧的创建和销毁(带你进一步深入理解函数的执行流程)

本文主题 什么是函数栈帧? 理解函数栈帧能解决什么问题? 函数栈帧的创建和销毁解析 1. 什么是函数栈帧 ? 我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。 那函数是如何…

人人都是数据分析师-数据分析之数据图表可视化(上)

BI报表、运营同学的汇报报告中数据图表大多为 表格、折线图、柱状图和饼图,但是实际上还有很多具有代表性的可视化图表,因此将对常见的可视化图表进行介绍,希望这些图表可视化方法能够更好的提供数据的可用性。 导语 数据是我们在数据分析工…

通过1个IP地址同时采集2台西门子S7200 Smart的数据

一、应用场景 制药厂的颗粒包装机,控制系统由2台西门子S7200 Smart的PLC和1台昆仑通泰MCGS的触摸屏组成。现在MES管理系统,需要采集设备的数据,只提供一个IP地址,且IP地址和原系统不在同一个网络段内。 二、原系统架构 2台西门子S…

浅析DNS Rebinding

0x01 攻击简介 DNS Rebinding也叫做DNS重绑定攻击或者DNS重定向攻击。在这种攻击中,恶意网页会导致访问者运行客户端脚本,攻击网络上其他地方的计算机。 在介绍DNS Rebinding攻击机制之前我们先了解一下Web同源策略, Web同源策略 同源策略…

智慧校园人员定位系统解决方案

人员定位是安全管理中最重要的一个环节,尤其是石化、矿业、电力、建筑等高危行业,人员安全管理更是重中之重,除了工业领域,其它领域也需要人员安全管理,比如:学校、医院、养老院、物业、环卫等。下面我们以…

SpringSecurity之基本原理——过滤器加载过程

前言 前一篇讲解了SpringSecurity的过滤器链的基本只是,今天我们就要进入过滤器,看看其加载过程是如何的? 相信认真度过第一篇文章的小伙伴还记得,我说在SpringBoot出现后,帮助我们省去了那些繁琐的配置,…

2023年MathorCup数模A题赛题

A 题 量子计算机在信用评分卡组合优化中的应用 在银行信用卡或相关的贷款等业务中,对客户授信之前,需要先通过 各种审核规则对客户的信用等级进行评定,通过评定后的客户才能获得信 用或贷款资格。规则审核过程实际是经过一重或者多重组合规则…

树的直径问题

一,定义 树的直径就树中所有最短路经距离的最大值 求取树的直径可以使用两遍dfs或者树形dp获得 二,两遍dfs获得树的直径(注意,该方法边权必须都为正边权) 思路: 我们首先任取一点走dfs,然后…

索引:索引知识重复习,什么是索引、索引的类型、建立索引及【最左匹配原则】、Explain查看sql的执行计划

文章目录什么是索引索引的类型主键索引(primary key)普通索引(index)复合索引全文索引(fulltext)空间索引唯一索引索引修改及删除Explain一、using filesort(减慢查询效率)二、Using temporary三、using in…

TensorFlow 1.x学习(系列二 :3):变量与tensorboard可视化

文章目录1.变量2.可视化学习 Tensorboard3.可视化过程中遇到的问题:import tensorflow as tf1.变量 变量op: 变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量,默认被训练和常量不同(…

15个 AI-powered应用,加速学术写作和阅读

文章目录写作方面1.Jenni AI(推荐)2.Paperpal阅读方面3.Schoarlcy4.chatpdf5.Casper6.SciSpace(推荐)文献管理/写论文笔记用7.lateral8. ClioVis9.Glasp10. Audiopen学术目的的搜索引擎11. Consensus(推荐)…

【私有云盘】搭建PHP轻量文件管理器 - TinyFileManager「公网远程访问」

文章目录前言1. Tiny File Manager网站搭建1.1.Tiny file manager下载和安装1.2.Tiny file manager网页测试2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置3. 公网访问测试4. 结语前言 文件共享和查阅是现在网络最常见的应用场景&#x…