先看下整体效果:(由于剪辑长度有限,只能展示前一部分)
开始实现:
一,先创建出牌。
有三点值得注意:
1.写重构方法时要写两个,因为大小王不是点数,而是字符串。
2.重写toString方法只用花色suit和点数points就行,保持简洁性。
3.一定要实现comparator接口,实现compareto方法(数字按大小比较,王比数字都大,但小王比大王小)
二,生成牌
最重要的思想是把牌用List组织起来,因为这样牌就可以方便后续抽牌、洗牌等操作
三、洗牌
洗牌主要借助Random方法生成随机数,把i下标的数据和随机数下标的数进行交换
四、开始斗地主
用的核心思想主要是生成List<List<Card>> listList二维数组装抽取出来的牌,并且后续比较时用到了Collections.sort()方法。
五、在Test中执行
最后的结果就是:
六、总结
1.,学会用List组织类,就可以对类进行增删查改。
2,用List组织起来的类型的add()和remove()方法是会影响到List本身的,只在添加数据和删除数据时运用,而set()和get()不影响List本身,只是修改里面的值和取值。
3.学会灵活运用comparator接口进行较为复杂的比较
七、代码:
一共三个类:Card类,Playcards类,Test类。
Card类:
import java.time.Period;
import java.util.Comparator;
public class Card implements Comparator<Card> {
private String suit;
private int points;
public String doubleking;
public Card(String suit, int points) {
this.suit = suit;
this.points = points;
}
public Card(String suit, String doubleking) {
this.suit = suit;
this.doubleking = doubleking;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
public int getPoints() {
return points;
}
public void setPoints(int points) {
this.points = points;
}
public String getDoubleking() {
return doubleking;
}
public void setDoubleking(String doubleking) {
this.doubleking = doubleking;
}
@Override
public String toString() {
return doubleking==null?("suit "+suit+" points "+points):("suit "+suit+" points "+doubleking);
}
//
// public int compareTo(Card o) {
// if(this.doubleking==null&&o.doubleking==null){
// int ret=this.points-o.points;
// return ret;
// }
// else if(this.doubleking==null&&o.doubleking!=null){
// return -1;
// }
// else if(this.doubleking!=null&&o.doubleking==null){
// return 1;
// }
// else /*if(this.doubleking!=null&&o.doubleking!=null){*/
// {
// if(this.doubleking.compareTo(o.doubleking)>0){
// return -1;
// }else {
// return 1;
// }
// }
//
// }
@Override
public int compare(Card o1, Card o2) {
if(o1.doubleking==null&&o2.doubleking==null){
int ret=o1.points-o2.points;
return ret;
}
else if(o1.doubleking==null&&o2.doubleking!=null){
return -1;
}
else if(o1.doubleking!=null&&o2.doubleking==null){
return 1;
}
else /*if(this.doubleking!=null&&o.doubleking!=null){*/
{
if(o1.doubleking.compareTo(o2.doubleking)>0){
return -1;
}else {
return 1;
}
}
}
}
Playcards类:
import java.util.*;
import java.util.jar.JarEntry;
public class Playcards {
//玩家号码
private int player=0;
//牌的花色和点数
private static final String[]suits={"♥","♦","♠","♣"};
private static final int[]points={1,2,3,4,5,6,7,8,9,10,11,12,13};
//(两个王)
private static final String[]doubleking={"xiaowang","dawang"};
//生成牌并且设置牌的花色和点数(牌的形式是由list组织起来的)
//牌的形式是由list组织起来的
List<Card>cardList=new ArrayList<>();
//生成牌并且设置牌的花色和点数
public List<Card> setCards(){
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < suits.length; j++) {
Card card=new Card(suits[j],points[i]);
cardList.add(card);
}
}
//加入王
cardList.add(points.length*suits.length,new Card(doubleking[0],"xiaowang"));
cardList.add(points.length*suits.length,new Card(doubleking[1],"dawang"));
//展示所有的牌
System.out.println();
System.out.println(cardList);
System.out.println();
//返回cardList,此时cardList是组织起来的牌
return cardList;
}
//洗牌
public void randomCards(List<Card>cards){
Random random=new Random();
for (int i = points.length*suits.length+2-1; i > 0; i--) {
exchange(cards,i,random.nextInt(i));
}
System.out.println(cards);
System.out.println();
}
//(交换牌)
private void exchange(List<Card>cards,int i,int j){
Card tmpcard=cards.get(i);
cards.set(i,cards.get(j));
cards.set(j,tmpcard);
}
//打牌(斗地主)
public void playCards(List<Card>cards){
//三个玩家手中的牌
List<Card>player1=new ArrayList<>();
List<Card>player2=new ArrayList<>();
List<Card>player3=new ArrayList<>();
//把三个人手中的牌组织起来
List<List<Card>> listList =new ArrayList<List<Card>>();
listList.add(player1);
listList.add(player2);
listList.add(player3);
//我的回合,抽卡!
for (int i = 0; i < 17; i++) {
for (int j = 0; j <3; j++) {
Card tmpcard=cards.remove(0);
listList.get(j).add(tmpcard);
}
}
System.out.println(listList.get(0));
System.out.println(listList.get(1));
System.out.println(listList.get(2));
System.out.println();
//剩余三张牌,开始抢地主
while (true){
int playernumber=player%3+1;
System.out.println("请问"+(playernumber)+"号玩家抢地主吗?");
System.out.println("抢地主按1,不强按2");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
if(choice==1)
{
//展示地主牌
System.out.println(cards);
//加入地主牌
listList.get(playernumber-1).add(cards.remove(0));
listList.get(playernumber-1).add(cards.remove(0));
listList.get(playernumber-1).add(cards.remove(0));
break;
}else {
player++;
}
}
Collections.sort(listList.get(0), new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
if(o1.doubleking==null&&o2.doubleking==null){
int ret=o1.getPoints()-o2.getPoints();
return ret;
}
else if(o1.doubleking==null&&o2.doubleking!=null){
return -1;
}
else if(o1.doubleking!=null&&o2.doubleking==null){
return 1;
}
else /*if(this.doubleking!=null&&o.doubleking!=null){*/
{
if(o1.doubleking.compareTo(o2.doubleking)>0){
return -1;
}else {
return 1;
}
}
}
});
Collections.sort(listList.get(1), new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
if(o1.doubleking==null&&o2.doubleking==null){
int ret=o1.getPoints()-o2.getPoints();
return ret;
}
else if(o1.doubleking==null&&o2.doubleking!=null){
return -1;
}
else if(o1.doubleking!=null&&o2.doubleking==null){
return 1;
}
else /*if(this.doubleking!=null&&o.doubleking!=null){*/
{
if(o1.doubleking.compareTo(o2.doubleking)>0){
return -1;
}else {
return 1;
}
}
}
});
Collections.sort(listList.get(2), new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
if(o1.doubleking==null&&o2.doubleking==null){
int ret=o1.getPoints()-o2.getPoints();
return ret;
}
else if(o1.doubleking==null&&o2.doubleking!=null){
return -1;
}
else if(o1.doubleking!=null&&o2.doubleking==null){
return 1;
}
else /*if(this.doubleking!=null&&o.doubleking!=null){*/
{
if(o1.doubleking.compareTo(o2.doubleking)>0){
return -1;
}else {
return 1;
}
}
}
});
//展示所有玩家的手牌,开始斗地主
System.out.println(listList.get(0));
System.out.println(listList.get(1));
System.out.println(listList.get(2));
//出牌
}
}
Test类:
import java.util.List;
public class Test {
public static void main(String[] args) {
Playcards playcards=new Playcards();
List<Card>cardList=playcards.setCards();
playcards.randomCards(cardList);
playcards.playCards(cardList);
}
}