纸牌游戏的难点在于洗牌,需要用到随机数。这对于新手来讲不太友好,好在之前学过C语言,多钻研几遍能够理解。下面是分步骤:
1.创建纸牌,将花色,字母,大小王组合起来?
//创建牌函数
public static String[] creat() {
//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];
}
}
//6.拷贝王
destPokers=Arrays.copyOf(destPokers,destPokers.length+kings.length);
System.arraycopy(kings,0,destPokers,destPokers.length-kings.length,kings.length);
//7.返回函数
System.out.println("创建牌成功!");
return destPokers;
}
2.洗牌,在使用随机数函数时,考虑到有重复,使用一个布尔类型的标志数组来保证洗牌的准确性。
//洗牌函数
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(srcPokers.length);
//5.获取当前下标的标识
boolean flag=flags[index];
if(flag){
i--;
}else{
destPokers[i]=srcPokers[index];
flags[index]=true;
}
}
System.out.println("洗牌成功!");
return destPokers;
}
3.最后一个比较简单,发牌, 根据斗地主规则,平均分成三份。由于由洗牌得来的数组里面数据已经随机,此时可以使用多种分派方式,保证每个人拿到18张就行
//发牌函数
public static void fetch(String[] pokers) {
//定义三个玩家
String[] p1=new String[0];
String[] p2=new String[0];
String[] p3=new String[0];
//分配牌
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{
p3=Arrays.copyOf(p3,p3.length+1);
p3[p3.length-1]=pokers[i];
}
}
//打印输出
System.out.println("玩家一:\n"+Arrays.toString(p1));
System.out.println("玩家二:\n"+Arrays.toString(p2));
System.out.println("玩家三:\n"+Arrays.toString(p3));
//结束语句
a=1;
}
?为了保证数据修改方便,代码里面几乎没有使用具体数字,而是由数组的实际意义来使用函数求数组长度得来。
除此之外,定义纸牌数组的时候,没有直接给出纸牌数组的长度,而是不断扩容得来。
//定义数组
String[] destPokers=new String[0];
//扩容
destPokers= Arrays.copyOf(destPokers,destPokers.length+1);
为了更加符合企业开发需要,从开始学习就规范自己的代码!
?效果图:

?
源代码:?
import java.net.StandardSocketOptions;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class pokerganmes {
public static void main(String[] args) {
//1.模拟窗口
while(true){
//3.打印提示信息
System.out.println("请输入:\n1]创建牌 2]洗牌 3]发牌 -1]退出");
//4.输入数据
int menu=getInt();
//2.模拟关闭按钮
if(menu==-1){
System.out.println("---------欢迎下次使用,再见!--------");
break;
}
//5.校检
boolean isCheck=check(menu);
if(!isCheck){
System.out.println("-------------error------------");
continue;
}
//6.处理菜单
process(menu);
//7.终止程序
if(a==1)break;
}
}
//定义结束语句
static int a=0;
//定义纸牌数组
static String[] pokers=null;
//处理菜单函数
public static void process(int menu) {
if(menu==1){
//创建牌
pokers=creat();
}else if(menu==2){
//洗牌
pokers=random(pokers);
}else if(menu==3){
//发牌
fetch(pokers);
}
}
//发牌函数
public static void fetch(String[] pokers) {
//定义三个玩家
String[] p1=new String[0];
String[] p2=new String[0];
String[] p3=new String[0];
//分配牌
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{
p3=Arrays.copyOf(p3,p3.length+1);
p3[p3.length-1]=pokers[i];
}
}
//打印输出
System.out.println("玩家一:\n"+Arrays.toString(p1));
System.out.println("玩家二:\n"+Arrays.toString(p2));
System.out.println("玩家三:\n"+Arrays.toString(p3));
//结束语句
a=1;
}
//洗牌函数
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(srcPokers.length);
//5.获取当前下标的标识
boolean flag=flags[index];
if(flag){
i--;
}else{
destPokers[i]=srcPokers[index];
flags[index]=true;
}
}
System.out.println("洗牌成功!");
return destPokers;
}
//创建牌函数
public static String[] creat() {
//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];
}
}
//6.拷贝大小王
destPokers=Arrays.copyOf(destPokers,destPokers.length+kings.length);
System.arraycopy(kings,0,destPokers,destPokers.length-kings.length,kings.length);
//7.返回函数
System.out.println("创建牌成功!");
return destPokers;
}
//校检函数
public static boolean check(int menu) {
return menu>0&&menu<4;
}
//输入函数
public static int getInt() {
Scanner sc=new Scanner(System.in);
return sc.nextInt();
}
}
?
|