文档章节

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

FansUnion
 FansUnion
发布于 2015/05/03 01:26
字数 1179
阅读 28
收藏 0

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

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

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

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

项目截图

定义一张牌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

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
Java写的斗地主游戏源码

源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序。 一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方...

付翔
2015/11/04
0
0
斗地主AI算法——第一章の业务逻辑

转眼间快到了五月,帝都的天气也变的非常梦幻。 时而酷暑炎热,时而狂风席卷。 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华。 世界是寂寞的,寂寞到不只是...

sm9sun
2017/04/26
0
0
来呀!AI喊你斗地主——首个搞定斗地主的深度神经网络

参加 2018 AI开发者大会,请点击 ↑↑↑ 作者 | Anonymous authors 译者 | 蔡志兴 编辑 | Jane 出品 | AI科技大本营 【导读】近年来,从围棋到 Dota 团战赛,深度神经网络应用在各种游戏竞赛...

AI科技大本营
2018/10/19
0
0
从零到一,撸一个在线斗地主(上篇)

原文:从零到一,撸一个在线斗地主(上篇) | AlloyTeam 作者:TAT.vorshen 背景:朋友来深圳玩,若说到在深圳有什么好玩的,那当然是宅在家里斗地主了!可是天算不如人算,扑克牌丢了几张不全...

腾讯AlloyTeam
07/30
0
0
斗地主算法-2

在拆牌的时候,需要算出手牌中哪些牌是重复的,这样才能找出单牌、对牌、三张、四张。 不分花色,从牌3-K,定义牌值为3-15,小王是16,大王是17 如表: 牌面: 3 4 5 6 7 8 9 10 J Q K A 2 大...

安世博
2016/06/15
180
0

没有更多内容

加载失败,请刷新页面

加载更多

Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
4
0
Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
今天
10
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
9
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
4
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部