模拟斗地主
需求:通过程序实现斗地主过程中的洗牌,发牌和看牌
思路: 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、看牌,也就是三个玩家分别遍历自己的牌
模拟斗地主的练习
xxxxxxxxxx
package 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、调用看牌的方法,此时玩家拿到的牌就是自然升序的
模拟斗地主优化版的练习
xxxxxxxxxx
package 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(); //这个输出的作用仅仅是用来换行的
}
}