斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌
大学期间,我在别人的基础上,写了一个简易的斗地主程序。
主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。
通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。
最近把这些设计和算法分享给大家,过些天会上传斗地主程序的源码。
项目截图
定义一张牌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 网站日志分析项目案例 ...
随机推荐
- "啃下"插入排序
插入排序法基本原理 插入排序法较冒泡排序法和选择排序法更贴近生活,应该来说理解起来更快.如果你现在能够得到一副麻将,请把里面的“一万”到“六万”拿出来,打乱顺序,再重新排好,就像打麻将开始那样.是否需 ...
- freeswitch 一些坑
1.You must install libopus-dev to build mod_opus. Stop. 确实已经安装libopus-dev后 将文件 usr/local/src/mod/cod ...
- db2 -- 存储过程01
接下来项目在技能可能偏向数据库方面,补习下. 学习写第一个db2在存储过程,记录下. ---- stored procedures code CREATE OR REPLACE PROCEDURE & ...
- Linux下MySql数据库常用操作
1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...
- 【转】工具系列:IntelliJ IDEA (Mac) 运行速度优化
转自工具系列:IntelliJ IDEA (Mac) 运行速度优化 感谢该作者解决了我使用idea debug很慢的问题 背景 IDEA 下运行程序,经常假死 5 s,作为 Mac 怎么能允许暂停 5 ...
- [using_microsoft_infopath_2010]Chapter6 发布提交表单数据
本章概要: 1.使用正确的方法发布表单 2.发布表单画库到SharePoint 3.在发布和保存表单之间做出选择 4.理解不同发布表单方式之间的区别
- composer是什么
composer是什么 Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 &q ...
- linux 下的两种软件安装方式 —— 源码(编译、安装),编译好的二进制(直接安装)
我们以 GPG(加密工具)为例来说明两种安装方式的区别: 源码(Source code releases,名称中则会含有src等说明信息,tarball:source),先编译再安装 GPU 的源码地 ...
- ORACLE RAC如何增加节点
ORACLE RAC系统是一个可以横向进行扩展的系统,当一个RAC系统计算能力不满足客户的需求时候,增加节点能够快速增加整个系统的计算能力,使得客户系统计算能力得到一定的提升,以满足客户不断增长的计算 ...
- CDN(Content Distribution Network)概念
CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节 ...