Java语言实现斗地主洗牌发牌程序
任务
编写一个斗地主洗牌发牌的程序,要求按照斗地主的规则完成洗牌发牌的过程。
总共有54张牌,牌面由和数字(包括J,Q,K,A字母)组成,花色有 "♠","♥","♦","♣"这4种,分别表示黑桃、红桃、方块和梅花,小☺表示小王,大☻表示大王。将这54张牌打乱顺序,共有3位玩家参与游戏,每人轮流一次摸一张牌,剩下3张留为底牌。程序结束,打印每人手中的纸牌和底牌。
思路
(1)要实现纸牌程序,首先需要完成纸牌的组装。牌面是由花色和数字(包括J,Q,K,A字母)两部分组成,可以创建两个ArrayList集合作为花色集合和数字集合,存储时需要注意,比10大的牌用J,Q,K表示,1用A表示。
(2)将花色集合和数字集合这两个集合进行嵌套循环,将花色与数字组合,形成52张牌,并赋予其编号。将组合后的牌存放到一个HashMap集合中,集合中的key值是编号,value值是组装完成的纸牌。还有两张牌是大小王。由于组装规则不一样,需单独使用add()方法将这两张牌加入到HashMap集合中。
(3)创建一个数字集合,用这个数字集合来代替纸牌完场洗牌和发牌的操作。由于纸牌的数量是54张,所以创建的集合范围是0-53。
(4)可以使用Collections类的shuffle()方法完成打乱数字集合的操作,实现洗牌效果。由于只有3个人,所以可使用for循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同的人和底牌,实现发牌效果。
(5)洗牌和发牌完成之后,可通过Collections类的sort()方法完成排序,之后通过foreach循环HashMap集合,根据数字查找对应的纸牌字符串,并存入新创建的字符串集合中,最后展示字符串集合。
代码实现
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class game {
public static void main(String[] args) {
System.out.println("【按序号排序卡牌:】");
ArrayList<String> color = new ArrayList<String>();
color.add("♠");
color.add("♥");
color.add("♦");
color.add("♣");
ArrayList<String> number = new ArrayList<String>();
for(int i=3;i<=10;i++){
number.add(i+"");
}
number.add("J");
number.add("Q");
number.add("K");
number.add("A");
number.add("2");
HashMap<Integer,String> map = new HashMap<Integer,String>();
int index=0;
for(String n:number){
for(String c:color){
map.put(index++, c+n);
}
}
map.put(index++, "小☺");
map.put(index++, "大☻");
System.out.println(map);
System.out.println("【打乱顺序进行序号排序,一一对应:】");
ArrayList<Integer> card = new ArrayList<Integer>();
for(int i=0;i<=53;i++){
card.add(i);
}
Collections.shuffle(card);
System.out.println(card);
ArrayList<Integer> P1 = new ArrayList<Integer>();
ArrayList<Integer> P2 = new ArrayList<Integer>();
ArrayList<Integer> P3 = new ArrayList<Integer>();
ArrayList<Integer> P = new ArrayList<Integer>();
for(int i=0;i<card.size();i++){
if(i>=51){
P.add(card.get(i));
}else{
if(i%3==0){
P1.add(card.get(i));
}else if(i%3==1){
P2.add(card.get(i));
}else{
P3.add(card.get(i));
}
}
}
Collections.sort(P1);
Collections.sort(P2);
Collections.sort(P3);
Collections.sort(P);
ArrayList<String> SP1 = new ArrayList<String>();
ArrayList<String> SP2 = new ArrayList<String>();
ArrayList<String> SP3 = new ArrayList<String>();
ArrayList<String> SP = new ArrayList<String>();
for(Integer key:P1){
SP1.add(map.get(key));
}
for(Integer key:P2){
SP2.add(map.get(key));
}
for(Integer key:P3){
SP3.add(map.get(key));
}
for(Integer key:P){
SP.add(map.get(key));
}
System.out.println("【发牌到玩家手中的牌:】");
System.out.println("玩家1:" + SP1);
System.out.println("玩家2:" + SP2);
System.out.println("玩家3:" + SP3);
System.out.println("底牌:" + SP);
}
}
运行结果
【按序号排序卡牌:】
{0=♠3, 1=♥3, 2=♦3, 3=♣3, 4=♠4, 5=♥4, 6=♦4, 7=♣4, 8=♠5, 9=♥5, 10=♦5, 11=♣5, 12=♠6, 13=♥6, 14=♦6, 15=♣6, 17=♥7, 16=♠7, 19=♣7, 18=♦7, 21=♥8, 20=♠8, 23=♣8, 22=♦8, 25=♥9, 24=♠9, 27=♣9, 26=♦9, 29=♥10, 28=♠10, 31=♣10, 30=♦10, 34=♦J, 35=♣J, 32=♠J, 33=♥J, 38=♦Q, 39=♣Q, 36=♠Q, 37=♥Q, 42=♦K, 43=♣K, 40=♠K, 41=♥K, 46=♦A, 47=♣A, 44=♠A, 45=♥A, 51=♣2, 50=♦2, 49=♥2, 48=♠2, 53=大☻, 52=小☺}
【打乱顺序进行序号排序,一一对应:】
[20, 44, 5, 28, 18, 25, 11, 47, 1, 39, 37, 7, 21, 0, 12, 33, 45, 3, 10, 41, 30, 36, 6, 19, 4, 38, 42, 27, 29, 34, 49, 40, 51, 17, 50, 52, 9, 16, 53, 2, 8, 15, 13, 35, 48, 43, 23, 26, 14, 46, 22, 32, 24, 31]
【发牌到玩家手中的牌:】
玩家1:[♦3, ♠4, ♥5, ♦5, ♣5, ♥6, ♦6, ♥7, ♠8, ♥8, ♣9, ♠10, ♥J, ♠Q, ♣Q, ♣K, ♥2]
玩家2:[♠3, ♦4, ♠5, ♠7, ♦7, ♣8, ♥10, ♣J, ♥Q, ♦Q, ♠K, ♥K, ♠A, ♥A, ♦A, ♣A, ♦2]
玩家3:[♥3, ♣3, ♥4, ♣4, ♠6, ♣6, ♣7, ♦8, ♥9, ♦9, ♦10, ♦J, ♦K, ♠2, ♣2, 小☺, 大☻]
底牌:[♠9, ♣10, ♠J]
完成