在上次写的比较牌点的扑克游戏上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

========================================

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

  1. 医院医生评价的java代码_基于JAVA的医院信息查询接口调用代码实例

    基于JAVA的医院信息查询接口调用代码实例 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io ...

  2. 网购图书java代码_基于JAVA WEB的网上书店的设计与实现

    摘 要 互联网的迅速发展为人们提供了更多的购物方式,网上商店就是目前最主流的网上购物方式之一.本网上购物系统的设计源于对网上购物需求的增加,由于地理位置购物不便,购物管理不规范,管理工作效率低的现状开 ...

  3. java调用序列_基于JAVA的苹果序列号接口调用代码实例

    [java]代码库import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; ...

  4. 实训代码java毕业设计_基于SSM框架的王者荣耀游戏攻略系统

    基于SSM框架的王者荣耀游戏攻略系统mysql数据库创建语句 基于SSM框架的王者荣耀游戏攻略系统oracle数据库创建语句 基于SSM框架的王者荣耀游戏攻略系统sqlserver数据库创建语句 基于 ...

  5. 祖玛java代码_androidzuma 基于java开发的安卓祖玛龙珠游戏代码,可帮助 的 学习。 Develop 238万源代码下载- www.pudn.com...

    文件名称: androidzuma下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1174 KB 上传时间: 2013-11-27 下载次数: 1 提 供 者: ...

  6. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

  7. java斗地主代码_基于java实现斗地主代码实例解析

    斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克 ...

  8. 二维几何变换java代码_基于Batik的SVG应用: 关于几何变换

    本文是作者在 SVGGIS 系统的开发实践过程中关于 SVG 坐标转换的总结.在描述 SVG 坐标变换原理的同时,使用 Apache Batik 项目实现了相关例子. SVG 是一种用 xml 语言来 ...

  9. java魔塔_基于java的魔塔游戏的设计与实现论文.docx

    毕业设计(论文)题目: 基于java的魔塔游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.了解和运用Java面向对象的特性: 2.熟练掌握模块化设计的思想,锻炼使用java语言的能力: ...

最新文章

  1. Matlab怎么计算信号的能量,用Matlab求离散讯号的能量与功率怎么编程
  2. php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
  3. hibernate 基础学习
  4. mysql连接数thread_MySQL数据库负载很高连接数很多怎么处理
  5. vue 回车查询 按钮_从零开始学习vue
  6. 基于 qiankun 的微前端应用实践
  7. PyDev的使用-高效Py编程
  8. 课堂练习课下作业----用户场景分析
  9. [Swift通天遁地]一、超级工具-(13)使用PKHUD制作各种动态提示窗口
  10. Python知识点汇总
  11. dd命令烧写superboot.bin
  12. 【蓝桥杯】大臣的旅费(C++) (DSF+树的最大直径)
  13. 如何删除itunes中的ipa安装包
  14. 物联网-智能家居相关知识了解
  15. UI设计和原型设计的区别
  16. android学习笔记之GoogleMap
  17. 【web压测】压测常用工具、压测指标到底是什么?
  18. nrf52在未配对的情况下使用白名单广播,指定安卓手机允许连接
  19. C语言-图书管理系统
  20. jquery徽章_城市需要能够获得数字徽章

热门文章

  1. itchat给指定联系人发消息
  2. Windows7UltimateSP1x64安装及一些设置
  3. Lucene.net和盘古分词使用小结
  4. ubuntu安装chrome浏览器64位
  5. SCI论文攻略---完整版!!!!
  6. LaTeX期刊论文写作
  7. Thymeleaf实现页面静态化
  8. 继承CAcUiStringEdit,改变编辑框的字体颜色,以及背景的颜色
  9. 收藏一个好用的免费在线生成描字帖网站
  10. C/C++ 文件设备操作之CreateFile、ReadFile和WriteFile