继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

大神指点下:Java入门第三季-简易扑克牌

纪无涯
关注TA
已关注
手记 2
粉丝 4
获赞 87

求大神指点,主要是面向对象思想够不够,应该怎样改(这些类及方法分放是否合理)还有可以怎样精简代码吗?


package 简易扑克牌;

public class Attribute{
private String value;//点数
private String color;//花色

public Attribute(String value,String color){//承载并初始化一张扑克牌
    this.value=value;
    this.color=color;
}

public boolean equals(Attribute att) {//判断两张扑克牌是否相同
    if(att==null)return false;
    if(att==this)return true;
    if(att instanceof Attribute)
        return (att.value).equals(this.value)&&(att.color).equals(this.color);
    return false;
}

public String getValue() {
    return value;
}
public String getColor() {
    return color;
}

}


package 简易扑克牌;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class PuKePai implements Comparator<Attribute>{
final String[] values={"1","2","3","4","5","6","7","8","9","10","J","Q","K"};//一副扑克牌的所有点数
final String[] colors={"方块","梅花","红桃","黑桃"};//一副扑克牌的所有花色
private List<Attribute> pukepai;//承载一副扑克牌
private Random random=new Random();//创建随机数

public PuKePai(){//创建并初始化一副扑克牌
    this.pukepai=new ArrayList<Attribute>();
    for(int i=0;i<values.length;i++){
        for(int j=0;j<colors.length;j++){
            Attribute att=new Attribute(values[i],colors[j]);
            this.pukepai.add(att);
        }
    }
}

public void showAll(){//输出整副扑克牌
    int count=0;
    for(int i=0;i<this.pukepai.size();i++){
        System.out.print(this.pukepai.get(i).getColor()+this.pukepai.get(i).getValue());
        count++;
        if(count==4){
            System.out.print("\t");
        }else if(count==8){
            System.out.println();
            count=0;
        }else{
            System.out.print(" ");
        }
    }
    System.out.println();
}   

public void XiPai(){//洗牌,返回洗完后的扑克牌
    List<Attribute> npkp=new ArrayList<Attribute>();
    if(this.pukepai!=null){
        while(this.pukepai.size()!=0){
            int i=random.nextInt(this.pukepai.size());
            if(!npkp.contains(this.pukepai.get(i))){
                npkp.add(this.pukepai.get(i));
                this.pukepai.remove(i);
            }
        }
    }else{
        System.out.println("该扑克牌尚未进行初始化");
    }
    this.pukepai=npkp;
}

public List<Attribute> FaPai(int num){//发牌,返回发手牌
    List<Attribute> npkp=new ArrayList<Attribute>();
    if(num>0||num<=52/num){
        for(int j=0;j<num;j++){
            int i=random.nextInt(this.pukepai.size());
            npkp.add(this.pukepai.get(i));
            this.pukepai.remove(i);
        }
    }else{
        System.out.println("输入的手牌数量应该介于0-52");
    }
    return npkp;
}

@Override
public int compare(Attribute a1, Attribute a2) {//重写比较规则
    PuKePai pk=new PuKePai();
    for(int i=0;i<pk.getPukepai().size();i++){
        if(a1.equals(pk.getPukepai().get(i)))return -1;
        if(a2.equals(pk.getPukepai().get(i)))return 1;
    }
    return 0;
}

public void setPukepai(List<Attribute> pukepai) {
    this.pukepai = pukepai;
}
public List<Attribute> getPukepai() {
    return pukepai;
}

}


package 简易扑克牌;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class WanJia {
private String ID;//玩家id
private String Name;//玩家姓名
private List<Attribute> shouPai;
private Scanner input=new Scanner(System.in);

public WanJia(){//创建并初始化玩家
    System.out.print("ID:");
    this.ID=input.next();
    System.out.print("Name:");
    this.Name=input.next();
    this.shouPai=new ArrayList<Attribute>();
}

public List<Attribute> getShouPai() {
    return shouPai;
}
public void setShouPai(List<Attribute> shouPai) {
    this.shouPai = shouPai;
}

public String getID() {
    return ID;
}
public String getName() {
    return Name;
}

}


