【Java】斗地主 —— 面向对象设计(Poker)

一、属性

面向对象设计:说白了,就是在JavaBean类中要定义几个属性、定义几个方法。

面向对象的设计不能自己想,一定要结合业务场景、业务需求慢慢分析,脱离业务需求去说面向对象的设计就是耍流氓。

现在我们来想一下,在斗地主游戏中,这个牌我们该怎么表示。

首先第一个属性要想到:是牌的名字,在之前我们写的控制台版本中,直接一个字符串就搞定了,但是现在,涉及到图形化界面了就要复杂一些。

image-20240429195611491

在以前,这张牌的名字是 ♠A,但是在 Windows操作系统 中,它是不允许这种奇奇怪怪的符号当做名字的。

所以要来改一改,我们会用 数字-数字 的方式进行表示,前面的数字表示花色,后面的数字就表示牌,因此 ♠A 的名字就是:1-1

image-20240429195850315

可以发现每张牌的图片也是由这个来命名的

image-20240429200305732


第二个属性应该是什么呢?

通过玩游戏可以发现,有的牌是正面,但有的牌是反面,因此还需要有一个属性去表示牌的正反面。

正反面由两种状态,这个属性应该是 boolean

image-20240429200511937

当我在打牌的时候,需要对牌进行点击,点击完后,它应该会有一个升起的动作,但是不是所有的牌都能点。

因此还需要第三个属性,来表示牌是否可以被点击。

image-20240429200815690

还没完,还有第四个属性需要考虑:我们需要来判断一下,自己的牌是否已经被点击了。

如果牌已经被弹起,再点击它,就会执行降落的操作。

因此这个牌还需要有第四个属性,用来记录当前的牌是否已经被点击。

image-20240429201021420

二、方法

方法非常简单,有三个方法:

  • 显示牌正面的方法
  • 显示牌反面的方法
  • 牌被点击后要执行的方法

这个图片是需要交给 JLabel 去管理的,因此我们先让 Poker类 继承 JLabel,表示当前的牌其实也就是一个 JLabel 管理容器,它可以管理我们加载进来的每一张牌。

public class Poker extends JLabel implements MouseListener {

    //属性
    //1.牌的名字 格式:数字 - 数字
    private String name;

    //2.牌显示正面还是反面
    private boolean up;

    //3.是否可以被点击
    private boolean canClick = false;

    //4.当前的状态,表示当前的牌是否已经被点击
    //如果是没有被点击的状态,此时被点击了,会执行弹起的操作
    //如果是已经被点击的状态,此时被点击了,会执行降落的操作
    private boolean clicked = false;

    // 构造方法这里就不建议写空参构造了,因为每张牌必须有名字,必须有正反面,其他的属性都是有默认值的。
    public Poker(String name,boolean up){
        this.name = name;
        this.up = up;
        //判断当前的牌是显示正面还是反面
        if(this.up){
            //显示正面
            turnFront();
        }else{
            //显示反面
            turnRear();
        }
        //设置牌的宽高
        this.setSize(71,96);
        //把牌显示出来
        this.setVisible(true);
        //给每一张牌添加监听,JLabel只能添加鼠标监听,其他的监听是添加不了的
        this.addMouseListener(this);
    }

    //显示正面
    public void turnFront(){
        //给牌设置正面
        this.setIcon(new ImageIcon("farmerandlord\\image\\poker\\"+name+".png"));
        //修改成员变量
        this.up = true;
    }

    //显示反面
    public void turnRear(){
        //给牌设置反面
        this.setIcon(new ImageIcon("farmerandlord\\image\\poker\\rear.png"));
        //修改成员变量
        this.up = false;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        //点击
        //判断当前的牌是否可以被点击
        if(canClick){
            //当牌被点击之后,要么升起,要么降落
            //表示牌的位移像素
            int step = 0;
            if(clicked){
                //表示当前的牌已经被点击
                //降落(y 增加 20像素)
                step = 20;
            }else{
                //表示当前的牌还没有被点击
                //升起 (y 减少 20像素)
                step = -20;
            }
            //需要修改一下clicked变量记录的值
            clicked = !clicked;
            //修改一下牌的位置
            Point from = this.getLocation(); // 获取当前牌的位置
            //创建一个Point的对象,表示结束位置
            Point to = new Point(from.x,from.y + step);
            //把最新的位置设置给牌
            this.setLocation(to);
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }


    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return up
     */
    public boolean isUp() {
        return up;
    }

    /**
     * 设置
     * @param up
     */
    public void setUp(boolean up) {
        this.up = up;
    }

    /**
     * 获取
     * @return canClick
     */
    public boolean isCanClick() {
        return canClick;
    }

    /**
     * 设置
     * @param canClick
     */
    public void setCanClick(boolean canClick) {
        this.canClick = canClick;
    }

    /**
     * 获取
     * @return clicked
     */
    public boolean isClicked() {
        return clicked;
    }

    /**
     * 设置
     * @param clicked
     */
    public void setClicked(boolean clicked) {
        this.clicked = clicked;
    }

    public String toString() {
        return "Poker{name = " + name + ", up = " + up + ", canClick = " + canClick + ", clicked = " + clicked + "}";
    }
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
斗地主是一种非常流行的纸牌游戏,实现斗地主需要设计出牌规则、洗牌、发牌、出牌等一系列功能。下面是一个简单的 Java 版本的斗地主游戏实现: ```java import java.util.*; public class LandlordGame { public static void main(String[] args) { //初始化牌 List<String> poker = new ArrayList<>(); String[] colors = {"♠", "♥", "♦", "♣"}; String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; for (String color : colors) { for (String number : numbers) { poker.add(color + number); } } poker.add("小王"); poker.add("大王"); //洗牌 Collections.shuffle(poker); //发牌 List<String> player1 = new ArrayList<>(); List<String> player2 = new ArrayList<>(); List<String> player3 = new ArrayList<>(); List<String> dipai = new ArrayList<>(); for (int i = 0; i < poker.size(); i++) { String p = poker.get(i); if (i >= 51) { dipai.add(p); } else if (i % 3 == 0) { player1.add(p); } else if (i % 3 == 1) { player2.add(p); } else { player3.add(p); } } //排序 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); Collections.sort(dipai); //出牌 System.out.println("玩家1的牌:" + player1); System.out.println("玩家2的牌:" + player2); System.out.println("玩家3的牌:" + player3); System.out.println("底牌:" + dipai); } } ``` 这个代码实现了斗地主的洗牌、发牌和出牌功能,代码中使用了 Java 的集合框架来实现洗牌和发牌,使用了排序方法对玩家的手牌进行排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值