package com.swift.poker;

import java.util.ArrayList;
import java.util.Collections; /*训练考核知识点:Collection接口的基本方法、 训练描述:
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
使用54张牌打乱顺序
三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。 操作步骤描述:
准备牌:
牌可以设计为一个ArrayList<String>,每个字符串为一张牌。
每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
牌由Collections类的shuffle方法进行随机排序。
发牌:
将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
看牌:
直接打印每个集合*/ public class Poker { public static void main(String[] args) { ArrayList<String> huase=new ArrayList<String>();
huase.add("♥");
huase.add("♠");
huase.add("♧");
huase.add("方片");
ArrayList<String> shuzi=new ArrayList<String>();
shuzi.add("A");
shuzi.add("2");
shuzi.add("3");
shuzi.add("4");
shuzi.add("5");
shuzi.add("6");
shuzi.add("7");
shuzi.add("8");
shuzi.add("9");
shuzi.add("10");
shuzi.add("J");
shuzi.add("Q");
shuzi.add("K");
ArrayList<String> puke=new ArrayList<String>();
for(String hua:huase) {
for(String shu:shuzi) {
puke.add(hua+shu);
}
}
puke.add("大王");
puke.add("小王");
for(String str:puke) {
System.out.print(str+" ");
} //随机洗牌
Collections.shuffle(puke);
System.out.println();
for(String str:puke) {
System.out.print(str+" ");
}
//发牌
ArrayList<String> player1=new ArrayList<String>();
ArrayList<String> player2=new ArrayList<String>();
ArrayList<String> player3=new ArrayList<String>();
ArrayList<String> dipai=new ArrayList<String>();
for(int i=0;i<54;i++) {
if(i<3) {
dipai.add(puke.get(i));
}
else if(i%3==0) {
player1.add(puke.get(i));
}
else if(i%3==1) {
player2.add(puke.get(i));
}
else if(i%3==2) {
player3.add(puke.get(i));
}
}
//看牌
look(player1);
look(player2);
look(player3);
look(dipai);
} private static void look(ArrayList<String> pai) {
System.out.println();
for(String str:pai) {
System.out.print(str+" ");
}
System.out.println(); } }

0.2版本,增加发牌后排序功能

package com.swift.lianxi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /*按照斗地主的规则,完成洗牌发牌的动作
具体规则:
1. 组装54张扑克牌
2. 将54张牌顺序打乱
3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3 准备牌:
完成数字与纸牌的映射关系:
使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
洗牌:
通过数字完成洗牌发牌
发牌:♣
将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
存放的过程中要求数字大小与斗地主规则的大小对应。
将代表不同纸牌的数字分配给不同的玩家与底牌。
看牌:
通过Map集合找到对应字符展示。
通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示*/ public class Demo3 { public static void main(String[] args) { String[] huase = { "♥", "♠", "♣", "♠" };
String[] paimian = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };
// 生成扑克牌
ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < 54; i++) {
numbers.add(i);
}
Map<Integer, String> poker = new HashMap<Integer, String>();
poker.put(0, "大王");
poker.put(1, "小王");
int i = 2;
for (String pai : paimian) {
for (String hua : huase) {
poker.put(numbers.get(i), hua + "-" + pai);
i++;
}
}
lookMap(poker);
// 打乱扑克牌
Collections.shuffle(numbers);
System.out.println("=============================");
for (Integer n : numbers) {
System.out.print(n + " ");
}
// 三人摸牌留3张底
List<Integer> player1 = new ArrayList<Integer>();
List<Integer> player2 = new ArrayList<Integer>();
List<Integer> player3 = new ArrayList<Integer>();
List<Integer> dipai = new ArrayList<Integer>();
//这里分牌错了,把指定的 扑克分给了指定的人
/* for (int j : numbers) {
if(j==51||j==52||j==53) {
dipai.add(j);
}else {
if (j % 3 == 0) {
player1.add(j);
} else if (j % 3 == 1) {
player2.add(j);
} else if (j % 3 == 2) {
player3.add(j);
}
}
}*/
//应该把第几号的牌给指定的人,第几号牌面洗牌后是不同的
for (int k=0;k<numbers.size();k++) {
if(k==51||k==52||k==53) {
dipai.add(numbers.get(k));
}else {
if (k % 3 == 0) {
player1.add(numbers.get(k));
} else if (k % 3 == 1) {
player2.add(numbers.get(k));
} else if (k % 3 == 2) {
player3.add(numbers.get(k));
}
}
}
// 3名玩家和底牌排序
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
System.out.println();
System.out.println(player1);
System.out.println(player2);
System.out.println(player3);
Collections.sort(dipai);
// 看牌
System.out.println();
lookPai(poker, player1);
lookPai(poker, player2);
lookPai(poker, player3);
lookPai(poker, dipai); } private static void lookPai(Map<Integer, String> poker, List<Integer> player1) {
for (Integer p : player1) {
System.out.print(poker.get(p) + " ");
}
System.out.println();
} private static void lookMap(Map<Integer, String> poker) {
for (Integer x : poker.keySet()) {
System.out.print(poker.get(x) + " ");
}
System.out.println();
} }

