Java 小游戏:扎金花

当所有人都拿到3张牌之后,需要比较所有人的牌的大小,这时分为下面几步完成   1) 将一手牌按从大到小的顺序重新排列并计算出当前一手牌的牌型。   2)比较所有参与人的牌,先比较牌型,如果牌型相同再比较点数和花色。
1)先完成一手牌的排列和计算牌型 Yarborough.java

package com.entity;

import com.utils.CardUtils;

/**

* 一手牌

* @author Administrator

*

*/

public class Yarborough{

/**

* 点数最大的牌

*/

private PlayCard first;

/**

* 点数最二的牌

*/

private PlayCard second;

/**

* 点数最三的牌

*/

private PlayCard three;

/**

* 牌型名称

*/

private String typeName;

/**

* 牌型值

*/

private int typeValue;

private PlayCard preCard;

private PlayCard currCard;

private PlayCard nextCard;

public Yarborough(PlayCard first) {

super();

this.first = first;

}

public Yarborough(PlayCard first, PlayCard second, PlayCard three) {

this.first=first;

this.second=second;

this.three=three;

}

/**

* 重置一手牌从大到小排列

*/

public void resetPlayCard(){

CardUtils utils=new CardUtils();

//排序对象(从小到大)

PlayCard[] cards={first,second,three};

utils.sortPlayCard(cards);

//设置一手牌

this.first = cards[2];

this.second = cards[1];

this.three = cards[0];

//计算牌型

utils.calculatePlateType(this);

}

public PlayCard getFirst() {

return first;

}

public void setFirst(PlayCard first) {

this.first = first;

}

public PlayCard getSecond() {

return second;

}

public void setSecond(PlayCard second) {

this.second = second;

}

public PlayCard getThree() {

return three;

}

public void setThree(PlayCard three) {

this.three = three;

}

public String getTypeName() {

return typeName;

}

public void setTypeName(String typeName) {

this.typeName = typeName;

}

public int getTypeValue() {

return typeValue;

}

public void setTypeValue(int typeValue) {

this.typeValue = typeValue;

}

}

CardUtils.java添加如下代码:

/**

* 排序一手牌 从小到大

* @param careArray 一手牌集合

*/

public void sortPlayCard(PlayCard[] careArray){

if(careArray!=null && careArray.length>0){

//冒泡排序

for(int i=0;i<careArray.length;i++){

for(int j=i+1;j<careArray.length;j++){

PlayCard tmp=null;

//获取点数在数组下标的索引值

int index1=getIndexByArray(careArray[i].getNumber(), DefineUtils.NUM_ARRAY);

int index2=getIndexByArray(careArray[j].getNumber(), DefineUtils.NUM_ARRAY);

//判断点数的大小

if(index1>index2){

tmp=careArray[i];

careArray[i]=careArray[j];

careArray[j]=tmp;

}else if(index1==index2){//如果点数相同时需要判断花色

//获取颜色在数组下标的索引值

int index3=getIndexByArray(careArray[i].getColor(), DefineUtils.COLOR_ARRAY);

int index4=getIndexByArray(careArray[j].getColor(), DefineUtils.COLOR_ARRAY);

if(index3>index4){

tmp=careArray[i];

careArray[i]=careArray[j];

careArray[j]=tmp;

}

}

}

}

}

}

/**

* 获取值在数组中的下标值

* @param value

* @param arrays

* @return

*/

public int getIndexByArray(String value,String[] arrays){

if(arrays!=null && arrays.length>0){

for(int i=0;i<arrays.length;i++){

if(arrays[i].equals(value)){

return i;

}

}

}

return -1;

}

/**

* 计算牌型

* "单张(0)","对子(1)","顺子(2)","金花(3)","顺金(4)","豹子(5)","特殊(6)"

* @param yar

* @return

*/

