21点 小游戏 java代码_基于Java的21点扑克游戏的实现

在上次写的比较牌点的扑克游戏上Java扑克游戏(多人多牌数比较游戏)的实现中,添加21点游戏规则,实现21点牌类游戏。具体实现步骤如下:【需要源代码的留QQ,大家一起探讨探讨哈,谢谢啦!】

抽象出规则Rule接口,所有的游戏规则都要实现这个接口协议

package dk.card;

import java.util.Comparator;

public interface Rule extends Comparator {

public int compare(Player o1,Player o2);

}

2.. 添加了用于比较21点的游戏规则RuleOf21类,主要用来比较每个玩家的手牌大小

package dk.card;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

public class RuleOf21 implements Rule {

@Override

/* 二十一点游戏比较的基本规则:

* 1.如果博弈各方只有两张牌:A+X(A,10,J,Q,K)组合最大,

* 2.所有手牌的点数加起来和等于21的最大,超过21点的最小,以此类推21>20>....1>22>23...50【除去1中的情况,即不存在有1中的组合,如果存在1中情况的比其他博弈方都大,即使对方是21点】

* 3.如果在2请情况下,当手牌总点数有相等情况,则有5张牌的玩家比不是5张手牌的玩家大

* 4.牌A可以当做点1、点11来用

* 5.博弈各方手上牌数最多为5张

*/

public int compare(Player o1,Player o2) {

return compare21(o1.getPoker(),o2.getPoker());

}

public int compare21(Listo1, Listo2){

if(this.getPoints(o1)>this.getPoints(o2))

return -1;

else if(this.getPoints(o1)

return 1;

else

return 0;

}

//获取玩家手牌的点数--按照规则进行计算

public int getPoints(List list){

int points=0,i=points;

int indexA = -1;

//如果博弈方只有两张牌并且存在A+X(A,10,J,Q,K)的情况,将点数设置为最大值66666

if(list.size()==2){

//判断是否存在A牌

for(int j=1;j<=4;j++){

Card c = new Card(1,j);

indexA = list.indexOf(c);

if(indexA!=-1){

//如果存在A牌,判断是否存在A,10,J,Q,K牌

indexA = (indexA==0)?1:0;

Card b = list.get(indexA);

if(b.getNumber()>=10)//代表A,10,J,Q,K牌

{

points = 66666;//将点数设置为最大值66666

return points;

}

}

}

}

//判断是否存在A牌

if(list.size()>2)

for(int j=1;j<=4;j++){

Card c = new Card(1,j);

indexA = list.indexOf(c);

if(indexA!=-1)

break;

}

//如果博弈方的牌数=>2张牌且不是A+X(A,10,J,Q,K)情况

//不存在A牌

if(indexA==-1){

for(Card c:list){

i = c.getNumber();

if(i>10){

//J,Q,K都当做10点计算

i=10;

}

points+=i;

}

}else{

//存在A牌

points = this.getContainsA(list);//计算包含A牌的所有可能情况,并返回最佳情况

}

if(list.size()==5){

//小5龙,将points值设置为55555

points = (points<21)?55555:points;

}

points = (points>21&&points!=55555)?-1:points;

return points;

}

//返回含有A牌的手牌最好的结果

public int getContainsA(List list){

int countofA = 1;//记录A牌的数目

int points = 0,i=0;

for(Card c:list){

if(c.getNumber()==14)

countofA++;

else{

i = c.getNumber();

if(i>10){

//J,Q,K都当做10点计算

i=10;

}

points+=i;

}

}

int listofA[] = this.getTreeofA(countofA);

for(int j=0;j

int max = points+listofA[j];

if(max==21)

return max;

listofA[j]=max;

}

Arrays.sort(listofA);

if(listofA[listofA.length-1]<21)

return points;

else

return this.getMaxFromA(listofA);//为了防止选到了超出21的数

}

//从列表中找到最佳点数

public int getMaxFromA(int[] Alist){

for(int i=Alist.length-1;i>0;i--){

int j =Alist[i];

if(j<21)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值