一张扑克牌有两个属性,一个是花色(suit),一个是点数(rank),下面写一个简单的类

Card

package com.syz.card;

import java.io.Serializable;

public class Card implements Serializable{

private static final long serialVersionUID = -4279016186402068401L;

private int suit;

private int rank;

public static final int SPADE = 0;

public static final int HEART = 1;

public static final int CLUB = 2;

public static final int DIAMOND = 3;

public static final int BLACK = 4;

public static final int RED = 5;

private static final String[] suits = new String[] { "黑桃", "红桃", "梅花", "方块",

"小", "大" };

public static final int ACE = 1000;

public static final int TWO = 1001;

public static final int THREE = 1002;

public static final int FOUR = 1003;

public static final int FIVE = 1004;

public static final int SIX = 1005;

public static final int SEVEN = 1006;

public static final int EIGHT = 1007;

public static final int NINE = 1008;

public static final int TEN = 1009;

public static final int JACK = 1010;

public static final int QUEEN = 1011;

public static final int KING = 1012;

public static final int JOKER = 1013;

private static final String[] ranks = new String[] { "A", "2", "3", "4",

"5", "6", "7", "8", "9", "10", "J", "Q", "K", "王" };

public Card(int suit, int rank) {

if (suit > -1 && suit < 6) {

if (suit < 4) {

if (rank < 1000 || rank > 1012) {

throw new IllegalArgumentException("花色或点数参数错误!");

}

}

else {

if (rank != 1013) {

throw new IllegalArgumentException("花色或点数参数错误!");

}

}

}

else {

throw new IllegalArgumentException("花色参数错误!");

}

this.suit = suit;

this.rank = rank;

}

public int getSuit() {

return suit;

}

public int getRank() {

return rank;

}

@Override

public String toString() {

return suits[suit] + ranks[rank - 1000];

}

}

写完之后,要new一张扑克牌,需要两个参数,suit和rank,而且suit和rank是有关系的黑红梅方可以对应A2345678910JQK,然后黑色小王,红色大王。这个在构造器里做了校验,如果不符合,则抛出参数错误异常。

下面是测试类

CardClient

package com.syz.card;

import java.util.ArrayList;

import java.util.List;

public class CardClient {

public static void main(String[] args) {

test2();

}

private static void test1() {

Card c = new Card(Card.BLACK, Card.JOKER);

System.out.println(c);

}

private static void test2() {

int[] suits = new int[] { Card.SPADE, Card.HEART, Card.CLUB,

Card.DIAMOND };

int[] ranks = new int[] { Card.ACE, Card.TWO, Card.THREE, Card.FOUR,

Card.FIVE, Card.SIX, Card.SEVEN, Card.EIGHT, Card.NINE,

Card.TEN, Card.JACK, Card.QUEEN, Card.KING };

List cards = new ArrayList();

for (int i = 0; i < suits.length; i++) {

for (int j = 0; j < ranks.length; j++) {

cards.add(new Card(suits[i], ranks[j]));

}

}

cards.add(new Card(Card.BLACK, Card.JOKER));

cards.add(new Card(Card.RED, Card.JOKER));

System.out.println(cards);

}

}测试结果:

[黑桃A, 黑桃2, 黑桃3, 黑桃4, 黑桃5, 黑桃6, 黑桃7, 黑桃8, 黑桃9, 黑桃10, 黑桃J, 黑桃Q, 黑桃K, 红桃A, 红桃2, 红桃3, 红桃4, 红桃5, 红桃6, 红桃7, 红桃8, 红桃9, 红桃10, 红桃J, 红桃Q, 红桃K, 梅花A, 梅花2, 梅花3, 梅花4, 梅花5, 梅花6, 梅花7, 梅花8, 梅花9, 梅花10, 梅花J, 梅花Q, 梅花K, 方块A, 方块2, 方块3, 方块4, 方块5, 方块6, 方块7, 方块8, 方块9, 方块10, 方块J,

方块Q, 方块K, 小王, 大王]

这样一副扑克就创建成功了。

扑克原来有52张,没有大小王,后来才加上了大小王。现在有些扑克会带一张白板牌里面是一些广告什么的,如果把这张牌加入的话,就得改改这个Card类了。

下面我们来看看第二种方式创建一副扑克牌,不过这儿的类有些多,好处就是可以扩展。看代码:

1.Suit

package com.syz.pattern.bridge;

public abstract class Suit {

private Face face;

public Suit(Face face) {

this.face = face;

}

public void show() {

face.show(this);

}

protected abstract String getName();

}

