综合练习——集合和IO流以及面向对象

斗地主发牌

  • 有三个游戏玩家,从控制台输入三个玩家的姓名。
  • 玩家手中能拿牌,牌有点数和花色。
  • 一共54张牌,随机分配每人17张牌,剩余3张底牌。
  • 每人手中的牌需要从小到大排序(点数相同,按照花色#黑红梅方)
  • 大王>小王>2>A>K>Q>J>10>9>8>7>6>5>4>3
  • 选择一个人叫地主,得到3张底牌,并展示新的手牌

效果如下:

将每次的叫过地主后的手牌信息,写入到一个文件中。文件中的格式如下(前面的行号是编辑器自带的不用管):

代码如下

花色枚举(也可以设计成类)

/**
 * @Author 昊
 * @Create 2020/4/29 21:20
 * @Description
 */
public enum Suit {
    //四种花色分别对应四种不同的值,用花色对应的值来比较他们之间的大小
    Spade("♠",4),
    Heart("♥",3),
    Club("♣",2),
    Diamod("♦",1);
    private String str;
    private int level;
    Suit(String str,int level){
        this.str=str;
        this.level=level;
    }

    public int getLevel() {
        return level;
    }

    public String getStr() {
        return str;
    }
}

点数枚举(也可以设计成类)

/**
 * @Author 昊
 * @Create 2020/4/29 21:20
 * @Description
 */
public enum Point {
    //一个点数对应一个值,用值来比较他们的大小关系
    P3("3", 1),
    P4("4", 2),
    P5("5", 3),
    P6("6", 4),
    P7("7", 5),
    P8("8", 6),
    P9("9", 7),
    P10("10", 8),
    PJ("J", 9),
    PQ("Q", 10),
    PK("K", 11),
    PA("A", 12),
    P2("2", 13),
    JOKER_LOWER("♛", 14),
    JOKER_HIGHER("♚", 15);
    private  String str;
    private int level;
    Point(String str,int level){
        this.str=str;
        this.level=level;
    }

    public String getStr() {
        return str;
    }

    public int getLevel() {
        return level;
    }
}

扑克牌类

/**
 * @Author 昊
 * @Create 2020/4/29 21:28
 * @Description
 */
public class Poker implements Comparable<Poker>{
    //Poker的两个数学点数和花色
    private Point point;
    private Suit suit;

    public Poker(Suit suit,Point point ) {
        this.point = point;
        this.suit = suit;
    }

    public Point getPoint() {
        return point;
    }

    public Suit getSuit() {
        return suit;
    }

    @Override
    public String toString() {
        //大小王没有花色,suit为null,如果不处理会出现空指针异常
        return  (this.suit ==null ? "":this.suit.getStr())+ point.getStr() ;
    }
    //由于要排序,需要实现Comparable接口并重写compareTo方法,并按指定方式进行比较
    @Override
    public int compareTo(Poker poker) {
        //先比较点数
        //如果点数相同比较花色
        if(this.point.getLevel()==poker.point.getLevel()){
            return this.suit.getLevel()-poker.suit.getLevel();
        }else {
            return this.point.getLevel()-poker.point.getLevel();
        }
    }
}

玩家类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Author 昊
 * @Create 2020/4/29 21:09
 * @Description
 */
public class User{
    //玩家拥有姓名和一个存储Poker的集合
    private String name;
    private List<Poker> pokerList;
    public User(String name){
        this.name=name;
        pokerList=new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return  name + ":" + pokerList;
    }
    public void addPoker(Poker poker){
        //将每次取到的牌添加到自己的集合中
        pokerList.add(poker);
        //发完牌就排序
        if(pokerList.size()==17||pokerList.size()==20){
            Collections.sort(pokerList);
        }
    }
}

扑克牌管理类

/**
 * @Author 昊
 * @Create 2020/4/29 21:36
 * @Description  用于产生牌堆,并负责洗牌和发牌
 */
public class PokerManager {
    //用于存储一副牌
    private List<Poker> list;
    public PokerManager(){
        //因为要对数据进行频繁的删除操作所以使用LinkedList,而不是ArrayList
        list=new LinkedList<>();
        //获取点数的所有的枚举值
        Point[] values = Point.values();
        for (Point value : values) {
            //先添加A-K
            if(value.getLevel()<14){
                list.add(new Poker(Suit.Spade,value));
                list.add(new Poker(Suit.Heart,value));
                list.add(new Poker(Suit.Club,value));
                list.add(new Poker(Suit.Diamod,value));
            }
        }
        //添加大小王
        list.add(new Poker(null,Point.JOKER_HIGHER));
        list.add(new Poker(null,Point.JOKER_LOWER));
        //洗牌
        Collections.shuffle(list);
    }
    //从牌堆中取出一张牌
    public Poker getPoker(){
        //每次删除首牌
        return list.remove(0);
    }
}

测试类

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

/**
 * @Author 昊
 * @Create 2020/4/29 21:09
 * @Description
 */
public class Program {

    public static void main(String[] args) {
        //准备玩家
        Scanner s=new Scanner(System.in);
        System.out.println("欢迎来到JJ斗地主");
        System.out.println("请输入三个玩家的姓名:");
        User[] users=new User[3];
        for (int i = 0; i < 3; i++) {
            users[i]=new User(s.next());
        }

        //准别牌堆
        PokerManager pokerManager=new PokerManager();

        //发牌
        deal(pokerManager,users);

        //展示手牌
        show(users);

        //叫地主
        User lord=getLord(users);

        //将地主牌添加到地主玩家手中
        //显示地主的三张地主牌
        StringBuilder sb=new StringBuilder("地主牌:");
        for (int i = 0; i < 3; i++) {
            //获取地主牌
            Poker p=pokerManager.getPoker();
            sb.append(p).append(", ");
            //添加到地主手中
            lord.addPoker(p);
        }
        //去掉地主牌最后的都好跟空格
        sb.delete(sb.length()-2,sb.length());
        //展示地主的三张地主牌
        System.out.println(sb);
        //展示最终效果
        show(users);
        //存入指定文件
        save(users);

    }
    //发牌
    private static void deal(PokerManager pokerManager,User[]users){
        //先发前51张牌,留三张做地主牌
        for (int i = 0; i < 51; i++) {
            //每次发一张,三次一轮回
            users[i%3].addPoker(pokerManager.getPoker());
        }
    }
    //展示手牌
    private static void show(User[] users){
        for (User user : users) {
            System.out.println(user);
        }
    }
    //叫地主
    private static User getLord(User[] users){
        Scanner s=new Scanner(System.in);
        while(true){
            System.out.println("谁叫地主?");
            String name=s.next();
            for (User user : users) {
                if(user.getName().equalsIgnoreCase(name.trim())){
                    return user;
                }
            }
        }
    }

    //将控制台的数据写入指定文件中
    private static void save(User[]users){
        try(PrintStream printStream=new PrintStream(new FileOutputStream("file\\dizhu",true))){
            printStream.println("-----------------------------------------------------------------");
            for (User user : users) {
                printStream.println(user);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/dch-21/p/12805736.html