package 简易扑克牌;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test {
private static Scanner input=new Scanner(System.in);//输入流
public static void main(String args[]){
int IF=0;//是否进入游戏

    System.out.println("-----------------欢迎来到简易扑克牌游戏-----------------");
    System.out.println("操作指南:\t1-进入游戏\t0-退出");
    System.out.print("请输入您的选择:");
    try{
        IF=input.nextInt();
    }catch(Exception e){
        System.out.println("命令错误,请输入数字命令:");
        Scanner input=new Scanner(System.in);
    }

    while(IF!=0){//IF!=0,则进入游戏
        System.out.println("-----------------游戏开始-----------------\n");
        System.out.println("------------正在创建扑克牌------------\n");//创建并初始化扑克牌
        PuKePai puke=new PuKePai();
        puke.showAll();
        System.out.println("------------创建扑克牌成功------------\n");

        System.out.print("请输入要创建的玩家数量:");//创建并初始化玩家
        int numWJ=input.nextInt();//玩家数量
        WanJia[] wjs=new WanJia[numWJ];//承载多个玩家
        System.out.println("------------正在创建玩家信息------------\n");
        for(int i=0;i<numWJ;i++){
            System.out.println("------------正在创建玩家"+(i+1)+"------------\n");
            wjs[i]=new WanJia();
            System.out.println("玩家"+(i+1)+"创建成功----ID:"+wjs[i].getID()+"\tName:"+wjs[i].getName());
        }
        System.out.println("------------所有玩家创建完毕------------\n");

        System.out.println("------------开始洗牌------------\n");//洗牌并输出
        puke.XiPai();
        puke.showAll();
        System.out.println("------------洗牌完毕------------\n");

        System.out.print("请输入每个玩家的手牌数量:");//发牌并对玩家手牌排序后输出
        int numSP=input.nextInt();
        System.out.println("------------开始发牌------------\n");
        for(int i=0;i<numWJ;i++){
            wjs[i].setShouPai(puke.FaPai(numSP));
            System.out.print("玩家"+wjs[i].getName()+"的手牌:");

            Collections.sort(wjs[i].getShouPai(),new PuKePai());//排序,sort通过Comparator重写compare规则

            for(int j=0;j<numSP;j++){
                System.out.print(wjs[i].getShouPai().get(j).getColor()+wjs[i].getShouPai().get(j).getValue());
                System.out.print(" ");
            }
            System.out.println();
        }
        System.out.println("\n------------发牌完毕------------\n");

        System.out.println("------------开始比较大小------------\n");//对玩家每一张手牌进行比较大小
        int[] result=new int[numWJ];
        for(int i=0;i<numSP;i++){//手牌数量控制总的比较次数
            System.out.print("正在比较第"+(i+1)+"张牌:");
            int j=0;
            int record=j;
            Attribute max=wjs[j].getShouPai().get(i);
            for(j=1;j<numWJ;j++){//玩家数量控制每张牌比较次数
                if(puke.compare(max, wjs[j].getShouPai().get(i))==-1){
                    max=wjs[j].getShouPai().get(i);
                    record=j;
                }
            }
            result[record]++;//记录每个玩家胜利的次数
            System.out.println("玩家"+wjs[record].getName()+"大");//输出当次比较胜利的玩家
        }
        int i=0,j=0;
        for(i=1;i<numWJ;i++){
            if(result[j]<result[i]){
                j=i;
            }
        }
        System.out.println("最后的赢家是:玩家"+wjs[j].getID()+"  "+wjs[j].getName()+",胜"+result[j]+"盘");
        IF=0;
    }

}

}


打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP

热门评论

可以的

查看全部评论