2.Face

package com.syz.pattern.bridge;

public abstract class Face {

protected abstract String getName();

public void show(Suit suit) {

System.out.println(suit.getName() + this.getName());

}

}

以上两个抽象类,相互引用。是花色和点数的父类。

Suit的几个子类:

package com.syz.pattern.bridge;

public class Spade extends Suit {

public Spade(Face face) {

super(face);

}

@Override

public String getName() {

return "黑桃";

}

}

package com.syz.pattern.bridge;

public class Heart extends Suit {

public Heart(Face face) {

super(face);

}

@Override

protected String getName() {

return "红桃";

}

}

package com.syz.pattern.bridge;

public class Club extends Suit {

public Club(Face face) {

super(face);

}

@Override

protected String getName() {

return "梅花";

}

}

package com.syz.pattern.bridge;

public class Diamond extends Suit {

public Diamond(Face face) {

super(face);

}

@Override

protected String getName() {

return "方块";

}

}

package com.syz.pattern.bridge;

public class Black extends Suit {

public Black(Face face) {

super(face);

}

@Override

protected String getName() {

return "小";

}

}

package com.syz.pattern.bridge;

public class Red extends Suit {

public Red(Face face) {

super(face);

}

@Override

protected String getName() {

return "大";

}

}

Face的几个子类

package com.syz.pattern.bridge;

public class Ace extends Face {

@Override

protected String getName() {

return "A";

}

}

package com.syz.pattern.bridge;

public class Two extends Face {

@Override

protected String getName() {

return "2";

}

}

package com.syz.pattern.bridge;

public class Three extends Face {

@Override

protected String getName() {

return "3";

}

}

package com.syz.pattern.bridge;

public class Four extends Face {

@Override

protected String getName() {

return "4";

}

}

package com.syz.pattern.bridge;

public class Five extends Face {

@Override

protected String getName() {

return "5";

}

}

package com.syz.pattern.bridge;

public class Six extends Face {

@Override

protected String getName() {

return "6";

}

}

package com.syz.pattern.bridge;

public class Seven extends Face {

@Override

protected String getName() {

return "7";

}

}

package com.syz.pattern.bridge;

public class Eight extends Face {

@Override

protected String getName() {

return "8";

}

}

package com.syz.pattern.bridge;

public class Nine extends Face {

@Override

protected String getName() {

return "9";

}

}

package com.syz.pattern.bridge;

public class Ten extends Face {

@Override

protected String getName() {

return "10";

}

}

package com.syz.pattern.bridge;

public class Jack extends Face {

@Override

protected String getName() {

return "J";

}

}

package com.syz.pattern.bridge;

public class Queen extends Face {

@Override

protected String getName() {

return "Q";

}

}

package com.syz.pattern.bridge;

public class King extends Face {

@Override

protected String getName() {

return "K";

}

}

package com.syz.pattern.bridge;

public class Joker extends Face {

@Override

protected String getName() {

return "王";

}

}

接下来看一些测试:

Suit c1 = new Spade(new Ace());

c1.show();

c1 = new Heart(new Jack());

c1.show();

c1 = new Club(new Queen());

c1.show();

c1 = new Diamond(new King());

c1.show();

c1 = new Spade(new Joker());

c1.show();

测试结果:

黑桃A

红桃J

梅花Q

方块K

黑桃王

花色和点数组合,可以看出,这里没有规则,“黑桃王”这样的都可以拼出来,我就呵呵了。

那么怎么组合成一副54张的扑克呢,这里可以用反射来做,看代码:

package com.syz.pattern.bridge;

import java.util.ArrayList;

import java.util.List;

public class CardClient {

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void main(String[] args) throws Exception {

// reflect

String[] suitNames = { "com.syz.pattern.bridge.Spade",

"com.syz.pattern.bridge.Heart", "com.syz.pattern.bridge.Club",

"com.syz.pattern.bridge.Diamond" };

String[] rankNames = { "com.syz.pattern.bridge.Ace",

"com.syz.pattern.bridge.Two", "com.syz.pattern.bridge.Three",

"com.syz.pattern.bridge.Four", "com.syz.pattern.bridge.Five",

"com.syz.pattern.bridge.Six", "com.syz.pattern.bridge.Seven",

"com.syz.pattern.bridge.Eight", "com.syz.pattern.bridge.Nine",

"com.syz.pattern.bridge.Ten", "com.syz.pattern.bridge.Jack",

"com.syz.pattern.bridge.Queen", "com.syz.pattern.bridge.King" };

List cards = new ArrayList<>();

for (int i = 0; i < suitNames.length; i++) {

Class suitClazz = Class.forName(suitNames[i]);

for (int j = 0; j < rankNames.length; j++) {

Class rankClazz = Class.forName(rankNames[j]);

cards.add((Suit) suitClazz

.getConstructor(new Class[] { Face.class })

.newInstance(new Object[] { rankClazz.newInstance() }));

}

}

cards.add(new Black(new Joker()));

cards.add(new Red(new Joker()));

for (int i = 0; i < cards.size(); i++) {

Suit card = cards.get(i);

card.show();

}

}

}

