定义Card类型

/*
自己规定
1->9+k q j 13种中有4种
1-1 : 黑桃> 1.2红心> 1.3 方块> 1.4梅花
大鬼小鬼归为 第14类,小鬼:14-1 大鬼14-2
*/

先定义Card类型:
要理清楚结构:
number-huase为每个纸牌的性质
compareTo(Object o)方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable接口的,必须重写public int compareTo(T o)方法。

//设置泛型<>类型约束

效果图:

JAVA斗地主模拟创牌,洗牌,发牌,个人排序的功能_i++


JAVA斗地主模拟创牌,洗牌,发牌,个人排序的功能_赋值_02

Card.java:

public class Card implements Comparable < Card >    {  //泛型
private int number;
private int huase;
public int getNumber(){
return number;
}
public void setHuase(int huase){
this.huase=huase;
}
public int getHuase(){
return huase;
}
public void setNumber(int number){
this.number=number;
}
public String toString(){
// return number+"-"+huase;
String result = "";
// 黑桃>红桃>梅花>方块
String[] huaseName = {"方块", "梅花", "红桃", "黑桃"};
if(this.number<52) {
result += huaseName[this.huase-1];
result += this.number;
}else {
result += this.huase==1? "小王":"大王";
}
return result;
}
public int compareTo(Card o) {
if (this.getNumber() < o.getNumber()) {
return 1;
} else if (this.getNumber() > o.getNumber())
return -1;
else if (this.getNumber() == o.getNumber()) {
if (this.getHuase() < o.getHuase()) return 1;
else if (this.getHuase() > o.getHuase()) return -1;
}
return 0;
}
}

//pokers[54]代表要分发的纸牌

Text.java:

import java.util.Arrays;
import java.util.Scanner;
public class Test {
public static Card[] createPocker(){//建牌
Card[] pokers =new Card[54];
Card temp;int n=0;
for(int i=0;i<13;i++) {
for (int j = 0; j <4; j++) {
temp = new Card();
temp.setNumber(i+1);
temp.setHuase(j+1);
pokers[n] = temp;
n++; //n可以表示第几张牌,通过一个中介temp来给每张牌赋值
}
}
pokers[52]=new Card();
pokers[52].setNumber(14);pokers[52].setHuase(1);
pokers[53]=new Card();
pokers[53].setNumber(14);pokers[53].setHuase(2);//大王和小王比较特殊,独立赋值,需要定义
return pokers;
}

public static Card[] shufflePoker(Card[] pokers){//洗牌
int i,j;Card temp;
for(int q=0;q<1000;q++) {
i=(int)(Math.random()*54);
j=(int)(Math.random()*54); //Math.random()得到的数是[0,1)的double数,需要类型转换
temp=pokers[i];pokers[i]=pokers[j];pokers[j]=temp;
}
return pokers;
}//思想就是随机找出pokers[]数组中的2位进行交换,这样操作1000次达到打乱的目的

private static Card[][] fapai(Card[]pokers ) {//发牌
Card[][] results = new Card[3][18];
for (int i = 0; i < pokers.length; i++) {
if (i % 3 == 0) {
//第一个人
results[0][i / 3] = pokers[i];
} else if (i % 3 == 1) {
//第二个人
results[1][i / 3] = pokers[i];
} else if (i % 3 == 2) {
//第三个人
results[2][i / 3] = pokers[i];
}
}
return results;
}// result[3][18]是Card类型的数组,一个空格表示是第几个人的牌,第二个空格表示分发字牌


private static Card[][] sort1(Card[][] persons){//人工排序从小到大排序,先判断getNumber()再判断getHua()
for(Card[]cards:persons){
for(int i=0;i<cards.length;i++){
for(int j=0;j<i;j++){
if(cards[i].getNumber()==cards[j].getNumber()){
if(cards[i].getHuase()<cards[j].getHuase()){
Card temp=cards[i];
cards[i]=cards[j];
cards[j]=temp;
}
}
else if(cards[i].getNumber()<cards[j].getNumber()){
Card temp=cards[i];
cards[i]=cards[j];
cards[j]=temp;
}
}
}
}
return persons;
}

private static Card[][] sort2(Card[][] persons) {//第二种排序,隐式地调用了compareTo(Card o)函数
for(Card[] cards:persons){
Arrays.sort(cards);
}
return persons;
}

public static void main(String args[]) {
Card[] pokers=createPocker();//创牌
pokers=shufflePoker(pokers);//洗牌
System.out.println("显示洗牌后结果:");
for(int i=0;i<pokers.length;i++ ){
if(i%9==0) System.out.println();
System.out.printf("第"+(i+1)+"张:"+pokers[i]+" ");
}
System.out.println("\n开始发牌:");
Card result[][];
result= fapai(pokers);
System.out.println("显示每个人拿到的牌");
for(int i=0;i<3;i++) {
System.out.println("第"+(i+1)+"个人的牌:");
for(int j=0;j<18;j++){
System.out.print(result[i][j]+" ");
}
System.out.println();
}
System.out.println("\n每个人的牌进行排序:1.从小到大.2.从大到小");
int choice;Scanner scanner =new Scanner (System.in);
choice =scanner.nextInt();
switch(choice){
case 1:sort1(result);break;
case 2: sort2(result);break;
default: System.out.println("重新选择");
choice =scanner.nextInt();
}
System.out.println();
System.out.println("显示每个人拿到的牌");
for(int i=0;i<3;i++) {//人
System.out.println("第"+(i+1)+"个人的牌:");
for(int j=0;j<18;j++){//牌
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}
}