前言:
小编这里将运用顺序表实现模拟发牌的规则,前提是阅读这篇文章的uu具备相应的知识
并且小编在编写代码时,忽略了大小王,以及J,Q,K都是由11,12,13代替的。
思路分析:
首先我们要明白在一副扑克牌中有花色,和数字,所以我们在面向对象编程时,首先要先定义一个类,初始化这两个变量,然后分析,我们肯定要将一副牌表示出来,然后打乱这幅牌,者涉及到两个方法,最后实现分牌,这也是一个方法,最后主函数实现。
相关代码:
按照以上思路讲解,有以下几个步骤和讲解。
1.初始化相关变量:
public class Card {
private int rank;
private String suit;
public Card(int rank, String suit) {
this.rank = rank;
this.suit= suit;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
@Override
public String toString() {
return "("+suit+":"+rank+")";
}
}
首先小编定义了两个变量rank代表数值,suit代表花色,然后就是经典的构造方法,以及get和set函数 ,(这两个变量是私有的,需要通过共有的get set函数调用,构造方法,方便在实例化对象时直接赋值)然后重写了tostring方法,这里方便按照指定格式直接输出对象。
2.实现所有牌的打印:
代码如下:
public class Cardlist {
public static final String[] SUIT={"♥","♣","♦","♠"};
//存放牌
public List<Card> cards(){
List<Card> list=new ArrayList<>(52);
for (int i=0;i<SUIT.length;i++){
for (int j = 1; j <=13 ; j++) {
int rank=j;
String suit=SUIT[i];
Card card=new Card(j,suit);
list.add(card);
}
}
return list;
}
这里首先初始话数组,将,梅花,红桃,黑桃,方片存入,定义一个存放牌的顺序表并声明它的范围,通过双重循环,将四种花色,13种数字对应的牌放到顺序表中。(这里将花色,与数字的信息放到card对象中后,通过顺序表list的方法add添加进去)
3.实现牌的打乱操作 :
代码如下:
public List<Card> swap(List<Card> list){
for (int i = list.size()-1; i >0; i--) {
Random r=new Random();
int index=r.nextInt(i);
Card card=list.get(i);
list.set(i,list.get(index));
list.set(index, card);
}
return list;
}
这里小编的思路是,通过随机函数,随机出来数字,然后交换实现打乱,这里通过顺序表中最后一个位置与随机前面的数(注意不包含最后一个位置,每次随机都是不能包含要交换的位置)实现交换,这样就不会随机到自己本身的索引。(在交换时通过顺序表get下标对应的扑克牌的信息,然后存入一个对象中,再实现交换,最后将对象拿给顺序表),这里与冒泡排序一样的道理。
4.实现扑克牌的发牌操作:
代码如下:
public List<List<Card>> getCard(List<Card> list){
List<List<Card>> person=new ArrayList<>();
List<Card> person1=new ArrayList<>();
List<Card> person2=new ArrayList<>();
List<Card> person3=new ArrayList<>();
person.add(person1);
person.add(person2);
person.add(person3);
for (int i = 0; i <5 ; i++) {
for (int j = 0; j <3 ; j++) {
Card card=list.remove(0);
person.get(j).add(card);
}
}
return person;
}
这里小编用了List<List<Card>>,表示在一个顺序表中还含有一个顺序表:
如下图所示:
其中0下表对应一个地址代表person1, 1下表对应一个地址代表person2, 2下表对应一个地址代表person3, 然后每个person1,person2,person3,都是一个顺序表,用这个顺序表里存放每个人的牌
代码通过person对象add(person1,person2,person3)添加了每个列表,然后通过双重循环,将打乱的牌的第一个牌删除并传给card(模拟了摸牌的操作),在通过person的get函数去调用第一个person1列表,并将card传给person1,就完成了发牌的操作。
5.主函数:
public static void main(String[] args) {
Cardlist cardlist=new Cardlist();
List<Card> ret=cardlist.cards();
System.out.println(ret);
System.out.println("把牌洗乱后");
List<Card> ret1=cardlist.swap(ret);
System.out.println(ret1);
List<List<Card>> ret2=cardlist.getCard(ret1);
System.out.println("第一个人的牌:"+ret2.get(0));
System.out.println("第二个人的牌:"+ret2.get(1));
System.out.println("第三个人的牌:"+ret2.get(2));
在最后输出时,ret2相当于person顺序表,调用get函数实现得到对应位置的顺序表,并打印其中的信息。
6.输出效果:
[(♥:1), (♥:2), (♥:3), (♥:4), (♥:5), (♥:6), (♥:7), (♥:8), (♥:9), (♥:10), (♥:11), (♥:12), (♥:13), (♣:1), (♣:2), (♣:3), (♣:4), (♣:5), (♣:6), (♣:7), (♣:8), (♣:9), (♣:10), (♣:11), (♣:12), (♣:13), (♦:1), (♦:2), (♦:3), (♦:4), (♦:5), (♦:6), (♦:7), (♦:8), (♦:9), (♦:10), (♦:11), (♦:12), (♦:13), (♠:1), (♠:2), (♠:3), (♠:4), (♠:5), (♠:6), (♠:7), (♠:8), (♠:9), (♠:10), (♠:11), (♠:12), (♠:13)]
把牌洗乱后
[(♥:5), (♥:10), (♦:6), (♥:8), (♠:5), (♥:1), (♥:13), (♠:12), (♣:5), (♥:3), (♠:13), (♣:9), (♣:11), (♣:6), (♥:7), (♥:6), (♣:7), (♦:7), (♦:5), (♠:11), (♦:4), (♦:9), (♥:2), (♣:1), (♦:1), (♣:8), (♦:2), (♥:12), (♦:11), (♣:4), (♠:10), (♦:12), (♠:3), (♦:10), (♦:3), (♠:1), (♠:6), (♣:12), (♥:11), (♠:4), (♠:7), (♣:3), (♦:13), (♠:8), (♠:9), (♣:10), (♥:4), (♥:9), (♠:2), (♣:2), (♦:8), (♣:13)]
第一个人的牌:[(♥:5), (♥:8), (♥:13), (♥:3), (♣:11)]
第二个人的牌:[(♥:10), (♠:5), (♠:12), (♠:13), (♣:6)]
第三个人的牌:[(♦:6), (♥:1), (♣:5), (♣:9), (♥:7)]
这里小编这给每个人发了五张牌。
总结:
限于小编能力有限,并且这只是一个发牌的模拟,没有非常完善,希望各位uu在评论区发表宝贵意见。代码在这里:Sequence: 顺序表相关代码,里面的Card包里哦;
制作不易,麻烦给小编点一个赞吧。