结果:

黑桃A

黑桃2

黑桃3

黑桃4

黑桃5

黑桃6

黑桃7

黑桃8

黑桃9

黑桃10

黑桃J

黑桃Q

黑桃K

红桃A

红桃2

红桃3

红桃4

红桃5

红桃6

红桃7

红桃8

红桃9

红桃10

红桃J

红桃Q

红桃K

梅花A

梅花2

梅花3

梅花4

梅花5

梅花6

梅花7

梅花8

梅花9

梅花10

梅花J

梅花Q

梅花K

方块A

方块2

方块3

方块4

方块5

方块6

方块7

方块8

方块9

方块10

方块J

方块Q

方块K

小王

大王

java创建一副牌_用java怎么创建一副扑克牌相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...

    Code-Apprentice 2 java sql junit jdbc 我正在用Java编写数据库程序,并且想要创建一个表(如果它还不存在).我从中了解DatabaseMetaData.getTa ...

  3. java中的jsp文件创建_在JSP中创建文件夹和文件

    在JSP中判断某文件是否存在,并创建文件夹和文件. 备忘. 在WinXP + Tomcat5.1 中,代码如下: //得到web根路径//绝对路径 //getServletContext().getR ...

  4. java斗地主怎么出牌_斗地主滑动选牌出牌(Cocos Creator)

    本文主要讲解以下几个方面: card model 滑动处理 阴影 选择 出牌 Card Model 首先,牌有两个属性:数字.花型: ps:本文现在是,用数字和花型来组成一张牌,有空可以再用另一种形式 ...

  5. java写的网络版斗地主_用java实现斗地主

    忙里偷闲,自己运用初学的知识是心啊斗地主功能. 斗地主画图分析 直接上源代码 import java.util.*; public class PlayCards { public static vo ...

  6. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  7. java 模拟登陆web系统_关于java模拟登陆WEB的问题。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  8. java字符串拆分成数组_用Java实现JVM第八章《数组和字符串》

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用J ...

  9. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发

    <基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...

最新文章

  1. 表贴3.3V稳压芯片 PL3500测试 低压差线性稳压器
  2. Python eval函数用法简介
  3. Python中for else注意事项
  4. mate30 e pro和mate30 pro的区别_新出的华为mate40跟华为mate40pro手机有何区别呢?
  5. 【图像融合】简单认识图像融合
  6. db链接相关链接相关参数理解
  7. springboot - 应用实践(2)第一个springboot应用
  8. 怎么在Vue中使用和安装axios
  9. 9小时速返地球!刚刚,神舟十三号返回舱平安降落,三位航天员“感觉良好”...
  10. python中的cols_openpyxl读取列数据或指定行列之iter_cols方法
  11. [数学 悖论/理论]-(1) 直角三角形两边之和等于第三边!
  12. java遗传算法编程_遗传算法示例程序
  13. 粗虚线和细虚线_车道划分线上下两侧有粗虚线
  14. MMdetection中backbone的实现-MobileNetV2
  15. python 累加器_python中的累加器
  16. CoreData数据库探索
  17. C# 字符串操作--减少垃圾回收压力
  18. [福建]福建企业的现实与渴望
  19. 直播还有哪些新想象?AI+直播打造更有趣的直播间
  20. java基于web的聊天系统代码_WebChat聊天系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...

热门文章

  1. 上海交大研究生计算机考研真题,2011年上海交通大学计算机研究生机试真题
  2. python安装copy_python中copy和deepcopy 的区别
  3. C++调用matlab dll
  4. WinCE系统的编译过程详解
  5. usb长包数据结束判断_如何判断南桥好坏 判断南桥好坏方法介绍【详解】
  6. 【转】软件工程能力漫谈:比质量更重要的,是项目管理能力
  7. 【转】Windows Azure的账户体系
  8. C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  9. ip和端口正则表达式
  10. Angular使用Console.log()打印出来的数据没问题,点击详情后数据变了