欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 数据结构--顺序表小项目--简单洗牌算法(JAVA)

数据结构--顺序表小项目--简单洗牌算法(JAVA)

2025/4/3 2:20:30 来源:https://blog.csdn.net/2402_87940708/article/details/146768943  浏览:    关键词:数据结构--顺序表小项目--简单洗牌算法(JAVA)

首先创建牌的属性Card类

public class Card {private String suit;//牌的花色private int rank;//牌的面值public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic String toString() {return "{" + suit + rank + "}";}
}

在牌的功能类CardFunc中依次实现买牌(创建牌),洗牌,发牌等功能

买牌方法:

这里为了好表示就去除了大王和小王,剩余52张牌,可以通过循环依次创建

public class Cardfunc {//花色的种类public static final String[] suits = {"♥", "♠", "♣", "♦"};//买牌public List<Card> buyCard() {List<Card> cardList = new ArrayList<>();for (int i = 1; i < 13; i++) {for (int j = 0; j < 4; j++) {int rank = i;String suit = suits[j];Card card = new Card(suit, rank);cardList.add(card);}}return cardList;}
}

测试类测试一下

public class Test {public static void main(String[] args) {Cardfunc cardfunc = new Cardfunc();//买牌System.out.println("洗牌前");List<Card> cardList = cardfunc.buyCard();System.out.println(cardList);}
}

接下来实现洗牌功能 

 //洗牌public void shuffle(List<Card> cardList) {Random random = new Random();for (int i = cardList.size() - 1; i > 0; i--) {int index = random.nextInt(i);swap(cardList, i, index);}}//被调用的交换方法private void swap(List<Card> cardlist, int i, int j) {Card tmp = cardlist.get(i);cardlist.set(i, cardlist.get(j));cardlist.set(j, tmp);}

 randdom.nextInt(i)会返回一个大于等于0小于i的数字

上述for循环的逻辑就是从第52张牌与前依次面随机一张牌交换,从而实现洗牌功能

测试一下:

public class Test {public static void main(String[] args) {Cardfunc cardfunc = new Cardfunc();//买牌System.out.println("洗牌前");List<Card> cardList = cardfunc.buyCard();System.out.println(cardList);//洗牌System.out.println("洗牌后");cardfunc.shuffle(cardList);System.out.println(cardList);}
}

实现发牌方法:

//发牌public List<List<Card>> play(List<Card> cardList) {//选手一List<Card> hand0 = new ArrayList<>();//选手三List<Card> hand1 = new ArrayList<>();//选手二List<Card> hand2 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand0);hand.add(hand1);hand.add(hand2);//三个人 每个人轮流摸五张牌for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {Card card = cardList.remove(0);hand.get(j).add(card);}}return hand;}

List<List<Card>>类似与一个二维数组,如下图

测试一下:

public class Test {public static void main(String[] args) {Cardfunc cardfunc = new Cardfunc();//买牌System.out.println("洗牌前");List<Card> cardList = cardfunc.buyCard();System.out.println(cardList);//洗牌System.out.println("洗牌后");cardfunc.shuffle(cardList);System.out.println(cardList);//3个人 每个人轮流摸5张牌List<List<Card>> ret = cardfunc.play(cardList);for (int i = 0; i < ret.size(); i++) {System.out.println("第" + (i + 1) + "个人的牌" + ret.get(i));}System.out.println("剩下的牌");System.out.println(cardList);}
}

第一次 

 第二次

 可见每次都具有随机性

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词