m0_54075770 2022-12-08 03:19 采纳率: 100%
浏览 176
已结题

Java设计一个游戏:人机扑克牌比大小,界面上、下各有一个玩家 

img

想问下怎么设计可以变成上述图片的效果,用swing实现的源码

  • 写回答

3条回答 默认 最新

  • Jackyin0720 2022-12-08 07:59
    关注

    首先理解题意思路:
    此游戏是一个简单的并且很基础的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("----------游戏结束----------");
        }
    }
    

    这是一个条理足够清晰,编程过程。参考自链接:https://blog.csdn.net/zhaohuiyang_949/article/details/80061940?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-80061940-blog-114091555.pc_relevant_aa2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-80061940-blog-114091555.pc_relevant_aa2&utm_relevant_index=4

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月8日
  • 已采纳回答 12月8日
  • 修改了问题 12月8日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥15 对于这个问题的解释说明
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备