public void calculatePlateType(Yarborough yar){

if(yar!=null){

PlayCard firstCard=yar.getFirst();

PlayCard secondCard=yar.getSecond();

PlayCard threeCard=yar.getThree();

//条件判断这里需要计算出当前这手牌属于哪种牌型

if(firstCard.getNumber().equals(secondCard.getNumber())

&& firstCard.getNumber().equals(threeCard.getNumber())){//豹子:点数相同

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[5]);

yar.setTypeValue(5);

}else if(firstCard.getColor().equals(secondCard.getColor())

&& firstCard.getColor().equals(threeCard.getColor())){//花色相同

//这里需要判断是否为顺子

if(isStraight(yar)){//顺金

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[4]);

yar.setTypeValue(4);

}else{//金花

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[3]);

yar.setTypeValue(3);

}

}else if(isStraight(yar)){//花色不相同的牌顺子

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[2]);

yar.setTypeValue(2);

}else if(firstCard.getNumber().equals(secondCard.getNumber())

|| firstCard.getNumber().equals(threeCard.getNumber())

|| secondCard.getNumber().equals(threeCard.getNumber())){//对子:两张同样大小的牌

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[1]);

yar.setTypeValue(1);

}else if(

("5".equals(firstCard.getNumber())

&& "3".equals(secondCard.getNumber())

&& "2".equals(threeCard.getNumber())

)

&&(

!firstCard.getColor().equals(secondCard.getColor())

&& !firstCard.getColor().equals(threeCard.getColor())

&& !secondCard.getColor().equals(threeCard.getColor())

)

){//特殊

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[6]);

yar.setTypeValue(6);

}else{//单张

yar.setTypeName(DefineUtils.DEF_TYPE_NAME[0]);

yar.setTypeValue(0);

}

}

}

/**

* 判断点数是否为顺子

* @param yar

* @return

*/

private boolean isStraight(Yarborough yar){

int index1=getIndexByArray(yar.getFirst().getNumber(), DefineUtils.NUM_ARRAY);

int index2=getIndexByArray(yar.getSecond().getNumber(), DefineUtils.NUM_ARRAY);

int index3=getIndexByArray(yar.getThree().getNumber(), DefineUtils.NUM_ARRAY);

if(index1-1==index2 && index2-1==index3){

return true;

}

return false;

}

测试类:Test5.java

package com.test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import com.entity.PlayCard;

import com.entity.Yarborough;

import com.utils.CardUtils;

