Java怎么实现简易的洗牌和发牌功能

发布时间:2023-04-11 15:11:22 作者:iii
来源:亿速云 阅读:118

这篇“Java怎么实现简易的洗牌和发牌功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么实现简易的洗牌和发牌功能”文章吧。

代码思路

要想发牌跟洗牌我们首先需要有扑克牌,每张不同的牌对应不同的花色跟数字,这里就需要我们抽象出一副扑克牌对象,然后进行洗牌,洗牌我们就随机打乱扑克牌的顺序,然后就是发牌,每个人平均分发相同数量的扑克牌。

代码实现

我们在这里创建一个Poker的包用来包装我们跟扑克牌相关的类。在Poker包中创建三个Java文件:Poker文件用来产生扑克牌,包含花色跟点数;Game文件用来实现创建一套扑克牌、洗牌和发牌的功能;而Test文件则是我们用来测试的。

Poker的Java文件抽象出一张扑克牌

package poker;

public class Poker {

//扑克牌的点数
    private int rank;
//扑克牌的花色
    private String suit;

//创建构造方法
    public Poker(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

//以下这些方法我们今天暂时用不上
    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

//重写toString方法
    @Override
    public String toString() {
        return "{ "+rank+" "+suit+"}";
    }
}

Game的Java文件实现洗牌跟发牌功能

创建存放花色的字符串数组的成员变量

这些花色不能被更改,并且仅在当前类中可以使用,所以我们直接用
private static final修饰保证安全性。

private static final String[] suit = {"♥","♣","♦","♠"};

创建一副扑克牌

扑克牌我们用数组来存放

public List<Poker> buyPoker() {
        List<Poker> pokers = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <=13 ; j++) {
                Poker poker = new Poker(j,suit[i]);
                pokers.add(poker);
            }
        }
        return pokers;
    }

用Test来看是否创建成功,我们在写代码的时候要养成边写边测试的习惯,这样能及时发现错误。

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> poker = game.buyPoker();
    }
}

Java怎么实现简易的洗牌和发牌功能

洗牌

	public void shuffle(List<Poker> poker) {
        for (int i = poker.size()-1; i > 0 ; i--) {
            Random random = new Random();
            int index = random.nextInt(i);
            swap(poker,i,index);
        }
    }
    
//创建私有方法来实现交换
	private void swap(List<Poker> pokers,int i,int j) {
        Poker tmp = pokers.get(i);
        pokers.set(i,pokers.get(j));
        pokers.set(j,tmp);
    }

同样,我们进行一下测试。

Java怎么实现简易的洗牌和发牌功能

我们可以看到:我们的洗牌功能已经实现了,每次生成的扑克牌的顺序都是不一样的。

发牌

这里我们创建一个二维数组,分别存放三个玩家所分得的手牌。

public List<List<Poker>> game(List<Poker> pokers) {
        List<List<Poker>> hand = new ArrayList<>();
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        for (int i = 0; i < 3; i++) {
        //我们这里测试每人分发五张
            for (int j = 0; j < 5; j++) {
//我们默认每次从下标为0的位置分发,并且分发一次就移除这个下表为0的扑克牌,
//移除之后,它后面的数字也会自动补齐到0位置
                Poker tmp = pokers.remove(0);
                hand.get(i).add(tmp);
            }
        }
        return hand;
    }

整体功能实现

Poker.java

public class Poker {
    private int rank;
    private String suit;

    public Poker(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    @Override
    public String toString() {
        return "{ "+rank+" "+suit+"}";
    }
}

Game.java

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


public class Game {
    private static final String[] suit = {"♥","♣","♦","♠"};
    public List<Poker> buyPoker() {
        List<Poker> pokers = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <=13 ; j++) {
                Poker poker = new Poker(j,suit[i]);
                pokers.add(poker);
            }
        }
        return pokers;
    }

    //洗牌
    public void shuffle(List<Poker> poker) {
        for (int i = poker.size()-1; i > 0 ; i--) {
            Random random = new Random();
            int index = random.nextInt(i);
            swap(poker,i,index);
        }
    }

    private void swap(List<Poker> pokers,int i,int j) {
        Poker tmp = pokers.get(i);
        pokers.set(i,pokers.get(j));
        pokers.set(j,tmp);
    }

    public List<List<Poker>> game(List<Poker> pokers) {
        List<List<Poker>> hand = new ArrayList<>();
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                Poker tmp = pokers.remove(0);
                hand.get(i).add(tmp);
            }
        }
        return hand;
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> poker = game.buyPoker();
        System.out.println(poker);
        game.shuffle(poker);
        System.out.println(poker);
        List<List<Poker>> hand = game.game(poker);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌"+hand.get(i));
        }
        System.out.println("剩下的牌");
        System.out.println(poker);
    }
}

Java怎么实现简易的洗牌和发牌功能

以上就是关于“Java怎么实现简易的洗牌和发牌功能”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

推荐阅读:
  1. Java怎样实现俄罗斯方块游戏简单版
  2. Java怎么实现二叉搜索树的插入、删除功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么

下一篇:Python程序的分支结构实例代码分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》