大学期间,我在别人的基础上,写了一个简易的斗地主程序。

主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。

通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。

最近把这些设计和算法分享给大家,过些天会上传斗地主程序的源码。

项目截图

定义一张牌Card

a.一张牌的类型

// 一张牌的大类型
public enum CardBigType {
HEI_TAO, HONG_TAO, MEI_HUA, FANG_KUAI, XIAO_WANG, DA_WANG
}
// 一张牌的小类型
public enum CardSmallType {
A, ER, SAN, SI, WU, LIU, QI, BA, JIU, SHI, J, Q, K, XIAO_WANG, DA_WANG
}

b.一张牌Card的属性

// 牌的数字ID,1到54
public int id; // 牌的大类型,方块,梅花,红桃,黑桃,小王,大王
public final CardBigType bigType; // 牌的小类型,2_10,A,J,Q,K
public final CardSmallType smallType; // 牌的等级,对牌进行排序时会用到
public int grade; // 牌的图像名字,图形界面显示牌用到
public String imageName;

c.构造一张牌

// 通过牌的整型id构造一张牌
public Card(int id) {
this.id = id;
bigType = CardUtil.getBigType(id);
smallType = CardUtil.getSmallType(id);
grade = CardUtil.getGrade(id);
imageName = CardUtil.getImageName(id);
Icon icon = DdzUtil.getImageIcon(imageName);
setIcon(icon);
}

d.根据牌的id获得一张牌的大类型:方块,梅花,红桃,黑桃,小王,大王

/**
* 根据牌的id获得一张牌的大类型:方块,梅花,红桃,黑桃,小王,大王
*
* @param id
* 牌的id
*
* @return 牌的大类型:方块,梅花,红桃,黑桃,小王,大王
*/
public static CardBigType getBigType(int id) {
CardBigType bigType = null;
if (id >= 1 && id <= 13) {
bigType = CardBigType.FANG_KUAI;
} else if (id >= 14 && id <= 26) {
bigType = CardBigType.MEI_HUA;
} else if (id >= 27 && id <= 39) {
bigType = CardBigType.HONG_TAO;
} else if (id >= 40 && id <= 52) {
bigType = CardBigType.HEI_TAO;
} else if (id == 53) {
bigType = CardBigType.XIAO_WANG;
} else if (id == 54) {
bigType = CardBigType.DA_WANG;
}
return bigType;
}

e.根据牌的id,获取牌的小类型:2_10,A,J,Q,K

/**
* 根据牌的id,获取牌的小类型:2_10,A,J,Q,K
*
* @param id
* 牌的id
*
* @return 牌的小类型:2_10,A,J,Q,K
*/
public static CardSmallType getSmallType(int id) {
if (id < 1 || id > 54) {
throw new RuntimeException("牌的数字不合法");
} CardSmallType smallType = null; if (id >= 1 && id <= 52) {
smallType = numToType(id % 13);
} else if (id == 53) {
smallType = CardSmallType.XIAO_WANG;
} else if (id == 54) {
smallType = CardSmallType.DA_WANG;
} else {
smallType = null;
}
return smallType;
} /**
* 将阿拉伯数字0到12转换成对应的小牌型,被getSmallType方法调用
*
* @param num
* 数字(0到12)
* @return 牌的小类型
*/
private static CardSmallType numToType(int num) {
CardSmallType type = null;
switch (num) {
case 0:
type = CardSmallType.K;
break;
case 1:
type = CardSmallType.A;
break;
case 2:
type = CardSmallType.ER;
break;
case 3:
type = CardSmallType.SAN;
break;
case 4:
type = CardSmallType.SI;
break;
case 5:
type = CardSmallType.WU;
break;
case 6:
type = CardSmallType.LIU;
break;
case 7:
type = CardSmallType.QI;
break;
case 8:
type = CardSmallType.BA;
break;
case 9:
type = CardSmallType.JIU;
break;
case 10:
type = CardSmallType.SHI;
break;
case 11:
type = CardSmallType.J;
break;
case 12:
type = CardSmallType.Q;
break; }
return type;
}

f.根据牌的id,获得一张牌的等级

/**
* 根据牌的id,获得一张牌的等级
*
* @param id
* 牌的id
* @return 与牌数字对应的等级
*/
public static int getGrade(int id) { if (id < 1 || id > 54) {
throw new RuntimeException("牌的数字不合法");
} int grade = 0; // 2个王必须放在前边判断
if (id == 53) {
grade = 16;
} else if (id == 54) {
grade = 17;
} else {
int modResult = id % 13; if (modResult == 1) {
grade = 14;
} else if (modResult == 2) {
grade = 15;
} else if (modResult == 3) {
grade = 3;
} else if (modResult == 4) {
grade = 4;
} else if (modResult == 5) {
grade = 5;
} else if (modResult == 6) {
grade = 6;
} else if (modResult == 7) {
grade = 7;
} else if (modResult == 8) {
grade = 8;
} else if (modResult == 9) {
grade = 9;
} else if (modResult == 10) {
grade = 10;
} else if (modResult == 11) {
grade = 11;
} else if (modResult == 12) {
grade = 12;
} else if (modResult == 0) {
grade = 13;
} } return grade;
}

