Java實(shí)現(xiàn)斗地主的發(fā)牌功能
斗地主是全國(guó)范圍內(nèi)的一種桌面游戲,盡管全國(guó)各種類型,但大同小異,今天我們先來(lái)實(shí)現(xiàn)一下斗地主中的發(fā)牌功能,為了程序的可讀性以及可拓展性,此次我們使用面向?qū)ο蟮姆椒▉?lái)實(shí)現(xiàn)此功能。
首先,斗地主要求有撲克和玩家才能開始游戲,所以這里我們首先要?jiǎng)?chuàng)建一個(gè)撲克牌實(shí)體類和一個(gè)玩家實(shí)體類,具體代碼如下:
首先是Poker類,含點(diǎn)數(shù),花色和排序?qū)傩?,大小王之后額外添加,這里我們必須實(shí)現(xiàn)一個(gè)Comparable接口,方便之后進(jìn)行排序:
public class Poker implements Comparable<Poker>{
private String flower;
private String pointer;
private int sort;
public Poker() {
}
public Poker(String flower, String pointer, int sort) {
super();
this.flower = flower;
this.pointer = pointer;
this.sort = sort;
}
public String getFlower() {
return flower;
}
public void setFlower(String flower) {
this.flower = flower;
}
public String getPointer() {
return pointer;
}
public void setPointer(String pointer) {
this.pointer = pointer;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
@Override
public String toString() {
return flower +"-" + pointer;
}
@Override
public int compareTo(Poker a) {
return this.getSort() - a.getSort();
}
}
然后就是Player類,這里我們定義屬性有id,玩家名字以及玩家手牌和是否地主:
import java.util.ArrayList;
public class Player {
private int id;
private String name;
private ArrayList<Poker> pokers = new ArrayList<>();
private boolean boss;
public Player() {
}
public Player(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Poker> getPokers() {
return pokers;
}
public void setPokers(ArrayList<Poker> pokers) {
this.pokers = pokers;
}
public boolean isBoss() {
return boss;
}
public void setBoss(boolean boss) {
this.boss = boss;
}
}
實(shí)體類建完之后,我們就要開始實(shí)現(xiàn)功能了,首先我們將要實(shí)現(xiàn)的功能簡(jiǎn)單敘述一下,首先我們要求有一副54張的完整牌,然后洗牌(此處我們用Collections里的靜態(tài)shuffle方法實(shí)現(xiàn)),然后開始按洗好的牌發(fā)牌51張,發(fā)完隨機(jī)地主,將剩余的三張牌給地主,并將三名玩家的牌均按大小顯示出來(lái)。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class PokerGame {
/**定義為靜態(tài)以簡(jiǎn)化代碼量*/
static List<Player> players;
static ArrayList<Poker> list = new ArrayList<>();
static String[] flowers = {"梅花","黑桃","方塊","紅桃"};
static String[] pointers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int bossIndex;
static{
for(int i = 0;i < flowers.length;i++){
for(int j = 0;j < pointers.length;j++){
Poker p = new Poker(flowers[i],pointers[j],j);
list.add(p);
}
}
list.add(new Poker("小","王",13));
list.add(new Poker("大","王",14));
players = Arrays.asList(
new Player(1,"胡燦"),
new Player(2,"戴豪杰"),
new Player(3,"馬濤")
);
}
/**隨機(jī)地主*/
public void pushBoss(){
/**隨機(jī)一個(gè)索引,隨到的為地主*/
Random r = new Random();
bossIndex = r.nextInt(players.size());
players.get(bossIndex).setBoss(true);
}
/**洗牌功能*/
public void XiPai(){
/**用Collections中的一個(gè)靜態(tài)方法實(shí)現(xiàn)隨機(jī)順序集合*/
Collections.shuffle(list);
}
/**發(fā)牌功能*/
public void FaPai(){
/**每次按順序給每人發(fā)一張牌直到51張牌發(fā)完*/
for(int i = 0;i < 51;i+=3){
players.get(0).getPokers().add(list.get(i));
players.get(1).getPokers().add(list.get(i+1));
players.get(2).getPokers().add(list.get(i+2));
}
/**將剩余的三張牌發(fā)給地主*/
for(int j = 51;j < 54;j++){
players.get(bossIndex).getPokers().add(list.get(j));
}
}
/**排序功能*/
public void PaiXu(){
/**用Collections的sort方法實(shí)現(xiàn)排序功能*/
Collections.sort(players.get(0).getPokers());
Collections.sort(players.get(1).getPokers());
Collections.sort(players.get(2).getPokers());
}
/**開始游戲*/
public void start(){
pushBoss();
XiPai();
FaPai();
PaiXu();
for(Player p:players){
System.out.println(p.getPokers());
}
}
}
下面我們來(lái)看看具體實(shí)現(xiàn):
public class Test {
public static void main(String[] args) {
new PokerGame().start();
}
}
結(jié)果如下:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)撲克牌的創(chuàng)建以及發(fā)放
在java當(dāng)中生成一副牌有很多種方法,有簡(jiǎn)單易于理解的面向過程編程,也有面向?qū)ο竽K化編程,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)撲克牌的創(chuàng)建以及發(fā)放的相關(guān)資料,需要的朋友可以參考下2023-03-03
在Java中編輯PowerPoint?PPTX文檔的操作過程
構(gòu)建用于程序化編輯?Open?Office?XML文檔(如?PowerPoint、Excel?和?Word)的應(yīng)用程序從未如此簡(jiǎn)單,在本文中,我們將專門討論?PowerPoint?演示文稿?XML(PPTX)文件的結(jié)構(gòu),并學(xué)習(xí)如何操作?PPTX?內(nèi)容的基本過程,需要的朋友可以參考下2025-04-04
Java中關(guān)于字典樹的算法實(shí)現(xiàn)
字典樹,又稱單詞查找樹,Trie樹,是一種樹形結(jié)構(gòu),哈希表的一個(gè)變種。用于統(tǒng)計(jì),排序和保存大量的字符串,本文針對(duì)字典樹給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
Java中的FutureTask實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java中的FutureTask手寫代碼實(shí)例,FutureTask是Future的實(shí)現(xiàn),用來(lái)異步任務(wù)的獲取結(jié)果,可以啟動(dòng)和取消異步任務(wù),查詢異步任務(wù)是否計(jì)算結(jié)束以及獲取最終的異步任務(wù)的結(jié)果,需要的朋友可以參考下2023-12-12
java數(shù)據(jù)隨機(jī)分頁(yè)實(shí)現(xiàn)方案
本文主要介紹了java數(shù)據(jù)隨機(jī)分頁(yè)實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

