模拟斗地主——简单数组操作,数组扩容
前言
斗地主分为三方面,第一方面为有一副牌,第二方面为洗牌,第三方面为抓牌;通过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;