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

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

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

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

项目截图

定义一张牌Card

a.一张牌的类型

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

b.一张牌Card的属性

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

c.构造一张牌

  1. // 通过牌的整型id构造一张牌
  2. public Card(int id) {
  3. this.id = id;
  4. bigType = CardUtil.getBigType(id);
  5. smallType = CardUtil.getSmallType(id);
  6. grade = CardUtil.getGrade(id);
  7. imageName = CardUtil.getImageName(id);
  8. Icon icon = DdzUtil.getImageIcon(imageName);
  9. setIcon(icon);
  10. }

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

  1. /**
  2. * 根据牌的id获得一张牌的大类型:方块,梅花,红桃,黑桃,小王,大王
  3. *
  4. * @param id
  5. * 牌的id
  6. *
  7. * @return 牌的大类型:方块,梅花,红桃,黑桃,小王,大王
  8. */
  9. public static CardBigType getBigType(int id) {
  10. CardBigType bigType = null;
  11. if (id >= 1 && id <= 13) {
  12. bigType = CardBigType.FANG_KUAI;
  13. } else if (id >= 14 && id <= 26) {
  14. bigType = CardBigType.MEI_HUA;
  15. } else if (id >= 27 && id <= 39) {
  16. bigType = CardBigType.HONG_TAO;
  17. } else if (id >= 40 && id <= 52) {
  18. bigType = CardBigType.HEI_TAO;
  19. } else if (id == 53) {
  20. bigType = CardBigType.XIAO_WANG;
  21. } else if (id == 54) {
  22. bigType = CardBigType.DA_WANG;
  23. }
  24. return bigType;
  25. }

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

  1. /**
  2. * 根据牌的id,获取牌的小类型:2_10,A,J,Q,K
  3. *
  4. * @param id
  5. * 牌的id
  6. *
  7. * @return 牌的小类型:2_10,A,J,Q,K
  8. */
  9. public static CardSmallType getSmallType(int id) {
  10. if (id < 1 || id > 54) {
  11. throw new RuntimeException("牌的数字不合法");
  12. }
  13.  
  14. CardSmallType smallType = null;
  15.  
  16. if (id >= 1 && id <= 52) {
  17. smallType = numToType(id % 13);
  18. } else if (id == 53) {
  19. smallType = CardSmallType.XIAO_WANG;
  20. } else if (id == 54) {
  21. smallType = CardSmallType.DA_WANG;
  22. } else {
  23. smallType = null;
  24. }
  25. return smallType;
  26. }
  27.  
  28. /**
  29. * 将阿拉伯数字0到12转换成对应的小牌型,被getSmallType方法调用
  30. *
  31. * @param num
  32. * 数字(0到12)
  33. * @return 牌的小类型
  34. */
  35. private static CardSmallType numToType(int num) {
  36. CardSmallType type = null;
  37. switch (num) {
  38. case 0:
  39. type = CardSmallType.K;
  40. break;
  41. case 1:
  42. type = CardSmallType.A;
  43. break;
  44. case 2:
  45. type = CardSmallType.ER;
  46. break;
  47. case 3:
  48. type = CardSmallType.SAN;
  49. break;
  50. case 4:
  51. type = CardSmallType.SI;
  52. break;
  53. case 5:
  54. type = CardSmallType.WU;
  55. break;
  56. case 6:
  57. type = CardSmallType.LIU;
  58. break;
  59. case 7:
  60. type = CardSmallType.QI;
  61. break;
  62. case 8:
  63. type = CardSmallType.BA;
  64. break;
  65. case 9:
  66. type = CardSmallType.JIU;
  67. break;
  68. case 10:
  69. type = CardSmallType.SHI;
  70. break;
  71. case 11:
  72. type = CardSmallType.J;
  73. break;
  74. case 12:
  75. type = CardSmallType.Q;
  76. break;
  77.  
  78. }
  79. return type;
  80. }

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

  1. /**
  2. * 根据牌的id,获得一张牌的等级
  3. *
  4. * @param id
  5. * 牌的id
  6. * @return 与牌数字对应的等级
  7. */
  8. public static int getGrade(int id) {
  9.  
  10. if (id < 1 || id > 54) {
  11. throw new RuntimeException("牌的数字不合法");
  12. }
  13.  
  14. int grade = 0;
  15.  
  16. // 2个王必须放在前边判断
  17. if (id == 53) {
  18. grade = 16;
  19. } else if (id == 54) {
  20. grade = 17;
  21. }
  22.  
  23. else {
  24. int modResult = id % 13;
  25.  
  26. if (modResult == 1) {
  27. grade = 14;
  28. } else if (modResult == 2) {
  29. grade = 15;
  30. } else if (modResult == 3) {
  31. grade = 3;
  32. } else if (modResult == 4) {
  33. grade = 4;
  34. } else if (modResult == 5) {
  35. grade = 5;
  36. } else if (modResult == 6) {
  37. grade = 6;
  38. } else if (modResult == 7) {
  39. grade = 7;
  40. } else if (modResult == 8) {
  41. grade = 8;
  42. } else if (modResult == 9) {
  43. grade = 9;
  44. } else if (modResult == 10) {
  45. grade = 10;
  46. } else if (modResult == 11) {
  47. grade = 11;
  48. } else if (modResult == 12) {
  49. grade = 12;
  50. } else if (modResult == 0) {
  51. grade = 13;
  52. }
  53.  
  54. }
  55.  
  56. return grade;
  57. }

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

  1. /**
  2. * 根据牌的id获得牌图片的名字
  3. *
  4. * @param id
  5. * 牌的id
  6. * @return 图片的名字
  7. */
  8. public static String getImageName(int id) {
  9. // 得到图片的前一个字符,表示是第几个牌
  10. String imageName = "";
  11.  
  12. if (id == 53) {
  13. imageName += "smallJoker";
  14. } else if (id == 54) {
  15. imageName += "bigJoker";
  16. } else {
  17. int mod = id % 13;
  18. String firstLetter = "";
  19. switch (mod) {
  20. case 0:
  21. firstLetter = "K";
  22. break;
  23. case 1:
  24. firstLetter = "A";
  25. break;
  26. case 2:
  27. case 3:
  28. case 4:
  29. case 5:
  30. case 6:
  31. case 7:
  32. case 8:
  33. case 9:
  34. case 10:
  35. firstLetter = "" + mod;
  36. break;
  37. case 11:
  38. firstLetter = "J";
  39. break;
  40. case 12:
  41. firstLetter = "Q";
  42. break;
  43. default:
  44. break;
  45. }
  46.  
  47. String secondLetter = "";
  48. // 得到图片的后一个字符,表示什么颜色的牌
  49. if (id >= 1 && id <= 13) {
  50. secondLetter = "0";
  51. } else if (id >= 14 && id <= 26) {
  52. secondLetter = "1";
  53. } else if (id >= 27 && id <= 39) {
  54. secondLetter = "2";
  55. } else if (id >= 40 && id <= 52) {
  56. secondLetter = "3";
  57. }
  58.  
  59. imageName = firstLetter + secondLetter;
  60. }
  61. String extension = ".gif";
  62.  
  63. return imageName + extension;
  64. }

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

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

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

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

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

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

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

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

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

  3. [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录

    开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...

  4. [置顶] vb报表的设计

    敲机房收费系统,最难的部分应该就是关于报表的部分了.相对于学生信息管理系统,报表是新内容,在vb中添加报表需要添加第三方控件,首先我们要下载水晶报表,下面就向大家展示一下我设计报表的步骤(我用的新版本 ...

  5. [置顶] ID3算法的python实现

    这篇文章的内容接着http://blog.csdn.net/xueyunf/article/details/9214727的内容,所有还有部分函数在http://blog.csdn.net/xueyu ...

  6. MySQL 上移/下移/置顶

    在编写网站系统时,难免会用到上移.下移.置顶的功能,今天小编就介绍一下我的思路. 首先,需要一张数据表: CREATE TABLE `a` ( `id` ) NOT NULL AUTO_INCREME ...

  7. [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)

     转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...

  8. (转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶

    原文链接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目标是通过使用SIFT和RANSAC算法, ...

  9. 【搬运工】NOIP吧置顶贴

    目的是存置顶贴里的链接.. 原帖:http://tieba.baidu.com/p/1753284199 资源站:*C++资源:http://tieba.baidu.com/p/1239792581* ...

随机推荐

  1. C# - 接口,继承

    接口 接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合.不能像实例化一个类那样实例化接口.接口不能包含实现其成员的任何代码,而只能定义成员本身.实现过程必须在实现接口的类中完成. ...

  2. C# - ref & out

    引用参数和值参数 值参数,是在函数中此变量的任何修改都不影响函数调用中指定的参数,除非把它当作返回值返回,经典例子,交换两个数,但是返回值只有一个. 此时可以用引用参数,函数处理的变量和函数调用中使用 ...

  3. css 多行显示省略号....

    CSS属性如下: white-space: nowrap; overflow: hidden; text-overflow: ellipsis;

  4. java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)(ERR=12505)(ERR

    dbc 链接orcal出错 java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)( ...

  5. BZOJ 3971 Матрёшка 解题报告

    很自然想到区间 DP. 设 $Dp[i][j]$ 表示把区间 $[i, j]$ 内的套娃合并成一个所需要的代价,那么有: $Dp[i][i] = 0$ $Dp[i][j] = min\{Dp[i][k ...

  6. 如何使用 Java8 实现观察者模式?(上)

    [编者按]本文作者是 BAE 系统公司的软件工程师 Justin Albano.在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式.专业化及其命名规则,供大 ...

  7. Macbook配置adb环境

    配置adb命令 http://stackoverflow.com/questions/5526470/trying-to-add-adb-to-path-variable-osx http://sta ...

  8. 【原创翻译】Reducing Branch Delay to Zero in Pipelined Processors

    在流水线处理器中减少分支延迟到零 Antonio M. Gonzalez and Jose M. Llaberia 摘要 一种减少流水处理器中分支延迟到零的机制将在本文被描述以及评估.这种机制基于多重 ...

  9. CH Round #17 舞动的夜晚

    舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...

  10. 转自 z55250825 的几篇关于FFT的博文(一)

        关于FFT,咱们都会迫不及待地 @  .....(大雾)(貌似被玩坏了...)    .....0.0学习FFT前先orz FFT君.         首先先是更详细的链接(手写版题解点赞0v ...