作为一个初学java的菜鸟,近期在老师的指导下做了一个包含斗地主洗牌发牌的简单小项目.
我自己做的思路是直接将54张牌分成3组 17张,最后剩的3张直接给地主
首先创建两个实体类Card和Player.
![Card类](https://img-blog.csdnimg.cn/20200718182854747.png)![Player类](https://img-blog.csdnimg.cn/202007181829334.png)
在Card类中实现Comparable接口方便之后将每组牌发出后根据大小排序,将所有牌都存入集合中,之后分出一个人的牌
public List<Card> getCards() {
//将牌乱序
Collections.shuffle(list);
//定义集合接收
List<Card> group=new ArrayList<Card>();
//循环拿出一组牌
for (int i = 0; i <17; i++) {
//根据索引取牌
int index=r.nextInt(list.size());
group.add(list.get(index));
//排序
group.sort(null);
//取出一个就移除一个
list.remove(index);
}
return group;
}
分三组17张后还剩下三张存入一个集合,方便之后给地主
public List<Card> lastCard(){
List<Card> s=list;
System.out.println(s);
return s;
}
最后随机选出地主,完成发牌并排序的功能
```java
import java.util.Random;
public class PlayerTest {
CardDemo cd = new CardDemo();
Player a=new Player(1, "张三");
Player b=new Player(2, "李四");
Player c=new Player(3, "王五");
/**
* 随机定地主,并根据地主给牌
*/
public void dizhu() {
Random r=new Random();
int d=r.nextInt(3)+1;
if (d==1) {
a.isBoss=true;
a.setCard(cd.getCards());
b.setCard(cd.getCards());
c.setCard(cd.getCards());
a.getCard().addAll(cd.lastCard());
//给地主的牌排序
a.getCard().sort(null);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
if (d==2) {
b.isBoss=true;
b.setCard(cd.getCards());
a.setCard(cd.getCards());
c.setCard(cd.getCards());
b.getCard().addAll(cd.lastCard());
b.getCard().sort(null);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
if (d==3) {
c.isBoss=true;
c.setCard(cd.getCards());
b.setCard(cd.getCards());
a.setCard(cd.getCards());
c.getCard().addAll(cd.lastCard());
c.getCard().sort(null);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
public static void main(String[] args) {
PlayerTest a=new PlayerTest();
a.dizhu();
}
}
下面是老师给出的解决方案,相对于我的代码量就要少很多,运用的方法和思路也都要高级一点
首先同样是定义Card和Player两个实体类,不过老师是将大小王和普通牌分开,运用笛卡尔积写两组循环得出了普通牌的集合,相对于我一张一张添加方便了很多
```java
private static String[] names= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
private static String[] colors= {"♥","♠","♣","♦"};
private static List<Card> allCards;
private static int id=0;
/**声明存储玩家的引用*/
private static List<Player> players;
Random r=new Random();
static {
allCards=new ArrayList<Card>();
for (int i = 0; i < names.length; i++) {
for (int j = 0; j < colors.length; j++) {
id++;
//创建一张牌
Card c=new NormalCard(id, names[i], i+1, colors[j]);
//将创建的牌加入集合
allCards.add(c);
}
}
allCards.add(new Card(++id, "小王", 444));
allCards.add(new Card(++id, "大王", 666));
我的方法是直接17张一组,老师的则更加贴合实际,一人一张的发
public void sendCard() {
//声明临时变量表示该谁抽取了
int pos=0;
//遍历所有牌
for (int i = 0; i < allCards.size()-3; i++) {
players.get(pos).getCards().add(allCards.get(i));
pos=pos==0?1:pos==1?2:0;
// if (pos==0) {
// //玩家一抽牌
// pos=1;
// }if (pos==1) {
// //玩家二抽牌
//
// pos=2;
// }else {
// //玩家三抽牌
//
// pos=0;
// }
}
//将剩余的牌给地主
for (Player p : players) {
if (p.isBoss()) {
p.getCards().addAll(allCards.subList(allCards.size()-3, allCards.size()));
}
}
}
之后再将洗牌,排序等写成一个个方法,最后在主方法中new一个对象,调用各个方法得出最终结果.