g.根据牌的id获得牌图片的名字

/**
* 根据牌的id获得牌图片的名字
*
* @param id
* 牌的id
* @return 图片的名字
*/
public static String getImageName(int id) {
// 得到图片的前一个字符,表示是第几个牌
String imageName = ""; if (id == 53) {
imageName += "smallJoker";
} else if (id == 54) {
imageName += "bigJoker";
} else {
int mod = id % 13;
String firstLetter = "";
switch (mod) {
case 0:
firstLetter = "K";
break;
case 1:
firstLetter = "A";
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
firstLetter = "" + mod;
break;
case 11:
firstLetter = "J";
break;
case 12:
firstLetter = "Q";
break;
default:
break;
} String secondLetter = "";
// 得到图片的后一个字符,表示什么颜色的牌
if (id >= 1 && id <= 13) {
secondLetter = "0";
} else if (id >= 14 && id <= 26) {
secondLetter = "1";
} else if (id >= 27 && id <= 39) {
secondLetter = "2";
} else if (id >= 40 && id <= 52) {
secondLetter = "3";
} imageName = firstLetter + secondLetter;
}
String extension = ".gif"; return imageName + extension;
}

下一篇将介绍 斗地主出牌规则算法的设计和实现

不出意外,本周末10月13号将上传源码到CSDN下载资源。

刚刚看了下日历,10月12号 星期六,仍然要上班,果然是史上最复杂的国庆放假啊。

相关阅读

斗地主算法的设计与实现

面向对象实现斗地主程序的核心算法,包括洗牌、发牌、判断牌型、比较牌的大小、游戏规则等。

原文参见:http://FansUnion.cn/articles/2712

斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌的更多相关文章

  1. 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌

    本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 斗地 ...

  2. [置顶] 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌

    大学期间,我在别人的基础上,写了一个简易的斗地主程序. 主要实现了面向对象设计,洗牌.发牌.判断牌型.比较牌的大小.游戏规则等算法. 通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算 ...

  3. Java实验项目四——多线程矩阵相乘算法的设计

    Program:多线程矩阵相乘算法的设计 Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响, 所以不用使用锁,代码如下: thread.OperateMatrix类,实现矩阵 ...

  4. 【斗地主技巧】斗地主算法逻辑中的天之道<转>

    ******************************************************************** 作者比较喜欢玩斗地主,所以经常搜集一些网友斗地主的心得,下面这 ...

  5. 基于mindwave脑电波进行疲劳检测算法的设计(5)

    时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...

  6. 6个P2P流媒体开源项目介绍

    P2P流媒体开源项目介绍  1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据 ...

  7. P2P流媒体开源项目介绍

    P2P流媒体开源项目介绍1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据.节 ...

  8. LVS项目介绍

    LVS项目介绍 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 3 月 本文介绍了Linux服务器集群系统--LVS(Linux Virtual Serve ...

  9. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

随机推荐

  1. NYOJ 737 石子合并(一)

    题意 排成一排的石子,每次合并相邻两堆并由一定的代价,求合并成一堆的最小代价 解法 区间dp 枚举长度 dp[i,j]表示合并石子堆编号从i到j为一堆所需的最小代价(这个题目的代价是sum(i..j) ...

  2. CF1027F Session in BSU (并查集+树上构造)

    题目大意:你可以在第$ai$天或者第$bi$天进行第$i$场考试,每天最多进行一场考试,求把所有考试都考完的最早结束时间 由于天数可能很大,需要离散 把问题抽象成一棵树,每个点最多被"分配& ...

  3. 多个 WindowsFormsHost 叠加顺序调整

    原文:多个 WindowsFormsHost 叠加顺序调整 工作中遇到多个 WindowsFormsHost 包装的控件叠加顺序的调整问题,用了 BingToFront 和 BringToBack,不 ...

  4. mybatis中sql标签和include标签

    1.首先定义一个sql标签,一定要定义唯一id.(name,age是要查询的字段) <sql id="Base_Column_List" >name,age</s ...

  5. java缓冲区BufferedReader

    1.java缓冲区BufferedReader拷贝文件 2.代码如下: package Demo1; import java.io.*; public class BufferedTest { pub ...

  6. HDU 3073 Saving Beans

    Saving Beans Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  7. freemark实现遍历 list,每行三个

    我的做法是先做一个模板,这三个只都是从list里取出来的 在后台将每三个值放到一个map里 List<Map<String, Object>> newsList=new Arr ...

  8. 非典型的scala程序及其编译后的结果

    初学Scala Folder structure以及部分代码 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2xldmVyd3lx/font/5a6L5L ...

  9. OC的动态继承编译机制

    [问]为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却能够. [再问]为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却能够. [答]由于OC的动态继承编 ...

  10. 弹性ScrollView,和下啦刷新的效果相似 实现下拉弹回和上拉弹回

    今天做了一个弹性ScrollView,和下啦刷新的效果类似,我想这个非常多需求都用的这样的效果 事实上这是一个自己定义的scrollView,上代码.这是我写在一个公共的组件包里的 package c ...