java语言模拟实现斗地主
用数组以及随机数模拟实现,超简单~~~
一、初始化牌
众所周知,纸牌共有54张,将这54张牌放入到字符串数组里面,进行初始化操作,注意:这个顺序很重要,后面理牌的时候要用。相当于一个模板 以下是我声明的字符串数组。
String[] pai = {
"3♠", "3♥", "3♦", "3♣",
"4♠", "4♥", "4♦", "4♣",
"5♠", "5♥", "5♦", "5♣",
"6♠", "6♥", "6♦", "6♣",
"7♠", "7♥", "7♦", "7♣",
"8♠", "8♥", "8♦", "8♣",
"9♠", "9♥", "9♦", "9♣",
"10♠", "10♥", "10♦", "10♣",
"J♠", "J♥", "J♦", "J♣",
"Q♠", "Q♥", "Q♦", "Q♣",
"K♠", "K♥", "K♦", "K♣",
"A♠", "A♥", "A♦", "A♣",
"2♠", "2♥", "2♦", "2♣",
"大♚", "小♔"
};
二、建数组
//设置一个boolean数组,来对应下标,检查牌是否出现过
boolean[] isTrue = new boolean[54];
//用来存随机生成的下标,最重要,理牌时候也用到
int[] xiaBiao = new int[54];
//建3个int数组存下标,表示三个玩家,
int[] zhao = new int[17];
int[] liu = new int[17];
int[] zhang = new int[17];
//用一个int数组存地主牌
int[] diZhuPai = new int[3];
根据牌的下标去字符串里面取牌(值),如果这个值有了就对应的boolean数组的对应的设为true。
三、用随机数生成下标
用随机数生成一个(0,53]的随机数,其实生成的随机数就是字符数组(pai数组)的下标,根据生成的数去取值。
public void xiPai(String[] pai, boolean[] isTrue, int[] xiaBiao) {
System.out.println("\n洗牌");
int temp = 0;//用来计数,看是否够54张牌,
while (temp < 54) {
随机产生一个数(0,53]之间的数,赋值给p,这样保证一次循环只随机产生一个
int p = (int) (Math.random() * (53 - 0 + 1));
//isTrue是一个boolean数组,来对应下标,目的是检查随机生成的下标是否已经出现过
if (!isTrue[p]) {//执行的话证明还没有这个牌(下标)
xiaBiao[temp] = p;//把值存到数组里面
temp++;//牌数加一
System.out.print(pai[p] + " ");
//每27张牌换行一次
if (temp % 27 == 0)
System.out.println();
isTrue[p] = true;//对应的boolean数组设为true,证明这张牌已经有了
}
}
}
发牌
发牌就是将存好的数组下标分成4份(3份17个代表17张牌,一个3个,代表地主牌),可以直接用数组拷贝方法,都可以,只要达到目的就行。
//发牌
public void faPai(String[] pai, int[] xiaBiao, int[] zhang, int[] liu, int[] zhao, int[] dizhupai) {
System.out.print("\n开始发牌:");
int k = 0;
int j = 0;
while (j < 17) {
zhao[j] = xiaBiao[k++];
liu[j] = xiaBiao[k++];
zhang[j] = xiaBiao[k++];
j++;
}
System.out.print("\n张飞的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[zhang[i]] + " ");
}
System.out.print("\n赵云的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[zhao[i]] + " ");
}
System.out.print("\n刘备的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[liu[i]] + " ");
}
int q=0;
System.out.print("\n底牌:");
for (int i = 51; i < 54; i++) {
dizhupai[q] = xiaBiao[i];
System.out.print(pai[dizhupai[q]] + " ");
q++;
}
}
理牌
经过上面一个步骤以后,每个玩家手里面都有了17张牌,只需要将他们排序(注意,从头到尾用的都是下标,不是字符串里面的值,下标是int值,每一个int值对应字符串数组里面的一张牌,将随机生成的下标排序,其实就是理牌,因为下标有顺序了,根据下标取的值自热也就有了顺序。),详情如下代码:
//理牌
public void liPai(String[] pai, int[] zhang, int[] zhao, int[] liu) {
System.out.print("\n\n理牌");
//把下标排序,根据下标取值
Arrays.sort(zhang);
Arrays.sort(zhao);
Arrays.sort(liu);
System.out.print("\n张飞的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[zhang[i]] + " ");
}
System.out.print("\n赵云的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[zhao[i]] + " ");
}
System.out.print("\n刘备的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[liu[i]] + " ");
}
}
全部代码如下:
/*4.在斗地主当中,将54张牌随机发给3位玩家,并且保留3张牌做为底牌,分别展示三位玩家手中的牌和底牌。
例如: 张飞手中随机握有17张牌 ,赵云手中随机握有17张牌 ,刘备手中随机握有17张牌 底牌还剩3张
提示:扑克牌不只一张,很多张肯定要用数组,因为数组的定义就是一群元素
那么一副扑克牌54张肯定是数组。17张扑克牌也是数组。3张扑克牌也是数组。*/
import java.util.Arrays;
public class DouDiZhu {
public static void main(String[] args) {
String[] pai = {
"3♠", "3♥", "3♦", "3♣",
"4♠", "4♥", "4♦", "4♣",
"5♠", "5♥", "5♦", "5♣",
"6♠", "6♥", "6♦", "6♣",
"7♠", "7♥", "7♦", "7♣",
"8♠", "8♥", "8♦", "8♣",
"9♠", "9♥", "9♦", "9♣",
"10♠", "10♥", "10♦", "10♣",
"J♠", "J♥", "J♦", "J♣",
"Q♠", "Q♥", "Q♦", "Q♣",
"K♠", "K♥", "K♦", "K♣",
"A♠", "A♥", "A♦", "A♣",
"2♠", "2♥", "2♦", "2♣",
"大♚", "小♔"
};
boolean[] isTrue = new boolean[54];//设置一个boolean数组,来对应下标,
int[] xiaBiao = new int[54];
int[] zhao = new int[17];
int[] liu = new int[17];
int[] zhang = new int[17];
int[] diZhuPai = new int[3];
DouDiZhu d = new DouDiZhu();
d.chushipai(pai);
d.xiPai(pai, isTrue, xiaBiao);
d.faPai(pai, xiaBiao, zhang, liu, zhao, diZhuPai);
d.liPai(pai, zhang, zhao, liu);
}
//初始化牌,其实就是给输出一下pai[]数组
public void chushipai(String[] p) {
System.out.print("初始化新牌:");
for (int i = 0; i < p.length; i++) {
//每27张牌换行
if (i % 27 == 0) {
System.out.println();
}
System.out.print(p[i] + "\t");
}
System.out.println();
}
//洗牌
public void xiPai(String[] pai, boolean[] isTrue, int[] xiaBiao) {
System.out.println("\n洗牌");
int temp = 0;//用来计数,看是否够54张牌,
while (temp < 54) {
随机产生一个数(0,53]之间的数,赋值给p,这样保证一次循环只随机产生一个
int p = (int) (Math.random() * (53 - 0 + 1));
//isTrue是一个boolean数组,来对应下标,目的是检查随机生成的个下标是否已经出现过
if (!isTrue[p]) {//执行的话证明还没有这个牌(下标)
xiaBiao[temp] = p;
temp++;
System.out.print(pai[p] + " ");
if (temp % 27 == 0)
System.out.println();
isTrue[p] = true;
}
}
}
//发牌
public void faPai(String[] pai, int[] xiaBiao, int[] zhang, int[] liu, int[] zhao, int[] dizhupai) {
System.out.print("\n开始发牌:");
int k = 0;
int j = 0;
while (j < 17) {
zhao[j] = xiaBiao[k++];
liu[j] = xiaBiao[k++];
zhang[j] = xiaBiao[k++];
j++;
}
System.out.print("\n张飞的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[zhang[i]] + " ");
}
System.out.print("\n赵云的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[zhao[i]] + " ");
}
System.out.print("\n刘备的牌为:");
for (int i =0; i<17 ; i++) {
System.out.print(pai[liu[i]] + " ");
}
int q=0;
System.out.print("\n底牌:");
for (int i = 51; i < 54; i++) {
dizhupai[q] = xiaBiao[i];
System.out.print(pai[dizhupai[q]] + " ");
q++;
}
}
//理牌
public void liPai(String[] pai, int[] zhang, int[] zhao, int[] liu) {
System.out.print("\n\n理牌");
//把下标排序,根据下标取值
Arrays.sort(zhang);
Arrays.sort(zhao);
Arrays.sort(liu);
System.out.print("\n张飞的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[zhang[i]] + " ");
}
System.out.print("\n赵云的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[zhao[i]] + " ");
}
System.out.print("\n刘备的牌为:");
for (int i = 0; i < 17; i++) {
System.out.print(pai[liu[i]] + " ");
}
}
}
运行结果一
运行结果二
运行结果三
可以看出,每次玩家收到的牌都不一样(随机数产生的效果),理牌最关键的是理下标,根据下标去字符串数组里面取值。下标有了顺序,自然牌也就有了顺序,这才是为什么强调字符串数组的里面字符串位置很重要的原因。