list集合练习----斗地主
要求:
1、自定義洗牌方式,不能使用Collections.shuffle(pokers);方法
2、發(fā)完牌后對(duì)撲克牌進(jìn)行排序
一、初始化撲克牌
分析:
把撲克牌一一存進(jìn)list集合
分析:定義并靜態(tài)初始化兩個(gè)數(shù)組,一個(gè)存儲(chǔ)花色colors[],一個(gè)存儲(chǔ)數(shù)值numbers[]
兩個(gè)for循環(huán)遍歷把撲克牌存進(jìn)list,然后加上”大王“ ”小王“。
public static void initPorkers(ArrayList<String> list){String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};String[] colors = {"?", "?", "?", "?"};for (String color: colors){for (String number: numbers) {String poker = color+number;list.add(poker);}}list.add("大🃏");list.add("小🃏");System.out.print("發(fā)牌前:");for (String p:list) {System.out.print(p);}}二、洗牌(打亂排序)
// Collections.shuffle(list); // System.out.println("打亂牌后:"+list);也可以直接使用上述方法打亂順序。
分析
根據(jù) set 的不可重復(fù)性定義一個(gè)Set集合,把隨機(jī)生成的數(shù)存進(jìn)Set集合
然后把Set轉(zhuǎn)為list集合,遍歷List結(jié)合,根據(jù)Set集合的下標(biāo)獲取到原來List的牌值,然后存進(jìn)新List集合。
public static ArrayList daluanPokers(ArrayList<String> list){ArrayList<String> list1 = new ArrayList<>();//洗完牌的集合Set<Integer> pokers =new LinkedHashSet<>();Random r = new Random();while(pokers.size()<list.size()){int randonNum = r.nextInt(54);pokers.add(randonNum);}ArrayList<Integer> arrayList = new ArrayList<>(pokers);for (int i=0;i<arrayList.size();i++){list1.add(list.get(arrayList.get(i)));}return list1; // Collections.shuffle(list); // System.out.println("打亂牌后:"+list);}三、發(fā)牌
分析
共有54張牌,3張底牌
ublic static void faPokers(ArrayList<String> list,ArrayList<String> play01,ArrayList<String> play02,ArrayList<String> play03,ArrayList<String> dipai){for (int i=0;i<list.size();i++){String poker = list.get(i);if (i>50){dipai.add(poker);}else if (i%3==0){play01.add(poker);}else if (i%3==1){play02.add(poker);}else {play03.add(poker);}}System.out.print("玩家1排序前的牌:");for (String poker : play01) {System.out.print(poker + " ");}System.out.println();System.out.print("玩家2排序前的牌:");for (String poker : play02) {System.out.print(poker + " ");}System.out.println();System.out.print("玩家3排序前的牌:");for (String poker : play03) {System.out.print(poker + " ");}System.out.println();System.out.print("底牌排序前的牌:");for (String poker : dipai) {System.out.print(poker + " ");}System.out.println();}四、排序
這個(gè)排序方法是參考網(wǎng)上的,以下是我的分析
將每個(gè)牌按照牌的大小進(jìn)行賦值,“大王” “小王”為最大,所以分別賦值為162,161;
‘2’,‘A’,‘K’,‘Q’,‘J ’,依次為150,140,130,120,110
由于我前面初始化撲克牌時(shí)的拼接是 花色加數(shù)字 ,所以我只需截取花色后面的字符 即 數(shù)字
3--10的牌,然后乘以10,就為 10,20,30......等數(shù)字了,最后再加上花色1,2,3,4,便可以把撲克牌字符轉(zhuǎn)為數(shù)字了,之后便是簡(jiǎn)單的排序
private static ArrayList<String> paixu(ArrayList<String> list){ArrayList<Integer> movecard=new ArrayList<>();int f=0;for (int i = 0; i < list.size(); i++) {if(list.get(i).equals("大🃏"))f=162;else if(list.get(i).equals("小🃏"))f=161;else {if (list.get(i).substring(1).equals("A"))f = 140;else if (list.get(i).substring(1).equals("2"))f = 150;else if (list.get(i).substring(1).equals("J"))f = 110;else if (list.get(i).substring(1).equals("Q"))f = 120;else if (list.get(i).substring(1).equals("K"))f = 130;else f= Integer.parseInt(list.get(i).substring(1)) * 10;if(list.get(i).substring(0,1).equals("?")){f+=4;}else if(list.get(i).substring(0,1).equals("?")){f+=3;}else if(list.get(i).substring(0,1).equals("?")){f+=2;}else if(list.get(i).substring(0,1).equals("?")){f+=1;}}movecard.add(f);}//System.out.print(movecard+" ");//正式排序for (int i = list.size(); i > 1; i--) {for (int j = 0; j < i-1; j++) {if(movecard.get(j) < movecard.get(j+1)){swap(movecard,j,j+1);swap(list,j,j+1);}}}// System.out.print("movecare:"+movecard);return list;}swap方法如下:
private static <E> void swap(List<E> list, int index1, int index2) {E e=list.get(index1);//使用兩個(gè)set方法將j 和 j+1的值交換list.set(index1, list.get(index2));list.set(index2, e);//將index2位置上的元素用e替代,并返回原來的zhi}注意:
最后還要將數(shù)字轉(zhuǎn)為撲克牌,
swap(list,j,j+1);便是此方法的關(guān)鍵五、結(jié)果
?
總結(jié)
以上是生活随笔為你收集整理的list集合练习----斗地主的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Discuz开通VIP插件
- 下一篇: 常用电阻器有些?