求大神指点,主要是面向对象思想够不够,应该怎样改(这些类及方法分放是否合理)还有可以怎样精简代码吗?
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;
}
}
}
热门评论
可以的