斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌
大学期间,我在别人的基础上,写了一个简易的斗地主程序。
主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。
通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。
最近把这些设计和算法分享给大家,过些天会上传斗地主程序的源码。
项目截图
定义一张牌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
斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌的更多相关文章
- 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 斗地 ...
- [置顶] 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
大学期间,我在别人的基础上,写了一个简易的斗地主程序. 主要实现了面向对象设计,洗牌.发牌.判断牌型.比较牌的大小.游戏规则等算法. 通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算 ...
- Java实验项目四——多线程矩阵相乘算法的设计
Program:多线程矩阵相乘算法的设计 Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响, 所以不用使用锁,代码如下: thread.OperateMatrix类,实现矩阵 ...
- 【斗地主技巧】斗地主算法逻辑中的天之道<转>
******************************************************************** 作者比较喜欢玩斗地主,所以经常搜集一些网友斗地主的心得,下面这 ...
- 基于mindwave脑电波进行疲劳检测算法的设计(5)
时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...
- 6个P2P流媒体开源项目介绍
P2P流媒体开源项目介绍 1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据 ...
- P2P流媒体开源项目介绍
P2P流媒体开源项目介绍1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据.节 ...
- LVS项目介绍
LVS项目介绍 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 3 月 本文介绍了Linux服务器集群系统--LVS(Linux Virtual Serve ...
- Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...
随机推荐
- 使用highcharts动态绘制折线图——so easy
之前学习highcharts发现网上的教程大部分是对highcharts数据的注释,如何动态绘制数据大部分一笔带过,让那些初涉开发的小白云里雾里,所以我就写了一篇这样的博客. <html> ...
- Linux 操作系统启动流程
1.加载bios bios中包含的硬件CPU 内存 硬盘等相关信息 2.读取MBR 读取完bios信息之后,计算机会查找bios制定的硬盘MBR引导扇区,将其内容复制到 0x7c00 地址所在的物理内 ...
- [剑指offer] 8+9. 跳台阶+变态跳台阶 (递归 时间复杂度)
跳台阶是斐波那契数列的一个典型应用,其思路如下: # -*- coding:utf-8 -*- class Solution: def __init__(self): self.value=[0]*5 ...
- java实现支付宝电脑支付(servlet版本)
前期准备: 蚂蚁金融开放平台 进行登录操作 进入我的开放平台 在上方找到沙箱,进入沙箱(网络编程虚拟执行环境). 这里的RSA2密钥设置下,我已经设置好了,所以便有了支付宝公钥(公钥是对外公开的,私钥 ...
- keil5下载程序时出现“internal command error”解决方法
今天下载的时候,插入下载器,查看Debug可用看到“internal command error”,一直找不到原因,后来查看上一个工程才发现,上一个程序禁用了Seral Wire 引脚,导致的. 解决 ...
- ZJU 2671 Cryptography
Cryptography Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
- mysql5.7官网直译SQL语句优化--分组优化
1.14Group By Optimization 分组优化 大多数方法为了满足分组查询需要扫描整个表并且创建一个临时表,其中每组中的值都是连续的,如果可以使用聚合函数和临时表获取各个分组.在某些情况 ...
- [React] Unit test a React Render Prop component
In this lesson, I use Enzyme and Jest to unit test a Counter Render Prop component. Writing integrat ...
- [Angular] Send Data via HTTP using Angular HttpParams
Obviously in a real world application we do not only fetch data from the backend, but we also send d ...
- Pocket英语语法---四、should的同义词是谁
Pocket英语语法---四.should的同义词是谁 一.总结 一句话总结:should表示劝告,建议,命令,其同义词是ought to,should强调主观看法,ought to强调客观要求.在疑 ...