您的位置:首页 > 职场人生

黑马程序员_Java实现斗地主发牌

2015-02-06 22:44 357 查看
      -------Android培训java培训
、期待与您交流!---------       

        斗地主是人们经常上网玩的游戏,玩这个游戏通常需要先给每个玩家发牌,并且要留下三张扑克牌作为底牌。那么程序是如何实现发牌的呢?

        思想:

                实现发牌的话首先需要定义两个数组,一个数组存储花色,一个数组存储牌的大小,一个HashMap集合对象用于存储所有的扑克牌;

HashMap<Integer,String> hm = new HashMap<Integer,String>(); //定义HashMap变量用于存储每张排的编号以及牌型
        String[] colors = {"♤","♥","♣","♢"}; //定义数组存储排的花色
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//定义数组存储牌值


                其次是 扑克牌生成之后需要做的是再定义一个ArrayList集合对象,用于存储每张牌的编号并将编号与生成的牌装入到HashMap集合对象中,在发牌时实际上发的是编号,再通过编号获取对应的扑克牌;

ArrayList<Integer> array = new ArrayList<Integer>();//定义ArrayList变量存储排的编号
for(String number : numbers){  //遍历排值数组
            for(String color : colors){ //遍历花色
                hm.put(index, color.concat(number));//将花色与牌值拼接,并将编号与拼接后的结果存储到hm中
                array.add(index); //将编号存储到array中
                index++;
            }
        }
        /*
         * 将小王和大王存储到hm中
         */
        hm.put(index, "小王");  
        array.add(index);
        index++;
        hm.put(index, "大王");
        array.add(index);


 
4000
               再次是定义四个TreeMap集合的对象存储三个玩家的牌以及底牌,使用TreeMap是因为TreeMap是实现了排序;

         

TreeSet<Integer> playerOne = new TreeSet<Integer>();
TreeSet<Integer> PlayerTwo = new TreeSet<Integer>();
TreeSet<Integer> playerThree = new TreeSet<Integer>();
TreeSet<Integer> dipai = new TreeSet<Integer>();


                接着就是发牌,当存储好编号时,打乱ArrayList集合对象存储的编号,再遍历ArrayList集合获得,在遍历的时候,用编号的下标去除3取余,余数为0,就将牌发给玩家1,余数为1就发给玩家2,余数为3就将牌发给玩家3,当下标超过51的时候就将牌作为底牌;

Collections.shuffle(array);  //调用Collections集合的shuffle()方法,将array中存储的编号进行随机的置换,即打乱顺序
//遍历编号的集合,实现发牌
        for(int x = 0; x < array.size(); x++){
            if(x >= array.size() - 3){
                dipai.add(array.get(x));
            }else if( x % 3 == 0){
                playerOne.add(array.get(x));
            }else if(x % 3 == 1){
                PlayerTwo.add(array.get(x));
            }else if(x % 3 == 2){
                playerThree.add(array.get(x));
            }
        }


                最后就是看牌,遍历每个玩家的TreeMap对象集合以及底牌的集合。

                定义一个看牌的方法,因为每个玩家都需要看牌,所以为了提高代码的复用性,所以单独定义一个看牌的方法

 

/**
* 遍历每个玩家的牌以及底牌
* @param name
* @param ts
* @param hm
*/
public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){
System.out.print(name+":\t");  //打印玩家名称
for(Integer key : ts){  //遍历玩家TreeSet集合,获得玩家的牌的编号
String value = hm.get(key);//根据玩家牌编号获取具体的牌值
System.out.print(value+"  ");//打印
}
System.out.println();
}

}


        以上就是分析的过程和主要代码的实现,这个发牌的代码主要就是利用了java中的集合去实现,HashMap是基于哈希表的,无序且唯一,TreeMap则是一种自平衡的红黑树,实现了排序的功能,而ArrayList是基于数组的,有序,可重复,效率高,线程不安全。另外就是利用了Collections类的方法。

        完整代码:

package cn.itheima03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class PokerDemo {

public static void main(String[] args) {

HashMap<Integer,String> hm = new HashMap<Integer,String>(); //定义HashMap变量用于存储每张排的编号以及牌型

ArrayList<Integer> array = new ArrayList<Integer>();//定义ArrayList变量存储排的编号

String[] colors = {"♤","♥","♣","♢"}; //定义数组存储排的花色
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//定义数组存储牌值

int index = 0;  //定义编号
for(String number : numbers){  //遍历排值数组
for(String color : colors){ //遍历花色
hm.put(index, color.concat(number));//将花色与牌值拼接,并将编号与拼接后的结果存储到hm中
array.add(index); //将编号存储到array中
index++;
}
}
/*
* 将小王和大王存储到hm中
*/
hm.put(index, "小王");
array.add(index);
index++;
hm.put(index, "大王");
array.add(index);

Collections.shuffle(array);  //调用Collections集合的shuffle()方法,将array中存储的编号进行随机的置换,即打乱顺序

/*
* 定义四个TreeSet集合的变量用于存储底牌编号以及三个玩家的牌的编号
* 采用TreeSet集合是因为TreeSet集合可以实现自然排序
*/
TreeSet<Integer> playerOne = new TreeSet<Integer>();
TreeSet<Integer> PlayerTwo = new TreeSet<Integer>();
TreeSet<Integer> playerThree = new TreeSet<Integer>();
TreeSet<Integer> dipai = new TreeSet<Integer>();

//遍历编号的集合,实现发牌
for(int x = 0; x < array.size(); x++){
if(x >= array.size() - 3){
dipai.add(array.get(x));
}else if( x % 3 == 0){
playerOne.add(array.get(x));
}else if(x % 3 == 1){
PlayerTwo.add(array.get(x));
}else if(x % 3 == 2){
playerThree.add(array.get(x));
}
}
lookPoker("底牌",dipai,hm);
lookPoker("huangshen",playerOne,hm);
lookPoker("xiequn",PlayerTwo,hm);
lookPoker("diannao",playerThree,hm);

}
/**
* 遍历每个玩家的牌以及底牌
* @param name
* @param ts
* @param hm
*/
public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){
System.out.print(name+":\t");  //打印玩家名称
for(Integer key : ts){  //遍历玩家TreeSet集合,获得玩家的牌的编号
String value = hm.get(key);//根据玩家牌编号获取具体的牌值
System.out.print(value+"  ");//打印
}
System.out.println();
}

}


       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: