欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)簡(jiǎn)易的洗牌和發(fā)牌功能

 更新時(shí)間:2023年04月11日 11:19:20   作者:不能再留遺憾了  
本文主要介紹了Java實(shí)現(xiàn)簡(jiǎn)易的洗牌和發(fā)牌功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在日常生活中,想必大家都玩過(guò)或者聽(tīng)過(guò)斗地主吧,斗地主大致分為三個(gè)過(guò)程:洗牌,發(fā)牌,玩家按照規(guī)則將手中的牌給打完,誰(shuí)最先打完,誰(shuí)就獲勝。這聽(tīng)起來(lái)挺簡(jiǎn)單的,但是影響你勝利的因素有很多:洗牌,玩家的水平。在賭場(chǎng)中很多人就是在洗牌跟發(fā)牌的過(guò)程中作弊的,那么我們可不可以用代碼來(lái)實(shí)現(xiàn)洗牌跟發(fā)牌的功能來(lái)實(shí)現(xiàn)相對(duì)公平呢?

代碼思路

要想發(fā)牌跟洗牌我們首先需要有撲克牌,每張不同的牌對(duì)應(yīng)不同的花色跟數(shù)字,這里就需要我們抽象出一副撲克牌對(duì)象,然后進(jìn)行洗牌,洗牌我們就隨機(jī)打亂撲克牌的順序,然后就是發(fā)牌,每個(gè)人平均分發(fā)相同數(shù)量的撲克牌。

代碼實(shí)現(xiàn)

我們?cè)谶@里創(chuàng)建一個(gè)Poker的包用來(lái)包裝我們跟撲克牌相關(guān)的類。在Poker包中創(chuàng)建三個(gè)Java文件:Poker文件用來(lái)產(chǎn)生撲克牌,包含花色跟點(diǎn)數(shù);Game文件用來(lái)實(shí)現(xiàn)創(chuàng)建一套撲克牌、洗牌和發(fā)牌的功能;而Test文件則是我們用來(lái)測(cè)試的。

Poker的Java文件抽象出一張撲克牌

package poker;

public class Poker {

//撲克牌的點(diǎn)數(shù)
    private int rank;
//撲克牌的花色
    private String suit;

//創(chuàng)建構(gòu)造方法
    public Poker(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

//以下這些方法我們今天暫時(shí)用不上
    public int getRank() {
        return rank;
    }

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

    public String getSuit() {
        return suit;
    }

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

Game的Java文件實(shí)現(xiàn)洗牌跟發(fā)牌功能

創(chuàng)建存放花色的字符串?dāng)?shù)組的成員變量

這些花色不能被更改,并且僅在當(dāng)前類中可以使用,所以我們直接用
private static final修飾保證安全性。

private static final String[] suit = {"?","?","?","?"};

創(chuàng)建一副撲克牌

撲克牌我們用數(shù)組來(lái)存放

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來(lái)看是否創(chuàng)建成功,我們?cè)趯?xiě)代碼的時(shí)候要養(yǎng)成邊寫(xiě)邊測(cè)試的習(xí)慣,這樣能及時(shí)發(fā)現(xiàn)錯(cuò)誤。

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

洗牌

	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);
        }
    }
    
//創(chuàng)建私有方法來(lái)實(shí)現(xiàn)交換
	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);
    }

同樣,我們進(jìn)行一下測(cè)試。

我們可以看到:我們的洗牌功能已經(jīng)實(shí)現(xiàn)了,每次生成的撲克牌的順序都是不一樣的。

發(fā)牌

這里我們創(chuàng)建一個(gè)二維數(shù)組,分別存放三個(gè)玩家所分得的手牌。

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++) {
        //我們這里測(cè)試每人分發(fā)五張
            for (int j = 0; j < 5; j++) {
//我們默認(rèn)每次從下標(biāo)為0的位置分發(fā),并且分發(fā)一次就移除這個(gè)下表為0的撲克牌,
//移除之后,它后面的數(shù)字也會(huì)自動(dòng)補(bǔ)齊到0位置
                Poker tmp = pokers.remove(0);
                hand.get(i).add(tmp);
            }
        }
        return hand;
    }

整體功能實(shí)現(xiàn)

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)+"個(gè)人的牌"+hand.get(i));
        }
        System.out.println("剩下的牌");
        System.out.println(poker);
    }
}

 到此這篇關(guān)于Java實(shí)現(xiàn)簡(jiǎn)易的洗牌和發(fā)牌功能的文章就介紹到這了,更多相關(guān)Java 洗牌和發(fā)牌內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • elasticsearch 8.2.3 安裝及springboot簡(jiǎn)單使用

    elasticsearch 8.2.3 安裝及springboot簡(jiǎn)單使用

    這篇文章主要介紹了elasticsearch 8.2.3 安裝及springboot簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 使用Files.walkFileTree遍歷目錄文件

    使用Files.walkFileTree遍歷目錄文件

    這篇文章主要介紹了使用Files.walkFileTree遍歷目錄文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺析Java 數(shù)據(jù)結(jié)構(gòu)常用接口與類

    淺析Java 數(shù)據(jù)結(jié)構(gòu)常用接口與類

    本篇文章主要介紹了Java中的數(shù)據(jù)結(jié)構(gòu),Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。需要的朋友可以參考下
    2017-04-04
  • 詳解JAVA流程控制語(yǔ)句

    詳解JAVA流程控制語(yǔ)句

    這篇文章主要介紹了Java中的流程控制語(yǔ)句,循環(huán)等語(yǔ)句是Java編程中流程控制的基礎(chǔ),需要的朋友可以參考下
    2017-04-04
  • Java xml數(shù)據(jù)格式返回實(shí)現(xiàn)操作

    Java xml數(shù)據(jù)格式返回實(shí)現(xiàn)操作

    這篇文章主要介紹了Java xml數(shù)據(jù)格式返回實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • DecimalFormat多種用法詳解

    DecimalFormat多種用法詳解

    這篇文章主要為大家詳細(xì)介紹了DecimalFormat的多種用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java模擬post請(qǐng)求登錄貓撲示例分享

    java模擬post請(qǐng)求登錄貓撲示例分享

    這篇文章主要介紹了java模擬post請(qǐng)求登錄貓撲的小示例,需要的朋友可以參考下
    2014-02-02
  • Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)

    Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)

    這篇文章主要給大家介紹了關(guān)于Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java Process.waitFor()方法詳解

    Java Process.waitFor()方法詳解

    這篇文章主要介紹了Java Process.waitFor()方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java中Servlet處理亂碼的方法

    java中Servlet處理亂碼的方法

    java中Servlet處理亂碼的方法,需要的朋友可以參考一下
    2013-03-03

最新評(píng)論