斗地主发牌规则:
1.新建54张牌
2.洗牌
3.留3张底牌
4.发牌
1.新建54张牌
扑克牌的特点:
- 有2到10的数字,A,J,Q,K
- 除了王以外,都有4种花色
- 有两张王(大王、小王)
根据上面的特点建立数组pokes
、numbers
、colors
List<String> pokes = new ArrayList<>();
List<String> colors = new ArrayList<>();
List<String> numbers = new ArrayList<>();
pokes
数组:所有花色和数字组成的牌+大王+小王。
numbers
数组:2到10的数字,A,J,Q,K
colors
数组:4种花色
我们将4种花色输入到colors
数组中
colors.add("♥");
colors.add("♠");
colors.add("♦");
colors.add("♣");
接下来我们按照顺序把所有字母和数字输入到numbers
数组中
numbers.add("A");
for (int i=2; i<=10;i++){
numbers.add(i+"");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
numbers
、colors
数组都输入完了,我们可以将color+number组合,写入pokes
数组中组成一副扑克牌。
for (String n:numbers){
for (String c:colors){
String pai = c+n;
pokes.add(pai);
}
}
扑克牌还有大王和小王,别忘记了
pokes.add("小王");
pokes.add("大王");
我们输出下看看结果
System.out.println(pokes);
2.洗牌
这里我们用Java自带Collections
类中的shuffle
方法洗牌
Collections.shuffle(pokes);
System.out.println(pokes);
结果
3.留3张底牌
建一个数组保存留下的底牌
ArrayList<String> dipai=new ArrayList<>();
用for循环,将最后3张留下,做为底牌。
for (int i = 0; i < pokes.size(); i++) {
String pai = pokes.get(i);
if (i >= 51) {
dipai.add(pai);
} else {
}
}
4.发牌
假设有三个人分别是A1,A2,A3。那么他们拿到的牌是用数组表示
ArrayList<String> A1 = new ArrayList<>();
ArrayList<String> A2 = new ArrayList<>();
ArrayList<String> A3 = new ArrayList<>();
发牌的话就在刚才留底牌的那边else写进去
for (int i = 0; i < pokes.size(); i++) {
String pai = pokes.get(i);
if (i >= 51) {
dipai.add(pai);
} else {
if (i % 3 == 0) {
A1.add(pai);
} else if (i % 3 == 1) {
A2.add(pai);
} else {
A3.add(pai);
}
}
}
查看下结果
System.out.println("-------------------");
System.out.println("dipai:"+dipai);
System.out.println("A1:"+A1);
System.out.println("A2:"+A2);
System.out.println("A3:"+A3);
这样就发牌完成了。
总体代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DouDiZhu {
public static void main(String[] args) {
//1.新建54张牌
//2.洗牌
//3.留3张底牌
//4.发牌
/*新建54张牌*/
List<String> pokes = new ArrayList<>();
List<String> colors = new ArrayList<>();
List<String> numbers = new ArrayList<>();
colors.add("♥");
colors.add("♠");
colors.add("♦");
colors.add("♣");
numbers.add("A");
for (int i = 2; i <= 10; i++) {
numbers.add(i + "");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
for (String n : numbers) {
for (String c : colors) {
String pai = c + n;
pokes.add(pai);
}
}
pokes.add("小王");
pokes.add("大王");
System.out.println(pokes);
/*洗牌*/
Collections.shuffle(pokes);
System.out.println("洗完牌后顺序:");
System.out.println(pokes);
/*留3张底牌*/
/*发牌*/
ArrayList<String> A1 = new ArrayList<>();
ArrayList<String> A2 = new ArrayList<>();
ArrayList<String> A3 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
for (int i = 0; i < pokes.size(); i++) {
String pai = pokes.get(i);
if (i >= 51) {
dipai.add(pai);
} else {
if (i % 3 == 0) {
A1.add(pai);
} else if (i % 3 == 1) {
A2.add(pai);
} else {
A3.add(pai);
}
}
}
System.out.println("-------------------");
System.out.println("dipai:" + dipai);
System.out.println("A1:" + A1);
System.out.println("A2:" + A2);
System.out.println("A3:" + A3);
}
}
5.理牌
那么问题来了
如果我们是三位拿牌人中的一位,我们拿完牌后基本都要干一件事那就是理牌!可这怎么理牌呢?
思路:
建立新的数组pokesIndex
,这个数组中有0-53数组,代表pokes
数组中对应每一张牌的位置。
接下来打乱顺序的就只要pokesIndex
数组打乱,
Collections.shuffle(pokesIndex);
用新的数组来显示打乱后顺序,相当于翻译(从数字翻译到扑克牌号码)
List<String> pokesNew=new ArrayList<>();
for (int i=0;i<pokesIndex.size();i++){
int j=pokesIndex.get(i);
// String poke = pokes.get(j);
pokesNew.add(pokes.get(j));
// System.out.println(pokesNew);
}
System.out.println(pokesNew);
接下来发牌还是数字的数组发牌,
ArrayList<String> A1=new ArrayList<>();
ArrayList<String> A2=new ArrayList<>();
ArrayList<String> A3=new ArrayList<>();
ArrayList<String> dipai=new ArrayList<>();
List<Integer> dipaiIndex=new ArrayList<>();
List<Integer> A1Index=new ArrayList<>();
List<Integer> A2Index=new ArrayList<>();
List<Integer> A3Index=new ArrayList<>();
for(int i=0;i<pokesIndex.size();i++){
Integer pai=pokesIndex.get(i);
if (i>=51){
dipaiIndex.add(pai);
int j=pokesIndex.get(i);
dipai.add(pokes.get(j));
}else {
if (i%3==0){
A1Index.add(pai);
int j=pokesIndex.get(i);
A1.add(pokes.get(j));
}else if (i%3==1){
A2Index.add(pai);
int j=pokesIndex.get(i);
A2.add(pokes.get(j));
}else {
A3Index.add(pai);
int j=pokesIndex.get(i);
A3.add(pokes.get(j));
}
}
}
按照数字数组用Collections
类中sort
方法排序
Collections.sort(dipaiIndex);
Collections.sort(A1Index);
Collections.sort(A2Index);
Collections.sort(A3Index);
最后将排序后的数字顺序翻译成扑克牌的号码
for (int i=0;i<dipaiIndex.size();i++){
int j=dipaiIndex.get(i);
dipaiNew.add(pokes.get(j));
}
for (int i=0;i<A1Index.size();i++){
int j=A1Index.get(i);
A1New.add(pokes.get(j));
}
for (int i=0;i<A2Index.size();i++){
int j=A2Index.get(i);
A2New.add(pokes.get(j));
}
for (int i=0;i<A3Index.size();i++){
int j=A3Index.get(i);
A3New.add(pokes.get(j));
}
加入理牌后的整体代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DouDiZhu_px {
public static void main(String[] args) {
//1.新建54张牌
//2.洗牌
//3.留3张底牌
//4.发牌
/*新建54张牌*/
List<String> pokes = new ArrayList<>();
List<String> colors = new ArrayList<>();
List<String> numbers = new ArrayList<>();
List<Integer> pokesIndex = new ArrayList<>();
int index = 0;
colors.add("♥");
colors.add("♠");
colors.add("♦");
colors.add("♣");
numbers.add("A");
for (int i = 2; i <= 10; i++) {
numbers.add(i + "");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
for (String n : numbers) {
for (String c : colors) {
String pai = c + n;
pokes.add(pai);
pokesIndex.add(index);
index++;
}
}
pokes.add("小王");
pokesIndex.add(index);
index++;
pokes.add("大王");
pokesIndex.add(index);
index++;
System.out.println(pokes);
System.out.println(pokesIndex);
/*洗牌*/
Collections.shuffle(pokesIndex);
System.out.println("洗完牌后顺序:");
System.out.println(pokesIndex);
List<String> pokesNew = new ArrayList<>();
for (int i = 0; i < pokesIndex.size(); i++) {
int j = pokesIndex.get(i);
// String poke = pokes.get(j);
pokesNew.add(pokes.get(j));
// System.out.println(pokesNew);
}
System.out.println(pokesNew);
/*留3张底牌*/
/*发牌*/
ArrayList<String> A1 = new ArrayList<>();
ArrayList<String> A2 = new ArrayList<>();
ArrayList<String> A3 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
List<Integer> dipaiIndex = new ArrayList<>();
List<Integer> A1Index = new ArrayList<>();
List<Integer> A2Index = new ArrayList<>();
List<Integer> A3Index = new ArrayList<>();
for (int i = 0; i < pokesIndex.size(); i++) {
Integer pai = pokesIndex.get(i);
if (i >= 51) {
dipaiIndex.add(pai);
int j = pokesIndex.get(i);
dipai.add(pokes.get(j));
} else {
if (i % 3 == 0) {
A1Index.add(pai);
int j = pokesIndex.get(i);
A1.add(pokes.get(j));
} else if (i % 3 == 1) {
A2Index.add(pai);
int j = pokesIndex.get(i);
A2.add(pokes.get(j));
} else {
A3Index.add(pai);
int j = pokesIndex.get(i);
A3.add(pokes.get(j));
}
}
}
System.out.println("-------------------");
System.out.println("dipai:" + dipaiIndex);
System.out.println("dipai:" + dipai);
System.out.println("A1:" + A1Index);
System.out.println("A1:" + A1);
System.out.println("A2:" + A2Index);
System.out.println("A2:" + A2);
System.out.println("A3:" + A3Index);
System.out.println("A3:" + A3);
/*理牌*/
List<String> dipaiNew = new ArrayList<>();
List<String> A1New = new ArrayList<>();
List<String> A2New = new ArrayList<>();
List<String> A3New = new ArrayList<>();
Collections.sort(dipaiIndex);
Collections.sort(A1Index);
Collections.sort(A2Index);
Collections.sort(A3Index);
for (int i = 0; i < dipaiIndex.size(); i++) {
int j = dipaiIndex.get(i);
dipaiNew.add(pokes.get(j));
}
for (int i = 0; i < A1Index.size(); i++) {
int j = A1Index.get(i);
A1New.add(pokes.get(j));
}
for (int i = 0; i < A2Index.size(); i++) {
int j = A2Index.get(i);
A2New.add(pokes.get(j));
}
for (int i = 0; i < A3Index.size(); i++) {
int j = A3Index.get(i);
A3New.add(pokes.get(j));
}
System.out.println("-------------------");
System.out.println("理完牌后顺序:");
System.out.println("dipai:" + dipaiIndex);
System.out.println("dipai:" + dipaiNew);
System.out.println("A1:" + A1Index);
System.out.println("A1:" + A1New);
System.out.println("A2:" + A2Index);
System.out.println("A2:" + A2New);
System.out.println("A3:" + A3Index);
System.out.println("A3:" + A3New);
}
}
效果图: