写扑克牌程序的小心得

做完扑克牌程序感觉自己又通透了好多哈哈~
我的程序架构为:
View.class 主界面控制运行流程(似乎还是面向过程的思想有点改不掉呢) Pocker.class 单张扑克类
PockerCollection.class 扑克集合类
Player.class 玩家类
页面基本流程View.class(主函数所在地)


import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;

public class View {
    public static void main(String[] args) {
        PockerCollection pockers=new PockerCollection();
        System.out.println("----------创建扑克牌----------------");
        pockers.addPocker();
        System.out.println("----------扑克牌创建成功----------------");
        System.out.print("为:");
        pockers.getForeach();
        System.out.println("----------开始洗牌----------------");
/*****很喜欢这个洗牌方法,collections里面自带的洗牌程序************/
        Collections.shuffle(pockers.pockers);
        System.out.println("----------洗牌结束----------------");
        pockers.getForeach();
        System.out.println("----------创建玩家----------------");
        int id=0;
        String name;
        Scanner input=new Scanner(System.in);
        Player[] player=new Player[2];
        for(int i=0;i<2;i++){
            System.out.println("请输入第"+(i+1)+"位玩家的id和姓名");
            System.out.println("请输入ID:");
             /*这边只能避免一次输入类型错误,如果第二次仍输错就没办法了,欢迎大家帮我解决一下这个漏洞*/
            try{                                                                               
                id=input.nextInt(); 
            }
            catch(Exception e){
                System.out.println("请输入整数类型的ID");
                id=input.nextInt();
            }
            System.out.println("请输入姓名:");
            name=input.next();
            player[i]=new Player(id,name);  

        }
        for(int i=0;i<2;i++){
            System.out.println("---欢迎玩家:"+player[i].name+"-------");
        }
        System.out.println("----------开始发牌----------------");
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<player.length;j++){
                player[j].getPockers.add(pockers.pockers.get(i*player.length+j));
                System.out.println("---玩家:"+player[j].name+"拿牌");
            }
        }
        System.out.println("----------发牌结束----------------");
        player[0].getPocker();
        player[1].getPocker();
        System.out.println("----------开始游戏----------------");
        for(int i=0;i<2;i++){
            Pocker bigPocker=player[i].compare();

            System.out.println("玩家:"+player[i].name+"最大的手牌"+bigPocker.color+bigPocker.value);
        }
        int flag=player[0].compare().compareTo(player[1].compare());
        if(flag>0){
            System.out.println("-------------玩家:"+player[0].name+"获胜---------");
        }
        else if(flag<0){
            System.out.println("-------------玩家:"+player[1].name+"获胜---------");
        }
        else{
            System.out.println("-------------平局---------");
        }
        System.out.println("-------------玩家各自的手牌为:---------");
        for(int i=0;i<2;i++){
            System.out.println(player[i].name+"["+player[i].getPocker()+"]");
        }
    }
}

Pocker.class 单张扑克类

/*********
*实现了Comparable接口的compareTo方法
*仍然没亮点
*************/
public class Pocker implements Comparable<Pocker> {
     public String color;
     public String value;
     Pocker(String color,String value){
         this.color=color;
         this.value=value;
     }
@Override
    public int compareTo(Pocker o) {
        // TODO Auto-generated method stub
        if(this.value.compareTo(o.value)==0){
            return this.color.compareTo(o.color);
        }
        else{
            return this.value.compareTo(o.value);
        }
    }
}

PockerCollection.class 全套扑克牌

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PockerCollection {
    List<Pocker> pockers;

    PockerCollection(){
        pockers=new ArrayList<Pocker>();

    }
    public void addPocker(){
        Pocker[] pocker=new Pocker[52];
        String value="";
        int m=0;
        int j=0;
        //System.out.println(",");
/************这里给扑克牌赋值的方法避免了写很多很多字,找了一些规律,自己给自己的小惊喜***************/
        for(int i=0;i<52;i++)
        {
            j=i/13;
            m=i%13+1;
            if(m<11){
                value=m+"";
            }
            else if(m==11){
                value="J";
            }
            else if(m==12){
                value="Q";
            }
            else if(m==13){
                value="K";
            }
            //System.out.println(j+","+i);
            switch(j){
            case 0:
                pocker[i]=new Pocker("黑桃",value);

                break;
            case 1:
                pocker[i]=new Pocker("红桃",value);               
                break;
            case 2:
                pocker[i]=new Pocker("梅花",value);               
                break;
            case 3:
                pocker[i]=new Pocker("方块",value);
                break;
            }
        }
        this.pockers.addAll(Arrays.asList(pocker));     
    }
    public void getForeach(){
        for(Pocker pocker:pockers){
            System.out.print(pocker.color+pocker.value+",");

        }
    }

}

Player.class 玩家类

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Player {
    int id;
    String name;
    Set<Pocker> getPockers;
    Player(int id,String name){
        this.id=id;
        this.name=name;
        getPockers=new HashSet<Pocker>();
    }
    public String getPocker(){
        String back="";
        Iterator<Pocker> it=getPockers.iterator();
        Pocker pocker;
        while(it.hasNext()){
            pocker=it.next();
            back=back+pocker.color+pocker.value;
        }
        return back;
    }
    public Pocker compare(){
        Iterator<Pocker> it=getPockers.iterator();
        Pocker bigPocker=it.next();
        Pocker big;               
 /*一定要用一个对象把it.next()值取出来再运算,因为,每次执行这个函数都会跑一个Pocker对象,so要保证每次循环这个函数只能执行一次哦~*/
        while(it.hasNext()){
            big=it.next();
            if(bigPocker.compareTo(big)<0){
                bigPocker=big;
            }
        }
        return bigPocker;
    }

}

小心得在这里!!!
1、空字符串和空字符:pocker[i]=new Pocker(“”,’\0′);
2、虽然使用的Unicode集合,但是数字依然是48开始
3、对象数组初始化Pocker[] pocker=new Pocker[52];
但是只有引用,每一个对象的实例还没有出现,所以使用前
pocker[i]=new Pocker(“黑桃”,m);
4、洗牌方法一:collections工具类中有方法:洗牌:
Collections.shuffle(list);
洗牌方法二:(好精炼的语言啊啊!!)
public static ArrayList randomList(ArrayList sourceList){ 
 if (isEmpty(sourceList)) { return sourceList; } 
 ArrayList randomList = new ArrayList( sourceList.size( ) ); 
 do{ int randomIndex = Math.abs( new Random( ).nextInt( sourceList.size() ) ); 
 randomList.add( sourceList.remove( randomIndex ) ); 
 }while( sourceList.size( ) > 0 ); 
 return randomList; }

[附上洗牌方法原作者链接][1]

(第一次编写手记,格式效果不能预料……大概点上面这里会跳转吧……)
不确定能不能成功跳转,直接附上地址: http://blog.sina.com.cn/s/blog_6

5、iterator的it.next()方法,每用一次就会取下一个数

点赞