在上次写的比较牌点的扑克游戏上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)
return j;
}
return -1;
}
//构造牌A树,这里由于只有四种情况,所以直接列出来,当然也可以用树形结构来处理,效果更好
public int[] getTreeofA(int level){
//结果结合取决于level层次
//A牌可以被当做的情况
if(level==1){
int resultA[] ={1,11};
return resultA;
}else if(level==2){
int resultA[] ={2,12,22};
return resultA;
}else if(level==3){
int resultA[] ={3,13,23};
return resultA;
}else{
int resultA[] ={4,14,24,34};
return resultA;
}
}
}
3.在PlayerList中添加一个用于比较所有玩家手中牌的点数的方法:showWinnerOf21
//比较21点的大小
public static void showWinnerOf21(){
Collections.sort(playerlist,new RuleOf21());
Player p = playerlist.get(0);
show(p.showCard());
show("本局赢家是:"+p.getName());
}
4.在主方法中调用:
/**
*
*/
package dk.main;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import dk.card.Card;
import dk.card.CardList;
import dk.card.Player;
import dk.card.PlayerList;
import dk.card.RuleOf21;
/**
* @author Administrator
*
*/
public class Index05 extends Show {
public static Scanner scanner = new Scanner(System.in);
/**
* 调用的主方法
* @param args
*/
public static void main(String[] args) {
show("是否开始游戏?0/1");
int isStart = scanner.nextInt();
if(isStart==1){
show("请选择游戏?0:扑克牌比较大小游戏/1:21点游戏");
int gameType = scanner.nextInt();
switch(gameType){
case 0:startGame();break;
case 1:startGameOf21(); break;
default:
show("游戏不存在!!!");
break;
}
}
else{
show("退出游戏!");
}
}
//启动21点游戏
public static void startGameOf21(){
show("二十一点的游戏比较的基本规则:");
PlayerList.setRule("1.如果博弈各方只有两张牌:A+X(A,10,J,Q,K)组合最大,");
PlayerList.setRule("2.所有手牌的点数加起来和等于21的最大,超过21点的最小,以此类推21>20>....1>22>23...50【除去1中的情况,即不存在有1中的组合,如果存在1中情况的比其他博弈方都大,即使对方是21点】");
PlayerList.setRule("3.如果在2请情况下,当手牌总点数有相等情况,则有5张牌的玩家比不是5张手牌的玩家大");
PlayerList.setRule("4.总的牌数只有52张,没有大小王");
PlayerList.setRule("4.牌A可以当做点1、点11来用。");
PlayerList.setRule("5.博弈各方手上牌数最多为5张。");
PlayerList.printRules();
int players = 3;//默认玩家数目
int cardofplay = 2;//默认每个玩家的手牌数目
try {
show("开始输入玩家信息:");
for(int i=0;i
show("请输入第"+(i+1)+"个玩家姓名:");
String name = scanner.next();
Player p =new Player("00"+i,name);
PlayerList.addplayer(p);
}
show("一副没有洗的牌:");
CardList.generateCard();//生成一副扑克
CardList.printCardList();//打印扑克
show("========================================");
show("开始洗牌:........洗牌中......洗牌完成");
CardList.shuffleCard();//洗牌
show("========================================");
show("开始发牌:........发牌中......发牌完成");
CardList.dealCard(players,cardofplay);//发牌
PlayerList.shuffleCardToPlayer();//给玩家发牌
for(int i=0;i
Player player = PlayerList.playerlist.get(i);
show("第"+(i+1)+"玩家的发牌结果:\t\n"+player.showCard());
boolean isContinue = true;
int count = 2;
while(isContinue){
show("是否要牌?0/1");
int isGo = scanner.nextInt();
if(isGo==1&&count<=4){
count++;
PlayerList.getOneCard(i);
show("第"+(i+1)+"位玩家的要牌后结果:\t\n"+player.showCard());
}else{
isContinue=false;
}
}
show("===============第"+(i+1)+"位玩家要牌结束================");
}
show("========================================");
show("要牌结束:");
PlayerList.showCard();//显示所有玩家牌信息
show("========================================");
show("比较结果并且显示赢家信息");
PlayerList.showWinnerOf21();//显示本轮赢家
show("========================================");
} catch (Exception e) {
e.printStackTrace();
}
}
//启动比较扑克大小游戏
public static void startGame(){
show("游戏规则如下:");
PlayerList.setRule("1.至少需要两名玩家");
PlayerList.setRule("2.所有玩家的牌数加起来不超过52张牌");
PlayerList.setRule("3.比较所有玩家手中最大的牌点,最大的牌点数的玩家获胜");
PlayerList.setRule("4.总的牌数只有52张,没有大小王");
PlayerList.setRule("5.黑桃牌A最大,方块3最小,点数相同时,比较花色,黑桃较大。");
PlayerList.printRules();
show("请输入玩家人数:");
int players = 2;//默认玩家数目
int cardofplay = 2;//默认每个玩家的手牌数目
try {
players = scanner.nextInt();
while(players<2){
show("玩家人数至少是两人");
show("请重新输入人数:");
players = scanner.nextInt();
}
show("请输入每个玩家持有的牌数:");
cardofplay = scanner.nextInt();
while(cardofplay*players>52){
show("玩家*牌数超出范围!请重新输入牌数");
cardofplay = scanner.nextInt();
}
show("开始输入玩家信息:");
for(int i=0;i
show("请输入第"+(i+1)+"个玩家姓名:");
String name = scanner.next();
Player p =new Player("00"+i,name);
PlayerList.addplayer(p);
}
show("一副没有洗的牌:");
CardList.generateCard();//生成一副扑克
CardList.printCardList();//打印扑克
show("========================================");
show("开始洗牌:");
CardList.shuffleCard();//洗牌
show("========================================");
show("开始发牌:........发牌中......");
CardList.dealCard(players,cardofplay);//发牌
PlayerList.shuffleCardToPlayer();//给玩家发牌
show("发牌结果:");
PlayerList.showCard();//显示所有玩家牌信息
show("========================================");
show("比较结果:比较牌点大小并且显示赢家信息");
PlayerList.showWinner();//显示本轮赢家
show("========================================");
} catch (Exception e) {
e.printStackTrace();
}
}
//清空游戏
public static void clearGame(){
CardList.clear();
PlayerList.clear();
}
//测试比较扑克游戏
public static void testGame(){
try {
show("一副没有洗的牌:");
CardList.generateCard();
CardList.printCardList();
show("========================================");
show("开始添加玩家:");
Player p =new Player("001","DekingChen");
Player p1 =new Player("002","chenzhenquan");
Player p2 =new Player("003","czq");
PlayerList.addplayer(p);
PlayerList.addplayer(p1);
PlayerList.addplayer(p2);
show("开始洗牌:");
CardList.shuffleCard();
show("========================================");
show("开始发牌:........发牌中......");
int players = PlayerList.size();//玩家数目
int cardofsum = 3;//每个玩家的手牌数目
CardList.dealCard(players,cardofsum);
PlayerList.shuffleCardToPlayer();
show("发牌结果:");
PlayerList.showCard();
show("========================================");
show("比较结果:比较牌点大小并且显示赢家信息");
PlayerList.showWinner();
show("========================================");
} catch (Exception e) {
e.printStackTrace();
}
}
//测试21点游戏
public static void testGame21(){
List playerlist = new ArrayList();//储存扑玩家列表
List list = new ArrayList();
List list01 = new ArrayList();
List list02 = new ArrayList();
//玩家1牌点
Card c = new Card(8,1);
Card cc =new Card(1,2);
list.add(c);
list.add(cc);
//玩家2牌点
Card a = new Card(4,1);
Card aa = new Card(4,2);
Card b = new Card(4,3);
Card bb = new Card(4,4);
Card bbb = new Card(5,4);
list01.add(a);
list01.add(aa);
list01.add(b);
list01.add(bb);
list01.add(bbb);
//玩家3牌点
Card d = new Card(10,2);
Card dd = new Card(1,3);
list02.add(d);
list02.add(dd);
//创建玩家
Player p =new Player("001","DekingChen");
Player p1 =new Player("002","chenzhenquan");
Player p2 =new Player("003","czq");
p.setPoker(list);
p1.setPoker(list01);
p2.setPoker(list02);
playerlist.add(p);
playerlist.add(p1);
playerlist.add(p2);
Collections.sort(playerlist,new RuleOf21());
for(Player pp:playerlist){
show(pp.showCard());
}
}
}
5.运行结果:
是否开始游戏?0/1
1
请选择游戏?0:扑克牌比较大小游戏/1:21点游戏
1
二十一点的游戏比较的基本规则:
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.总的牌数只有52张,没有大小王
4.牌A可以当做点1、点11来用。
5.博弈各方手上牌数最多为5张。
开始输入玩家信息:
请输入第1个玩家姓名:
001
添加玩家:玩家Id:000 玩家姓名:001
----------------------------------------
请输入第2个玩家姓名:
002
添加玩家:玩家Id:001 玩家姓名:002
----------------------------------------
请输入第3个玩家姓名:
003
添加玩家:玩家Id:002 玩家姓名:003
----------------------------------------
一副没有洗的牌:
[方块A 梅花A 红桃A 黑桃A 方块2 梅花2 红桃2 黑桃2 方块3 梅花3 红桃3 黑桃3 方块4 梅花4 红桃4 黑桃4 方块5 梅花5 红桃5 黑桃5 方块6 梅花6 红桃6 黑桃6 方块7 梅花7 红桃7 黑桃7 方块8 梅花8 红桃8 黑桃8 方块9 梅花9 红桃9 黑桃9 方块10 梅花10 红桃10 黑桃10 方块J 梅花J 红桃J 黑桃J 方块Q 梅花Q 红桃Q 黑桃Q 方块K 梅花K 红桃K 黑桃K ]
========================================
开始洗牌:........洗牌中......洗牌完成
[方块J 黑桃Q 梅花K 红桃9 梅花4 梅花A 梅花10 方块Q 梅花7 梅花8 梅花Q 黑桃8 梅花6 黑桃K 方块4 方块A 方块9 方块3 红桃3 红桃6 黑桃2 方块8 方块K 黑桃10 黑桃A 黑桃6 红桃10 方块2 红桃8 红桃2 方块10 红桃J 梅花9 方块5 红桃Q 梅花3 红桃4 黑桃4 红桃A 红桃K 黑桃3 黑桃9 红桃7 梅花J 黑桃7 黑桃5 方块6 梅花2 黑桃J 红桃5 梅花5 方块7 ]
========================================
开始发牌:........发牌中......发牌完成
第1玩家的发牌结果:
玩家Id:000 玩家姓名:001
玩家牌信息:
方块J 红桃9
是否要牌?0/1
0
===============第1位玩家要牌结束================
第2玩家的发牌结果:
玩家Id:001 玩家姓名:002
玩家牌信息:
黑桃Q 梅花4
是否要牌?0/1
1
第2位玩家的要牌后结果:
玩家Id:001 玩家姓名:002
玩家牌信息:
黑桃Q 梅花4 梅花10
是否要牌?0/1
0
===============第2位玩家要牌结束================
第3玩家的发牌结果:
玩家Id:002 玩家姓名:003
玩家牌信息:
梅花A 梅花K
是否要牌?0/1
0
===============第3位玩家要牌结束================
========================================
要牌结束:
玩家Id:000 玩家姓名:001
玩家牌信息:
方块J 红桃9
----------------------------------------
玩家Id:001 玩家姓名:002
玩家牌信息:
黑桃Q 梅花4 梅花10
----------------------------------------
玩家Id:002 玩家姓名:003
玩家牌信息:
梅花A 梅花K
----------------------------------------
========================================
比较结果并且显示赢家信息
玩家Id:002 玩家姓名:003
玩家牌信息:
梅花A 梅花K
本局赢家是:003
========================================