public class Test5 {

/**

* 显示所有人的牌

* @param rsList

*/

public static void disp(List<Yarborough> rsList){

System.out.println(rsList.size()+"个人的牌:");

for(int i=0;i<rsList.size();i++){

System.out.println("第"+(i+1)+"个人的牌:");

Yarborough y=rsList.get(i);

System.out.print("第一张牌:"+(y.getFirst().getNumber())+"["+y.getFirst().getColor()+"] ");

if(y.getSecond()!=null){

System.out.print("第二张牌:"+(y.getSecond().getNumber())+"["+y.getSecond().getColor()+"] ");

}

if(y.getThree()!=null){

System.out.print("第三张牌:"+(y.getThree().getNumber())+"["+y.getThree().getColor()+"] ");

}

if(y.getTypeName()!=null){

System.out.print(",牌型:"+y.getTypeName());

}

System.out.println();

}

}

/**

* 显示一手牌

* @param y

*/

public static void dispYarborough(Yarborough y,int rotaion){

switch(rotaion){

case 1:

System.out.print("第一张牌:"+(y.getFirst().getNumber())+"["+y.getFirst().getColor()+"] ");

break;

case 2:

System.out.print("第二张牌:"+(y.getSecond().getNumber())+"["+y.getSecond().getColor()+"] ");

break;

case 3:

System.out.print("第三张牌:"+(y.getThree().getNumber())+"["+y.getThree().getColor()+"] ");

break;

}

System.out.println();

}

/**

* 显示当前将要取出的最新的牌

* @param list

*/

public static void dispNewCard(List<PlayCard> list){

PlayCard card=null;

if(list!=null && list.size()>0){

card=list.get(list.size()-1);

System.out.println("---------当前最新的牌为:"+card.getNumber()+"["+card.getColor()+"]");

}

}

public static void main(String[] args) {

CardUtils utils=new CardUtils();

List<PlayCard> list=utils.generatorAllCard();//获取随机生成的所有牌

int rs=10;//总人数

List<Yarborough> rsList=new ArrayList<Yarborough>();//保存所有人的发牌

int maxIndex=0;

/*

* 现实中都是依次发牌,那么怎么样才能实现依次发牌的功能呢?

* 每个人最终都要拿到三张牌,所以要循环三次给10个人依次发牌

*/

for(int i=1;i<=3;i++){//三张牌

int count=0;

//那如何下一轮牌要从最大牌面的人开始发,上面的发牌功能应该怎么改?

//改进功能:第一轮从第一个人开始发牌;第二轮和第三轮以当前轮牌面最大的人开始发牌

System.out.println("---------从第"+(maxIndex+1)+"个人开始发牌");

dispNewCard(list);//显示第maxIndex将会拿到的牌或者说是本轮第一个人将会获取的牌

while(true){

switch(i){

case 1:

rsList.add(new Yarborough(utils.popPlayCardByLast(list)));//第一张牌

break;

case 2:

Yarborough y2=rsList.get(maxIndex);

y2.setSecond(utils.popPlayCardByLast(list));//第二张牌

break;

case 3:

Yarborough y3=rsList.get(maxIndex);

y3.setThree(utils.popPlayCardByLast(list));//第三张牌

break;

}

count++;

maxIndex++;

if(maxIndex>=rs) maxIndex=0;

if(count>=rs){

count=0;

break;

}

}

disp(rsList);

//发完一轮牌之后这里需要比较本轮所发的牌谁的牌面最大,最大的可以叫注,那这个功能要如何实现

maxIndex=utils.getMaxCardByRotation(rsList, i);

System.out.println("===========第"+i+"轮最大的牌是第"+(maxIndex+1)+"个人的牌:");

System.out.print("===========");

dispYarborough(rsList.get(maxIndex),i);

System.out.println();

}

//所有人都拿到所有牌之后这里需要比较所有人的牌型

//1、将所有人的一手牌按从大到小的顺序排列

utils.resetPlayCard(rsList);

disp(rsList);

}

}

测试结果:

---------从第1个人开始发牌

---------当前最新的牌为:Q[梅花]

10个人的牌:

第1个人的牌:

第一张牌:Q[梅花]

第2个人的牌:

第一张牌:7[方片]

第3个人的牌:

第一张牌:6[红桃]

第4个人的牌:

第一张牌:3[红桃]

第5个人的牌:

第一张牌:8[梅花]

第6个人的牌:

第一张牌:7[梅花]

第7个人的牌:

第一张牌:5[梅花]

第8个人的牌:

第一张牌:5[方片]

第9个人的牌:

第一张牌:6[黑桃]

第10个人的牌:

第一张牌:K[方片]

===========第1轮最大的牌是第1个人的牌:

===========第一张牌:Q[梅花]

---------从第1个人开始发牌

---------当前最新的牌为:K[红桃]

10个人的牌:

第1个人的牌:

第一张牌:Q[梅花] 第二张牌:K[红桃]

第2个人的牌:

第一张牌:7[方片] 第二张牌:8[红桃]

第3个人的牌:

第一张牌:6[红桃] 第二张牌:A[方片]

第4个人的牌:

第一张牌:3[红桃] 第二张牌:J[红桃]

第5个人的牌:

第一张牌:8[梅花] 第二张牌:9[红桃]

第6个人的牌:

第一张牌:7[梅花] 第二张牌:J[梅花]

第7个人的牌:

第一张牌:5[梅花] 第二张牌:9[方片]

第8个人的牌:

第一张牌:5[方片] 第二张牌:2[梅花]

第9个人的牌:

第一张牌:6[黑桃] 第二张牌:J[黑桃]

第10个人的牌:

第一张牌:K[方片] 第二张牌:Q[红桃]

===========第2轮最大的牌是第3个人的牌:

===========第二张牌:A[方片]

---------从第3个人开始发牌

---------当前最新的牌为:7[红桃]

10个人的牌:

第1个人的牌:

第一张牌:Q[梅花] 第二张牌:K[红桃] 第三张牌:4[红桃]

第2个人的牌:

第一张牌:7[方片] 第二张牌:8[红桃] 第三张牌:10[梅花]

第3个人的牌:

第一张牌:6[红桃] 第二张牌:A[方片] 第三张牌:7[红桃]

第4个人的牌:

第一张牌:3[红桃] 第二张牌:J[红桃] 第三张牌:Q[黑桃]

第5个人的牌:

第一张牌:8[梅花] 第二张牌:9[红桃] 第三张牌:2[方片]

第6个人的牌:

第一张牌:7[梅花] 第二张牌:J[梅花] 第三张牌:Q[方片]

第7个人的牌:

第一张牌:5[梅花] 第二张牌:9[方片] 第三张牌:9[黑桃]

第8个人的牌:

第一张牌:5[方片] 第二张牌:2[梅花] 第三张牌:K[黑桃]

第9个人的牌:

第一张牌:6[黑桃] 第二张牌:J[黑桃] 第三张牌:5[红桃]

第10个人的牌:

第一张牌:K[方片] 第二张牌:Q[红桃] 第三张牌:9[梅花]

===========第3轮最大的牌是第8个人的牌:

===========第三张牌:K[黑桃]

10个人的牌:

第1个人的牌:

第一张牌:K[红桃] 第二张牌:Q[梅花] 第三张牌:4[红桃] ,牌型:单张

第2个人的牌:

第一张牌:10[梅花] 第二张牌:8[红桃] 第三张牌:7[方片] ,牌型:单张

第3个人的牌:

第一张牌:A[方片] 第二张牌:7[红桃] 第三张牌:6[红桃] ,牌型:单张

第4个人的牌:

第一张牌:Q[黑桃] 第二张牌:J[红桃] 第三张牌:3[红桃] ,牌型:单张

第5个人的牌:

第一张牌:9[红桃] 第二张牌:8[梅花] 第三张牌:2[方片] ,牌型:单张

第6个人的牌:

第一张牌:Q[方片] 第二张牌:J[梅花] 第三张牌:7[梅花] ,牌型:单张

第7个人的牌:

第一张牌:9[黑桃] 第二张牌:9[方片] 第三张牌:5[梅花] ,牌型:对子

第8个人的牌:

第一张牌:K[黑桃] 第二张牌:5[方片] 第三张牌:2[梅花] ,牌型:单张

第9个人的牌:

第一张牌:J[黑桃] 第二张牌:6[黑桃] 第三张牌:5[红桃] ,牌型:单张

第10个人的牌:

第一张牌:K[方片] 第二张牌:Q[红桃] 第三张牌:9[梅花] ,牌型:单张

时间: 2024-10-15 01:43:34

Java 小游戏:扎金花的相关文章

《Java小游戏实现》:坦克大战(续一)

<Java小游戏实现>:坦克大战(续一) 上篇博文(http://blog.csdn.net/u010412719/article/details/51712663)只介绍到了能够控制一个坦克在4个方向上移动就结束了,今天就在此基础上继续完成一个一个的小功能. 完成的功能:根据键盘的按键控制一个坦克在8个方向上移动 要完成这个功能,我们要做一下几个事情 1.记录下键盘的按键情况,即要重写键盘按下和抬起的监听事件 采用4个boolean变量来记录,按下为true,抬起为false 具体实现的代码

Java小游戏之打飞机(二)

这篇文章本应昨天写的,可是真打算写的时候,CSDN博客维护,导致拖到了今天: 在上篇文章Java小游戏之打飞机(一)中已经详细介绍了该游戏的基本架构和需求分析,今天就详细写一写具体每个类的实现: 1)PlaneGameFrame类    ----游戏的主界面以及一些具体的飞机动作方法.碰撞检测等 代码: package plane; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java

