JAVA控制台扑克牌游戏,洗牌,发牌,比较大小

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohuiyang_949/article/details/80061940

    此游戏是一个简单的并且很基础的java控制台程序。这个扑克牌游戏主要的游戏过程是:首先创建一副扑克牌,创建好了后要进行洗牌,牌洗好了,需要玩家来玩,接下来就创建玩家。有洗好的牌,也有玩家了,那么就开始发牌,发完牌后,比较玩家中手牌的大小,大的那一位获胜。下面是代码:

    首先创建一个扑克牌类,扑克牌主要有两个属性,一个是点数,一个是花色。给点数和花色生成getter和setter。然后重载构造函数,一个无参的,一个有参的。在最后还重写了equals方法,判断两个扑克牌是否相等。

public class Poker {
    private String point;
    private String color;

    public Poker(){

    }
    public Poker(String point,String color){
        this.point = point;
        this.color = color;
    }
    public String getPoint() {
        return point;
    }

    public void setPoint(String point) {
        this.point = point;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Poker poker = (Poker) o;
        return Objects.equals(point, poker.point) &&
                Objects.equals(color, poker.color);
    }
}

    接下来我们创建玩家类,玩家拥有三个属性,一个是id,一个name,另一个是手牌。在这个游戏中,我们给每名玩家会发两张牌,所以用List来存放手牌。同样是创建无参构造方法和有参构造方法。然后就是这三个属性的getter和setter。

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

public class Player {
    private String id;
    private String name;
    private List<Poker> pokers;
    public Player(){

    }
    public Player(String id,String name){
        this.id = id;
        this.name = name;
        this.pokers = new ArrayList<Poker>();
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Poker> getPokers() {
        return pokers;
    }

    public void setPokers(List<Poker> pokers) {
        this.pokers = pokers;
    }
}

    有了玩家类和扑克类,剩下的就是游戏的主类了。主要的方法有三个,一个是创建玩家createPlayer,一个是洗牌shuffle,另一个是开始游戏的方法play。这个类需要实现Comparator接口,用于比较引用对象的大小。

import java.util.*;

public class Main implements Comparator<Poker> {

    private List<Player> playerList;            //玩家列表
    private List<Poker> pokerList ;             //原始扑克牌列表
    private List<Poker> pokerListAfterShuffle;  //洗牌后的扑克牌列表
    private Scanner console;                    //输入控制
    private String id;                          //用户输入的id
    private String name;                        //用户输入的name
    private Poker getPoker;                     //存放发的那张牌

    public static void main(String[] args) {
       Main game = new Main();
       game.createPlayer();
       game.shuffle();
       game.play();
    }

    /**
     * 在方法的初始化中,给成员变量初始化
     */
    public Main(){
        playerList = new ArrayList<Player>();
        pokerList = new ArrayList<Poker>();
        pokerListAfterShuffle = new ArrayList<Poker>();
        console = new Scanner(System.in);
        //创建扑克牌,有序的
        String[] points = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        String[] colors = {"方块","梅花","红桃","黑桃"};        //同花色的扑克牌大小遵循“黑红梅方”的规定
        for (String point : points){
            for (String color : colors){
                Poker poker = new Poker(point,color);
                pokerList.add(poker);
            }
        }
    }

    /**
     * 创建玩家,一共两个玩家
     */
    public void createPlayer(){
        System.out.println("----------创建玩家----------");
        for (int i = 1; i<3;i++){
            System.out.println("请输入第" + i + "位玩家信息:");
            System.out.println("请输入玩家id:");
            id = console.next();
            System.out.println("请输入玩家name:");
            name = console.next();
            playerList.add(new Player(id,name));
        }
        for (Player player : playerList){
            System.out.println("欢迎玩家:" +  player.getName());
        }
    }

    /**
     * 因为实现了接口Comparator,所以需要重写compare方法,
     * 在后面给扑克牌排序的时候,会调用
     * @param o1
     * @param o2
     * @return
     */
    @Override
    public int compare(Poker o1, Poker o2) {
        if (pokerList.indexOf(o1)>pokerList.indexOf(o2)){
            return 1;
        }
        return -1;
    }

    /**
     * 洗牌
     * 洗牌的方式是:将生成的有序的扑克牌,利用随机数,一张一张的抽取出来
     * 放在pokerListAfterShuffle列表中
     */
    public void shuffle(){
        //创建一个随机数
        Random random = new Random();       
        Poker poker = new Poker();
        System.out.println("----------开始洗牌----------");
        for (int i = 0;i<pokerList.size();i++){
            //避免重复添加同一张牌,在添加之前,检查洗牌后的列表中是否已经存在此牌
            do {
                //随机数的随机范围,是原始扑克牌列表的大小
                int position = random.nextInt(pokerList.size());
                poker = pokerList.get(position);
            }while (pokerListAfterShuffle.contains(poker));
            //如果没有重复,将此牌添加进去
            pokerListAfterShuffle.add(poker);
        }
        System.out.println("----------洗牌结束----------");
    }

    /**
     * 开始游戏,发牌,比较大小
     */
    public void play(){
        System.out.println("----------开始发牌----------");
        for (int i = 0;i<2;i++){
            for (int j = 0;j<2;j++){
                System.out.println("玩家" + playerList.get(j).getName() + "拿牌");
                getPoker = pokerListAfterShuffle.get(i*2+j);
                playerList.get(j).getPokers().add(getPoker);
            }
        }
        System.out.println("----------发牌结束----------");
        //对两位玩家中的手牌进行排序,后面那一张就是手中牌最大的
        Collections.sort(playerList.get(0).getPokers(),new Main());
        Collections.sort(playerList.get(1).getPokers(),new Main());
        System.out.println("----------玩家各自手牌为----------");
        for(int i =0;i<2;i++){
            for (int j = 0;j<2;j++){
                System.out.println(playerList.get(i).getName() + playerList.get(i).getPokers().get(j).getColor()
                        + playerList.get(i).getPokers().get(j).getPoint());
            }
        }
        //因为原始的扑克牌是升序,利用在原始扑克牌列表中位置,判断出谁大谁小。
        System.out.println("----------比较大小----------");
        if (pokerList.indexOf(playerList.get(0).getPokers().get(1))>pokerList.indexOf(playerList.get(1)
                .getPokers().get(1))){
            System.out.println("玩家" + playerList.get(0).getName() + "获胜");
        }else
            System.out.println("玩家" + playerList.get(1).getName() + "获胜");
        System.out.println("----------游戏结束----------");
    }
}

    下面是游戏的运行结果



    以上就是全部内容,如果发现问题,请指出,谢谢。

猜你喜欢

转载自blog.csdn.net/zhaohuiyang_949/article/details/80061940