思路:
i:创建牌
一张纸牌包含花色和字符
一副扑克牌:4种花色:黑桃、红桃、梅花、方块
17种字符:2~10 J~A
大、小王
ii:洗牌
通过随机数获取原数组下标,但是所参产生的随机数会重复,所以用个标识数组
iii:发牌
玩家1的牌的数组下标是0,3,6,9...
玩家2的牌的数组下标是1,4,7,10...
玩家1的牌的数组下标是2,5,8,11...
代码:
package test01;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class test01 {
public static void main(String[] args) {
//1.模拟软件
while(true) {
//3.打印提示信息
System.out.println("【1】创建牌 【2】洗牌 【3】发牌 【-1】退出游戏");
//4.从控制台获取一个整数
int menu=getInt();
//2.模拟关闭按钮
if(menu==-1) {
break;
}
//5.校验菜单
boolean isCheck=check(menu);
if(!isCheck) {
System.out.println("输入的数字非法,请重新输入!");
continue;
}
//6.处理菜单
process(menu);
}
}
//从控制台获取一个整数
public static int getInt() {
Scanner sc=new Scanner(System.in);
return sc.nextInt();
}
//校验菜单
public static boolean check(int menu) {
if(menu>=1&&menu<=3)
return true;
else
return false;
}
static String[] pokers=null;
//处理菜单
public static void process(int menu) {
if(menu==1) {
//创建牌
pokers=create();
}else if(menu==2) {
//洗牌
pokers=random(pokers);
}else {
//发牌
fetch(pokers);
}
}
//创建牌
public static String[] create() {
//1.准备花色数组
String[] colors= {"红桃","黑桃","梅花","方块"};
//2.准备字符
String[] numbers= {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//3.准备大小王
String[] kings= {"大王","小王"};
//4.定义目标数组
String[] destPokers=new String[0];//记得扩容
//5.定义组合
for(int i=0;i<colors.length;i++){
for(int j=0;j<numbers.length;j++) {
destPokers=Arrays.copyOf(destPokers,destPokers.length+1);
destPokers[destPokers.length-1]=colors[i]+numbers[j];
}
}
//拷贝两个王
destPokers=Arrays.copyOf(destPokers,destPokers.length+kings.length);
System.arraycopy(kings, 0, destPokers, destPokers.length-kings.length, kings.length);
return destPokers;
}
//洗牌
public static String[] random(String[] srcPokers) {
//2.定义一个目标数组
String[] destPokers=new String[srcPokers.length];
//4.标识数组
boolean[] flags=new boolean[srcPokers.length];
//3.随机数要拿54次
for(int i=0;i<srcPokers.length;i++){
//1.拿到随机数
Random ran=new Random();
int index=ran.nextInt();
//5.获取当前下标的标识
boolean flag=flags[index];
//6.判断如果标识为true,那么此次随机无效,如果为false ,这张牌就可以保存到目标数组
if(flag) {
i--;
}else {
destPokers[i]=srcPokers[index];
flags[i]=true;
}
}
return destPokers;
}
//发牌
public static void fetch(String[] pokers) {
//1.定义三个玩家
String[] p1=new String[17];
String[] p2=new String[17];
String[] p3=new String[17];
//2.遍历数组
for(int i=0;i<pokers.length;i++) {
if(i%3==0) {
p1=Arrays.copyOf(p1, p1.length+1);//扩容
p1[p1.length-1]=pokers[i];
}else if(i%3==1) {
p2=Arrays.copyOf(p2, p2.length+1);//扩容
p2[p2.length-1]=pokers[i];
}else if(i%3==2) {
p3=Arrays.copyOf(p3, p1.length+1);//扩容
p3[p3.length-1]=pokers[i];
}
}
//3.打印玩家们手里的牌
System.out.println("玩家一:\n",+Arrays.toString(p1));
System.out.println("玩家二:\n",+Arrays.toString(p2));
System.out.println("玩家三:\n",+Arrays.toString(p3));
}
};