《Java小游戏实现》:坦克大战

<Java小游戏实现>:坦克大战 前面写了一个简单的聊天小程序,今天开始就写一个坦克大战的游戏,算是对Java相关小知识点的一个应用. 这个游戏的完成,我们也是分步完成,逐步累加,一个一个小功能的添加,最后直至完成整个游戏的开发. 第一步:写一个界面 public class TankClient extends JFrame{ public static void main(String[] args) { new TankClient().launchFrame(); } public v

java小游戏代码

一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起,一度遭到社会反感和家长抵制.但是,随着互联网的发展,和游戏潜在好处被发现,游戏的价值开始逐渐被社会认可,人们开始接受.认识和了解游戏带来的诸多好处. 现在学生的课业负担重,娱乐时间少,人际交往少,烦恼和压力也因此相应增加.其实玩游戏不仅帮助学生调节情绪,还可以锻炼与提高他们的反应能力和手脑的快速配合能力,同时帮助他们了解电脑和网络知识等,可谓是一举多得.据调查显示,经常玩游戏的学生思维活跃.善于表达.情绪乐观,解决问题时会

《Java小游戏实现》:坦克大战(续2)

<Java小游戏实现>:坦克大战(续2) 相关博文: <Java小游戏实现>:坦克大战http://blog.csdn.net/u010412719/article/details/51712663 <Java小游戏实现>:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570 博文<Java小游戏实现>:坦克大战(续1)中已经实现到了坦克可以发射一颗子弹了.这篇博文在此基础上继续实

《Java小游戏实现》:坦克大战(续三)

<Java小游戏实现>:坦克大战(续三) 相关博文: <Java小游戏实现>:坦克大战http://blog.csdn.net/u010412719/article/details/51712663 <Java小游戏实现>:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570 <Java小游戏实现>:坦克大战(续二):http://blog.csdn.net/u010412719/

java小游戏捕鱼达人,来学做java小游戏!

Java小项目捕鱼达人 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 捕鱼达人这款游戏,相信和我年纪相仿的朋友,肯定很熟悉.在当时半智能手机和智能手机刚刚出现的时代,手机里有捕鱼达人,汤姆猫,植物大战僵尸等小游戏,是很值得炫耀的,在村里那可是备受小朋友欢迎的.这篇文章来分享一下这款我当时很喜欢玩的捕鱼达人,但是要知道哦,捕鱼达人可是有一点赌博性质的,特别是游戏厅里的,大家可不能沉迷哦!先上图:这个java小游戏,虽然没有很多炫酷的特效和复杂的机制,但是作

java小游戏贪吃蛇大作战:来一起回顾童年回忆!

Java小项目之贪吃蛇 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 贪吃蛇,绝对是很多朋友的童年记忆.几乎没有人会说没玩过这款小游戏,因为不管在小灵通手机,直板手机,还是半智能手机,甚至是现在的5G手机,都能看见这款游戏的身影.虽然游戏一直在进化,画面,风格,操作方式越来越精细,但是游戏本质的玩法是没变的,例如蛇不断变大,碰到墙壁会死亡等设定.这篇文章来分享java小游戏贪吃蛇:部分代码展示:这个贪吃蛇小游戏,玩法和操控,都是比较完善的,大家感兴趣的可

寒假答辩作品:Java小游戏

目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https://github.com/404name/WinterReplyWorks 网盘(提取码pzgt):https://pan.baidu.com/s/1-JoHOCKYl_56fKCzhEmMvg 前言 (可直接跳到程序介绍) 前期入门小项目 过年这段时间在家写了两个C语言的大程序,当初在学校立的fla

猜生日 Java小游戏

最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 set2:2 3 6 7 10 11 14 15 18 19 22 23  26 27 30 31 set3:4 5 6 7 12 13 14 15 20 21 22 23  28 29 30 31 set4:8 9 10 11 12 13 14 15