大学期间,我在别人的基础上,写了一个简易的斗地主程序。
主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。
通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。
最近把这些设计和算法分享给大家,过些天会上传斗地主程序的源码。
项目截图
定义一张牌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
分享到:
相关推荐
斗地主项目的主要实现了,斗地主中的洗牌、发牌、判断牌型、排序等一系列算法,但这并不是一个完整的项目。 界面操作部分,功能很有限,仅供参考,有兴趣的同学自行完善。 我的CSDN博客还有很多优质原创文章,有...
斗地主算法类 适合初学者. 可以实现斗地主的洗牌发牌 无JFrame 简单易懂.
JAVA项目-斗地主游戏 人工智能(图形界面&&纸牌库+源文件)
本算法采用Java语言编写,是网页FLASH版斗地主客户端的核心程序!
Java斗地主发牌课程设计--附源码
lua实现斗地主中的牌型判断,牌的比较,出牌提示的算法
java斗地主的算法实现,实现了输出一幅新牌,发牌、和叫地主的功能算法
本算法用C#编写,根据斗地主出牌规则.对玩家出的牌进行检验.判断是否符合出牌规则。
斗地主残局算法python,输入地主与农名的牌。自动计算地主出牌
Lua脚本的斗地主的提示出牌算法。 包括: 查找某牌型的算法:查找所有的单牌,查找所有的对子,查找所有的三条,查找所有的单顺,双顺,飞机,飞机带单,飞机带双。 排序算法。 转成花色,转成点数, 比较算法等。
斗地主AI拆牌核心逻辑源码,TS版本,后续更新出牌逻辑,主要算法按手数然后权重对比每组牌型优劣,选出手数最少或者权重最大的牌型,可以调用testMain测试。
C#控制台模拟QQ斗地主不洗牌玩法生成牌,同时提供普通随机算法生成牌。并对两种算法产生炸弹的效率进行了分析。对该类算法有兴趣的同学欢迎下载学习。
本站之前介绍过一个单机斗地主项目源码,在本站搜索斗地主就可以找到,那个项目算法正常不过ui很一般,本项目也是一个安卓斗地主项目源码本项目的UI很漂亮,但是游戏的算法有问题,如果把之前那个斗地主的算法拿过来...
基于Unity3D的多人网络斗地主游戏的设计与实现.pdf
用线性表实现斗地主发牌程序,本人水平低劣,可供数据结构初学者参考,如有错误可留言指出
671587853603988day2-资料-阶段项目(综合练习&斗地主游戏).rar
本算法采用ActionScript3.0动态脚本语言编写,是网页FLASH版斗地主客户端的核心程序!
斗地主算法完整版,包含二人三人四人玩法天地癞子玩法,如有修改意见,一起学习交流进步
基于安卓的斗地主游戏课程设计论文--大学毕业设计论文.doc
12 4.2.2 基于C/S模式的客户端设计流程图 12 4.3 游戏逻辑程序结构 13 4.3.1 数据层 13 4.3.2 控制层 13 4.3.3 显示层 14 4.4 游戏设计流程图 14 4.5 数学建模 15 第5章 详细设计与系统实现 16 5.1 斗地主洗牌算法 ...