模拟斗地主
需求:通过程序实现斗地主过程中的洗牌,发牌和看牌
思路: 1、创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现 2、往牌盒里面装牌 (1)四种牌型,数字是2,3,4,5,6,7,8,9,10,J,Q,K,A,小王,大王 (2)定义花色数组,里面包含四种花色 (3)定义点数数组 (4)花色和点数相搭配 3、洗牌,也就是把牌打散,用Collections的shuffle()方法实现 4、发牌,也就是遍历集合,给三个玩家发牌 5、看牌,也就是三个玩家分别遍历自己的牌
模拟斗地主的练习
xxxxxxxxxxpackage ch17;
import java.util.ArrayList;import java.util.Collections;
public class a_13_1测试 {
public static void main(String[] args) {
//创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现 ArrayList<String> array = new ArrayList<String>();
//往牌盒里面装牌 //先定义花色数组 String[] colors = {"◆", "♣", "♥", "♠"}; //再定义一个点数数组,即数字数组 String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; //拼接,即花色和点数相搭配 for (String color : colors) { //外层循环是花色 for (String number : numbers) { //内层循环是点数 //这里进行拼接,且存到牌盒,拼接之后的数据比如是方块2、方块3、梅花4、梅花5...... array.add(color + number); } } //此时52张牌就做完了。还需要一张大王和一张小王,如下 array.add("小王"); array.add("大王"); //此时就有54张牌了,即牌盒里面就有全部牌了 //System.out.println(array); //System.out.println("---------------------------------");
//---------------------------------------------------------------------------------------------------------------
//洗牌 Collections.shuffle(array); //此时牌的顺序就是乱的 //System.out.println(array);
//-----------------------------------------------------------------------------------------------------------------
//发牌,也就是遍历集合,给三个玩家发牌 //先创建三份牌的集合,用于每个玩家一份 ArrayList<String> card1 = new ArrayList<String>(); ArrayList<String> card2 = new ArrayList<String>(); ArrayList<String> card3 = new ArrayList<String>(); //再创建一个集合,用于存储三张底牌 ArrayList<String> three_card = new ArrayList<String>(); //发牌,即便利ArrayList集合。使用普通for进行遍历 for (int i = 0; i < array.size(); i++) { //得到牌 String poker = array.get(i); if (i >= array.size() - 3) { //当是最后三张牌时 three_card.add(poker); //就把剩下的三张放到底牌three_card里面 } else if (i % 3 == 0) { //索引对3取余。如果有5个玩家的话,则改为对5取余 card1.add(poker);//发到card1这个集合里面 } else if (i % 3 == 1) { card2.add(poker);//发到card1这个集合里面 } else if (i % 3 == 2) { card3.add(poker);//发到card1这个集合里面 } }
//看牌,也就是三个玩家分别遍历自己的牌。由于3个玩家的看牌动作相同,所以写一个方法来实现看牌动作。在外面写,然后这里调用 lookPoker("张三",card1);//自定义玩家名字,存储牌的集合 lookPoker("李四",card2); lookPoker("王五",card3); //别漏了底牌 lookPoker("底牌",three_card);
} //看牌方法 public static void lookPoker(String name,ArrayList<String> array){ //传的参数是:自定义玩家名字,存储牌的集合 System.out.print(name+"的牌是:"); //注意这里是print,不是println。作用是输出不换行 //用增强for来遍历牌 for(String poker : array){ System.out.print(poker + " ");//每张牌用空格隔开 } System.out.println(); //这个输出的作用仅仅是用来换行的 } //注意此时的看牌是乱序的。顺序的看牌在下一节课学,不见不散。下一节课的代码跟这节课无关
}
模拟斗地主优化版
案例:模拟斗地主升级版 需求:通过重写实现斗地主过程中的洗牌,发牌和着牌 升级的点:对'看牌操作'进行排序
如何排序如下 1、首先要有HashMap集合。该集合的键是key,从0~53。该集合的值是value,从◆3、♣3、♥3、3♠、◆4、♣4、♥4、4、......、大王、小王 2、再定义一个ArrayList集合,里面存储了0~53共54个索引,洗牌的时候其实洗的就是这里的索引 3、再定义一个TreeSet集合,作用是给玩家拿到的牌进行自然升序的排列,即从小到大排序。对牌排序就相当于对索引排序 4、看牌,即将索引转化为牌
思路如下 1、创建HashMap集合,键是编号,值是牌 2、创建ArrayList集合,存储编号 3、创建花色数组和点数数组 4、从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号 5、洗牌洗的是编号,用Collocations的shuffle()方法实现随机置换 6、发牌发的是编号,为了保证编号是排序的,需要创建TreeSet集合接收 7、定义一个看牌的方法,即遍历TreeSet集合,获取编号,到HashMap集合找对应的牌 8、调用看牌的方法,此时玩家拿到的牌就是自然升序的
模拟斗地主优化版的练习
xxxxxxxxxxpackage ch17;
import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.TreeSet;
public class a_14_1测试 {
public static void main(String[] args) {
//创建HashMap集合,键是编号,值是牌 HashMap<Integer, String> hm = new HashMap<Integer, String>();
//创建ArrayList集合,存储编号 ArrayList<Integer> array = new ArrayList<Integer>();
//创建花色数组 String[] colors = {"◆", "♣", "♥", "♠"}; //创建点数数组 String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号 //先定义编号,注意这里说的标号指的是索引 int index = 0; for (String number : numbers) {//外层循环是点数 for (String color : colors) {//内层循环是花色 hm.put(index, color + number);//存的是索引,牌 array.add(index);//再存一次索引 index++;//存完之后索引自增 } } //上面一共存了52张牌,还差大王和小王 hm.put(index, "小王");//存编号,牌 array.add(index);//再存一次编号 index++; hm.put(index, "大王"); array.add(index);
//洗牌洗的是编号,用Collocations的shuffle()方法实现随机置换 Collections.shuffle(array);
//发牌发的是编号,为了保证编号是排序的,需要创建TreeSet集合接收 //把3份玩家的牌和一份底牌存储在TreeSet集合里面 TreeSet<Integer> curd1 = new TreeSet<Integer>(); TreeSet<Integer> curd2 = new TreeSet<Integer>(); TreeSet<Integer> curd3 = new TreeSet<Integer>(); TreeSet<Integer> three_curd = new TreeSet<Integer>(); //通过普通for循环实现发牌 for (int i = 0; i < array.size(); i++) { //外面接收一下索引 int x = array.get(i);//array.get(i)拿到的是集合中的所有索引,再赋值给左边的x if (i >= array.size() - 3) {//当是最后三张牌时,即这里表示当是最后3个索引时 three_curd.add(x);//就把最后3个索引存储到three_curd这个小集合里面 } else if (i % 3 == 0) {//索引对3取余。如果有5个玩家的话,则改为对5取余 curd1.add(x);//发到card1这个小集合里面 } else if (i % 3 == 1) { curd2.add(x);//发到card2这个集合里面 } else if (i % 3 == 2) { curd3.add(x);//发到card3这个集合里面 } }
//调用看牌的方法,此时玩家拿到的牌就是自然升序的 lookPoker("张三", curd1, hm);//注意要传三个参数:自定义名字、3份牌中的其中一份、HashMap集合 lookPoker("李四", curd2, hm); lookPoker("王五", curd3, hm); //别漏了底牌 lookPoker("底牌", three_curd, hm); }
//定义一个看牌的方法,即遍历TreeSet集合,获取编号,到HashMap集合找对应的牌 public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) { System.out.print(name + "的牌是: ");//注意这里是print,不是println。作用是输出不换行 //遍历拿到的索引 for (Integer key : ts) { String poker = hm.get(key);//根据索引去找牌 System.out.print(poker + " ");//每张牌用空格隔开。注意这里是print,不是println。作用是输出不换行 } System.out.println(); //这个输出的作用仅仅是用来换行的 }
}