java斗地主扑克 扑克牌 洗牌 发牌 Collection 集合练习的更多相关文章

  1. 实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用

    该Demo只是斗地主的游戏的一部分,实现的斗地主的组合牌  洗牌  发牌 看牌的功能,主要应用Map集合进行练习 package cn.lijun import java.util.ArrayList ...

  2. C++分享笔记:扑克牌的洗牌发牌游戏设计

    笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏.具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌.然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等. ...

  3. Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)

    规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ...

  4. JAVA程序设计(11)-----面对对象0基础设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样

    zzzzZZZZ 1.開始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; ...

  5. java算法 蓝桥杯 洗牌

    问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输.所以小弱T认为自己洗牌不够均匀,就独 ...

  6. 用C语言实现的扑克牌洗牌程序

    一副牌:54张 从0开始排序: 0-12表示黑桃   A 1,2,3,... 10,J,Q,K 13-25表示红桃 A 1,2,3,... 10,J,Q,K 26-38表示草花 A 1,2,3,... ...

  7. java——斗地主小游戏之洗牌发牌

    遇到的问题: 1.int和Integer的区别? 1)Integer是int的包装类,int则是java的一种基本数据类型 . 2)Integer变量必须实例化后才能使用,而int变量不需要 . 3) ...

  8. C语言实训——扑克牌洗牌程序

    说明此程序本来是21点扑克程序的一个被调函数,在这里我单独将它拿出来作为一个小程序. #include<stdio.h> #include<time.h> #include&l ...

  9. java集合--模拟斗地主发牌洗牌

    import java.util.*; /** * @Date: 2020/6/17 19:53 */public class Test04 { public static void main(Str ...

随机推荐

  1. 错误 chamfermatching.cpp:969:30: error: the compiler can assume that the address of ‘annotate_img’

    修改 ./build/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make文件,删掉-Werror=address,然后重新make

  2. div拖动实现及优化

    工作中的一个项目ui界面比较传统(chou),就想着把前端重构一下.内容之一是把导航栏从上方固定高度改为了右侧伸缩的边栏,好处是边栏可伸缩,占用面积小.不完美的地方是有时候会遮挡页面上最右边的按钮,作 ...

  3. 为什么阿里云服务器的docker启动tomcat这么慢??

    https://blog.csdn.net/tianyiii/article/details/79314597 最近在阿里云服务器使用Docker启动Tomcat,发现tomcat服务器启动过程很慢. ...

  4. 深入学习hbase:表,列族,列标识,版本和cell

    HBase是面向列的分布式的数据库,和传统的关系型数据库有很大的不同:物理模型和逻辑模型.这里我们要首先讲一下HBase数据库相关的区别于关系型数据库的几个基本概念:          表:HBase ...

  5. VMWare 9 安装 win8

    http://tieba.baidu.com/p/1954912175 http://down.51cto.com/data/497803 win8专业版:NBCCB-JJJDX-PKBKJ-KQX8 ...

  6. js弹出页面

    建立一个HTML文件,输入以下代码就能弹出页面 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  7. 翻String.Format源码发现的新东西:StringBuilderCache

    起因: 记不清楚今天是为毛点想F12看String.Format的实现源码了,反正就看到了下图的鸟东西: 瞬间石化有没有,StringBuilder还能这么获取? 研究StringBuilderCac ...

  8. jq中事件绑定的方法

    在唯品会实习生面试中,被面试官问了这么一个问题,“jQuery中绑定事件的方法有几个?”,以click事件为例,我当时想到的只有.click(),.bind(),.on()这三种,然后面试官又追问,“ ...

  9. CSS的相对定位和绝对定位(position)

    什么是定位呢? 定位(position),故名思议,就是确定元素在页面中的位置. CSS的常用定位有两种,一种是相对定位,一种是绝对定位. 下面我们看例子 <html> <head& ...

  10. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...