您好,登錄后才能下訂單哦!
這篇“Java怎么實現簡易的洗牌和發牌功能”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java怎么實現簡易的洗牌和發牌功能”文章吧。
要想發牌跟洗牌我們首先需要有撲克牌,每張不同的牌對應不同的花色跟數字,這里就需要我們抽象出一副撲克牌對象,然后進行洗牌,洗牌我們就隨機打亂撲克牌的順序,然后就是發牌,每個人平均分發相同數量的撲克牌。
我們在這里創建一個Poker的包用來包裝我們跟撲克牌相關的類。在Poker包中創建三個Java文件:Poker文件用來產生撲克牌,包含花色跟點數;Game文件用來實現創建一套撲克牌、洗牌和發牌的功能;而Test文件則是我們用來測試的。
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+"}"; } }
創建存放花色的字符串數組的成員變量
這些花色不能被更改,并且僅在當前類中可以使用,所以我們直接用
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(); } }
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++) { //我們默認每次從下標為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怎么實現簡易的洗牌和發牌功能”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。