模拟斗地主——简单数组操作,数组扩容

模拟斗地主——简单数组操作,数组扩容

前言

斗地主分为三方面,第一方面为有一副牌,第二方面为洗牌,第三方面为抓牌;通过java的数组知识和一些数组的API即可以实现斗地主的模式。
注:导包未写出,IDEA会自动导包。


第一步将游戏大框写出

public class Pokers {
	public static void main (String [] args) {
		//1.模拟窗口
		while(ture) {
			//3.打印菜单
			System.out.println("[1] 创建扑克 [2] 洗牌 [3] 抓牌 [-1] 退出")
			int menu = getInt();		
			//2.退出
			if (menu == -1) {
				System.out.println("游戏结束!");
				break;
			}
			//4.校验菜单
			boolen isCheck = check(menu);
			if(!isCheck) {
				System.out.println("输入非法,请重新输入!");
				continue;
			}
			//5.对菜单进行操作
			precess(menu);
		}
	}
	//校验
	public static boolen check(int menu) {
		if(menu >= 1 && menu <= 3) return true;
		return flise;
	}
	//从控制台录入整数。
	public static int getInt () {
		Scanner in = new Scanner(System.in);
		return in.nextInt;
	}
}

precess方法

public static void precess(int menu) {
	if (menu == 1) {
            //创建牌
            pokers = create();
        }else if (menu == 2) {
            //洗牌
            pokers = random(pokers);
        }else if (menu == 3) {
            //发牌
            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 [] king = {"大王","小王"};
	//4.牌组
	String [] pokers = new String[0];
	
	for (int i=0; i<colors.lengh; ++i) {
		for (int j=0; j<numbres.length; ++j) {
			pokers = Arrays.copyOf(pokers,pokers.lengh + 1);
			pokers[pokers.lengh - 1] = colors[i] + numbers[j];
		}
	}
	//5.拷贝大小王。
	//第一步:扩容
	pokers = Arrays.copyOf(pokers,pokers.lengh + 2);
	//第二步:拷贝
	System.arraycopy(king,0,pokers.lengh,pokers.lengh - king.lengh,king.lengh);
	return pokers;
	
}

洗牌

通过使用随机值进行洗牌;
分三个数组施行:

  • 数组原始数组,等待取值;
  • 状态数组,记录各个元素的状态,如果元素被抽取过,这个元素将不再进行抽取。
  • 等待数组,等待被赋值,记忆打乱后的数组。
public static String [] random(String [] srcPokers) {
	//2.目标数组
	String [] destPokers = new String [srcPokers.lengh];
	//3.状态数组
	String [] flags = new String [srcPokers.lengh];
	//4.获得54个随机数
	for (int i=0; i<srcPokers.lengh; ++i) {
		//1.获得随机数
		Random ran = new Random();
		index = ran.nextInt(srcPokers.lengh);
		//5.为等待数组赋值
		//第一步,判断索引值所在的元素的状态
		int flag = flags [index];
		//第二步,赋值
		if (flag) {
			--i;
		}else {
			destPokers [i] = srcPokers [index];  
			flag = true;
		}
	}
	return dextPokers;
}

抓牌

通过对每个人抓牌的规律可以看出,第一位玩家对3求余为0,第二位为1,第二位为2。

public static void fetch(String [] pokers) {
	//1.创建三个玩家的数组。
	String p1 = new String [0];
	String p2 = new String [0];
	String p3 = new String [0];
	for (int i=0; i<pokers.lengh; ++i) {
		if(i % 3 == 0) {
			p1 = Arrays.copyOf(p1,p1.lengh + 1);
			p1 = pokers[i];
		}else if(i % 3 == 1) {
			p2 = Arrays.copyOf(p2,p2.lengh + 1);
			p2 = pokers[i];
		}else if(i % 3 == 2) {
			p3 = Arrays.copyOf(p3,p3.lengh + 1);
			p13= pokers[i];
		}
	}
	System.out.println("P1的手牌是:" + Arrays.toString(p1));
	System.out.println("P2的手牌是:" + Arrays.toString(p2));
	System.out.println("P3的手牌是:" + Arrays.toString(p3));
}

现在代码中还会有点问题,在pokers处会报错,因为还没有进行定义,所以在游戏大框后添加代码:

//定义牌
    static String [] pokers = null;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值