admin管理员组

文章数量:1516870

代码实现斗地主发牌

案例分析

需求:

实现斗地主过程中的洗牌,发牌和看牌。

并且确保每一位玩家手上拿到的牌是随机并且按照大小排序好的

思路

1.创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现
2.往牌盒里面装牌
3.洗牌,也就是把牌打散,用Collections的shuffle()方法实现
4.发牌,也就是遍历结合,给三个玩家发牌
5. 看牌,也就是三个玩家分别遍历自己的牌

代码实现

1.创建牌盒,存放所有牌

 //创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现ArrayList<String> poker=new ArrayList<String>();

2.往牌盒里面放入所有牌组

   //往牌盒里面装牌/*◆2,◆3,◆4.....◆k,◆A♣2,...♥2,...♠2,...小王  , 大王*///定义花色数组String[] colors={"◆","♣","♥","♠"};//定义点数数组String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//将所有牌组合放入牌盒for(String col:colors){for(String num:numbers){poker.add(col+num);}}//将最后两张大小王放入牌盒poker.add("小王");poker.add("大王");
  1. 洗牌,也就是把牌打散,用Collections的shuffle()方法实现
  //洗牌---把牌打乱Collections.shuffle(poker);
  1. 发牌,也就是遍历结合,给三个玩家发牌
//发牌--》遍历牌盒,给三个玩家发牌ArrayList<String> p1=new ArrayList<>();ArrayList<String> p2=new ArrayList<>();ArrayList<String> p3=new ArrayList<>();//留下三张底牌ArrayList<String> dp=new ArrayList<>();//将牌分发for(int i=0;i<poker.size();i++){if(i>=poker.size()-3){dp.add(poker.get(i));}else if(i%3==0){p1.add(poker.get(i));}else if(i%3==1){p2.add(poker.get(i));}else if(i%3==2){p3.add(poker.get(i));}}
  1. 看牌,也就是三个玩家分别遍历自己的牌
  //看牌---分别展示三位玩家自己的牌show("大忽悠",p1);show("小忽悠",p2);show("超级无敌大忽悠",p3);//展示底牌System.out.print("底牌如下: ");for(var Dp:dp)System.out.print(Dp+" ");

看牌的方法定义:

 public static  void show(String  name,ArrayList<String> arr){System.out.print(name+"的牌: ");for(int i=0;i<arr.size();i++){System.out.print(arr.get(i)+" ");}System.out.println();}

完整代码和演示结果

完整代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;public class Main
{public static void main(String[] args){//创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现ArrayList<String> poker=new ArrayList<String>();//往牌盒里面装牌/*◆2,◆3,◆4.....◆k,◆A♣2,...♥2,...♠2,...小王  , 大王*///定义花色数组String[] colors={"◆","♣","♥","♠"};//定义点数数组String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//将所有牌组合放入牌盒for(String col:colors){for(String num:numbers){poker.add(col+num);}}//将最后两张大小王放入牌盒poker.add("小王");poker.add("大王");//洗牌---把牌打乱Collections.shuffle(poker);//发牌--》遍历牌盒,给三个玩家发牌ArrayList<String> p1=new ArrayList<>();ArrayList<String> p2=new ArrayList<>();ArrayList<String> p3=new ArrayList<>();//留下三张底牌ArrayList<String> dp=new ArrayList<>();//将牌分发for(int i=0;i<poker.size();i++){if(i>=poker.size()-3){dp.add(poker.get(i));}else if(i%3==0){p1.add(poker.get(i));}else if(i%3==1){p2.add(poker.get(i));}else if(i%3==2){p3.add(poker.get(i));}}//看牌---分别展示三位玩家自己的牌show("大忽悠",p1);show("小忽悠",p2);show("超级无敌大忽悠",p3);//展示底牌System.out.print("底牌如下: ");for(var Dp:dp)System.out.print(Dp+" ");}public static  void show(String  name,ArrayList<String> arr){System.out.print(name+"的牌: ");for(int i=0;i<arr.size();i++){System.out.print(arr.get(i)+" ");}System.out.println();}
}

在这里插入图片描述
哈希表优化

区别: 上面是用一个字符串数组来存储所有牌的组合,并且也是对字符串数组进行洗牌操作,较为麻烦,而用哈希表之后,我们可以对每一张牌对应的索引进行洗牌操作。

并且上面也要求了,对每一位玩家的牌进行排序,而上面我们并没有实现,因此下面我们使用Treeset来保存每一位玩家所拿到的牌,确保完成了排序功能

思路:
在这里插入图片描述

代码实现:

import java.util.*;public class Main
{public static void main(String[] args){//HashMap存放索引和对应的牌HashMap<Integer,String> map=new HashMap<>();//存放索引的数组ArrayList<Integer> index=new ArrayList<>();//花色和点数数组String[] colors={"◆","♣","♥","♠"};String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//发牌int pos=0;//索引for(var col:colors){for(var num:numbers){map.put(pos,col+num);index.add(pos);pos++;}}//对索引执行洗牌操作Collections.shuffle(index);//发牌TreeSet<Integer> p1=new TreeSet<>();TreeSet<Integer> p2=new TreeSet<>();TreeSet<Integer> p3=new TreeSet<>();TreeSet<Integer> dp=new TreeSet<>();for(int i=0;i<index.size();i++){if(i>=index.size()-3){dp.add(index.get(i));}else if(i%3==0){p1.add(index.get(i));}else if(i%3==1){p2.add(index.get(i));}else if(i%3==2){p3.add(index.get(i));}}//看牌//看牌---分别展示三位玩家自己的牌show("大忽悠",p1,map);show("小忽悠",p2,map);show("超级无敌大忽悠",p3,map);//展示底牌System.out.print("底牌如下: ");for(var Dp:dp){System.out.print(map.get(Dp)+" ");}}public static  void show(String  name,TreeSet<Integer> arr,HashMap<Integer,String> map){System.out.print(name+"牌如下: ");for(var ele:arr){System.out.print(map.get(ele)+" ");}System.out.println();}
}

本文标签: 代码实现斗地主发牌