如何用Java實現(xiàn)撲克牌比大小游戲,看這一篇就夠了:诔馈Q绺А!

一甫煞、目的

目的很單純菇曲。就是用Java寫個撲克游戲,在寫的過程中鍛煉自己的邏輯思維能力抚吠,熟練使用快捷鍵(快捷鍵的相關(guān)文章:Android studio必備快捷鍵)常潮,提高自己的編程速度,同時注意編程風(fēng)格的養(yǎng)成楷力。

@拾的柒

二喊式、知識點

1.單例設(shè)計模式
2.數(shù)組的使用 ArrayList
3.撲克牌游戲的實現(xiàn)

三、具體內(nèi)容

1.單例設(shè)計模式
定義:

指一個類只有一個實例弥雹,且該類能自行創(chuàng)建這個實例的一種模式垃帅。例如,Windows 中只能打開一個任務(wù)管理器剪勿,這樣可以避免因打開多個任務(wù)管理器窗口而造成內(nèi)存資源的浪費贸诚,或出現(xiàn)各個窗口顯示內(nèi)容的不一致等錯誤。

特點:

1.單例類只有一個實例對象;
2.該單例對象必須由單例類自行創(chuàng)建酱固;
3.單例類對外提供一個訪問該單例的全局訪問點械念;

其的兩種實現(xiàn)

1.餓漢式
該模式的特點是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用 getInstance 方法之前單例已經(jīng)存在了,故多線程使用的時候是安全的运悲。

class Poker{
    //default,sharedInstance,
    //2. 定義一個靜態(tài)成員變量 記錄這個單例對象
    //餓漢式
    public static final Poker shared=new Poker();
    //1. 構(gòu)造方法
    private Poker(){}
    public void test(){}
}

2.懶漢式
多線程使用時不安全龄减,可以通過加鎖來保證多線程訪問時會將完整的代碼加載完畢。

lass Player{
    public int count;
    //2.創(chuàng)建一個靜態(tài)變量
    private static Player shared=null;//有final就只能賦值一次
    //1構(gòu)造方法
    private Player(){}
    //3.提供給外部一個訪問方法
    //懶漢式  多線程時不建議使用 不安全
    //解決放法 加鎖
    public  static Player getInstance(){
        Object b = new Object();//加鎖
        synchronized (b) {//加鎖
            if (shared == null) {
                //如果沒有創(chuàng)建 那就創(chuàng)建一個
                shared = new Player();
            }
        }
        return shared;
    }
}
2.數(shù)組的使用 ArrayList
/數(shù)組真實內(nèi)存
   class Test2{
        public static void main(String[] agrs){
                /**
                 * //<>泛型
                 * 數(shù)組里面保存的都是對象的引用(指針 地址)
                 * 改變數(shù)組里面的屬性變量
                 * 原始對象的值也跟著改變
                 * 因為大家都是指向同一個內(nèi)存空間
                 */

                ArrayList<Person> people = new ArrayList<>();

                //添加數(shù)據(jù)
                Person xw = new Person();
                people.add(xw);

                Person zs = new Person();
                people.add(zs);

                //訪問數(shù)據(jù)
                Person xw2 = people.get(0);//取出xw進行保存
                xw2.name = "小王";
                System.out.println(xw2.name);
                System.out.println(xw.name); //均為小王
            }
        }
        class Person{
            public String name;
}
3.撲克牌游戲的實現(xiàn)
@拾的柒

四班眯、實際應(yīng)用 撲克牌游戲

Constant類

public class Constant {
   //用數(shù)組保存牌的點數(shù) 用ArrayList的話需要add 用一般數(shù)組
   public static final String [] DOTS = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//用索引值就直接可以比大小
   //保存固定的幾個花色 黑紅梅方
   public static final PokerType[] TYPES = {PokerType.SPADES,PokerType.HEARTS,PokerType.CLUBS,PokerType.DIAMOND};
   //保存默認的玩家姓名
   public static final String[] DEFAULT_NAMES = {"極光","卡利亞","克拉","曼羅"};
   //設(shè)置默認的金幣
   public static final int MONEY = 1000;
   //每局消耗的金幣數(shù) 底注
   public static final int BASE = 10;
}

GameCenter類

public class GameCenter {
    //記錄這局的籌碼
    private int totalMoney;

    //開始游戲
    public void start(){
        System.out.println("游戲開始希停,請打底");
        //扣除底注
        PlayerManager.manager.betAll(Constant.BASE);

        PlayerManager.manager.show();

        //發(fā)牌
        System.out.println("開始發(fā)牌");
        PokerManager.manager.dealCards(PlayerManager.manager.players);

        int time = 0;//記錄如果是2個人的次數(shù)
        //下注
        while (true){
            //獲取當前玩家的信息
            Player player = PlayerManager.manager.currentPlayer();
            //提示選擇操作
            System.out.println("請"+player.id+"號玩家選擇操作");
            Utils.showText(true,true,new String[]{"看牌","棄牌","下注"});
            int choice = Utils.getInput();

            boolean flag=false;
            switch(choice){
                case 1:
                    //看牌
                    System.out.println(player.getPokerString());
                    flag = true;
                    break;
                case 2:
                    //棄牌
                    player.hasDiscard=true;
                    System.out.println(player.id+"號玩家棄牌。");
                    break;
                default:
                    //下注
                    System.out.print("請輸入下注金額:");
                    break;
            }

            if(flag == false){
                //計算當前多少人可參與
                int available = PlayerManager.manager.leftPlayerCount();

                if(available==1){
                    break;
                }
                if(available == 2){
                    time++;
                    if(time == 4){
                        //兩回合結(jié)束
                        break;
                    }
                }
                //切換到下一個人
                PlayerManager.manager.changeNext();

            }
        }
    }
}

Myclass

public class MyClass {
    public  static void main(String[] args){
        //歡迎界面
        Utils.showText(true,true,new String[]{"歡迎來到星游撲克"});

       // PokerManger manger = new PokerManger();
        //生成一副牌
        PokerManager.manager.deal();
        //顯示一副牌
        PokerManager.manager.show();

       // PlayerManger playerManger = new PlayerManger();
        //提示輸入玩家人數(shù)
        Utils.showText(false,false,new String("請輸入玩家人數(shù):"));
        int count = Utils.getInput();
        //初始化玩家
        PlayerManager.manager.initPlayer(count);
        //顯示玩家信息
        PlayerManager.manager.show();

        //開始游戲
        GameCenter center = new GameCenter();
        center.start();
    }
}

Player

/**
 * 管理玩家的信息
 */
public class Player {
    public String name;
    public int id;
    public int money;
    public Poker poker;//記錄玩家手上有哪張牌7
    public Boolean hasDiscard;

    public Player(String name, int id, int money) {
        this.id = id;
        this.money = money;
        this.name = name;
    }

    //當打印一個對象的時候 就會默認去調(diào)用toString方法
    //如果當前來里面沒有實現(xiàn)這個方法 就到父類里面去查找
    //object里面默認實現(xiàn)就是打印對象的首地址
    public String toString() {
        //1號玩家


        return id+"號玩家: "+name+" 籌碼"+money +" "+getPokerString();
    }
public String getPokerString(){
        String pkString = "";
        if (poker != null){
            pkString  = poker.getDot() + poker.getType().getPic();
        }
        return pkString;
}


    /**
     * 打底&下注
     * @param count 下注金額
     * @return -1:失敗   >0 成功
     */
    public int bet(int count) {
        //判斷自己的金額是否大于下注金額
        if (money >= count) {
            money -= count;

            return count;//??不是money署隘?
        } else {
            return -1;
        }
    }

}

PlayerManager

import java.util.ArrayList;

public class PlayerManager {
    //記錄當前下注的玩家編號
    public int currentPlayerIndex = 0;
    //保存所有的玩家
    public ArrayList<Player> players = new ArrayList<>();

    //創(chuàng)建靜態(tài)變量
    public static final PlayerManager manager = new PlayerManager();
    //私有化
    private PlayerManager(){};

    //初始化玩家
    public void initPlayer(int count){
        for (int i = 0; i< count; i++){
            //創(chuàng)建玩家
            String name = Constant.DEFAULT_NAMES[i];
            Player player = new Player(name,i+1,Constant.MONEY);
            //保存所有玩家
            players.add(player);
        }
    }
    //輸出玩家信息
    public void show(){
        for (Player player:players){
            System.out.println(player);
        }
    }

    /**
     * 打底注
     * @param count
     * @return
     */


    public int betAll(int count){
        for(Player player:players){
            int result=player.bet(count);
            if(result==-1){
                return -1;
            }
        }
        //返回下注總金額
        return count*players.size();
    }

    /**
     * 獲取當前玩家的信息
     * @return
     */
    public Player currentPlayer(){
        return players.get(currentPlayerIndex);

    }

    /**
     * 當前剩余玩家數(shù)
     * @return
     */
    public int leftPlayerCount(){
        int total=0;
        for(int i = 0;i < players.size(); i++){
            Player player=players.get(i);
            //沒棄牌且有錢才能玩
            if(player.hasDiscard == false&&player.money>0){
                total++;
            }
        }
        return total;
    }

    /**
     * 查找下一個下注的人
     */
    public void changeNext(){
        int i=0;
        if(i == players.size()-1 ){
            i = 0;
        }
        //查找下一個可參與的玩家
        for(;i<players.size(); i++){
            Player player = players.get(i);
            if (player.hasDiscard == false&&player.money>0){
                currentPlayerIndex = i;
                return;
            }
        }
    }
}

Poker

public class Poker {
    private String dot;
    private PokerType type;

    public Poker(String dot,PokerType type){
        this.dot=dot;
        this.type=type;
    }

    //setter/getter方法
    public void setDot(String dot){
        this.dot=dot;
    }
    public String getDot(){
        return dot;
    }

    public PokerType getType() {
        return type;
    }

    public void setType(PokerType type) {
        this.type = type;
    }
}

PokerManager

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 * 管理牌的相關(guān)操作
 * 生成一副牌 洗牌 發(fā)牌 牌的比較
 */
public class PokerManager {
    //保存一副牌
    private ArrayList<Poker> pokers = new ArrayList<>();

    //創(chuàng)建靜態(tài)變量
    public static final PokerManager manager = new PokerManager();
    //私有化
    private PokerManager(){};

    //定義一個方法生成一副牌
    public void deal(){
        for(int i = 0;i < Constant.DOTS.length;i++){
            String dot = Constant.DOTS[i];

            //生成四種花色
            for(int j = 0;j<Constant.TYPES.length;j++) {
                //創(chuàng)建一張牌
                Poker poker = new Poker(dot, Constant.TYPES[j]);
                //保存這張牌
                pokers.add(poker);//?
            }
        }
        //洗牌
        Collections.shuffle(pokers);
    }
    //顯示一副牌
    public void show(){
        for(Poker poker:pokers){
            System.out.print(poker.getDot()+poker.getType().getPic()+" ");
            System.out.println();
        }
    }

    /**
     *給每個玩家發(fā)牌
     * @param players 所有的玩家
     */
    public void dealCards(ArrayList<Player> players){
        for(int i = 0;i < players.size(); i++){
            Player player = players.get(i);
            //將數(shù)組里面對應(yīng)的撲克牌給對應(yīng)的玩家
            player.poker = pokers.get(i);

        }
    }
}

PokerType

/**
 * 管理牌的圖案和比較大小
 */
public class PokerType {
    public static final PokerType SPADES = new PokerType("黑桃",4);
    public static final PokerType HEARTS = new PokerType("紅桃",3);
    public static final PokerType CLUBS = new PokerType("梅花",2);
    public static final PokerType DIAMOND = new PokerType("方片",1);
    private String  pic;
    private int id;
    //提供一個自定義的構(gòu)造方法 默認的構(gòu)造方法就被屏蔽了
    public PokerType(String pic,int id){
        this.pic = pic;
        this.id = id;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Utils

import java.util.Scanner;

public class Utils {
    //如果不需要保存數(shù)據(jù) 沒有成員變量
    //提供靜態(tài)方法 方便訪問
    public static void showText(Boolean hasStar,Boolean LineBreak,String...contents ){
        //星星否擒滑?
        System.out.print(hasStar?"********************\n":"");
        if(contents.length==1){
            System.out.print(contents[0]);
            //有星星時要換行
            System.out.print(hasStar?"\n":"");

        }else{
            //輸出帶編號的多行數(shù)據(jù)
            for(int i = 0;i < contents.length; i++){
                System.out.println((i+1)+". "+contents[i]);
            }
        }

        if(hasStar){
            System.out.println("********************");
        }

        //換行否况鸣?
        System.out.print(LineBreak?"\n":"");
    }
    //接收用戶輸入
    public static int getInput(){
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

五抑月、感悟

學(xué)習(xí)Java第四天了幼衰,今天真的是累的坐著(沒趴桌子)睡著了,簡直畫面太美不敢想象QAQ诊霹,看到聽到這些類滿腦子都是累羞延,還是要堅持下去,這個撲克游戲從開始自己一股腦寫完脾还,再到一修伴箩,再到現(xiàn)在的二修,花了很多精力和時間荠呐,從剛開始的粗略到現(xiàn)在的細致赛蔫,其實都是進步,雖然真的很累泥张,但是相信努力過后辛苦沒有白費的感覺是很不錯的呵恢,加油吧騷年!C拇础渗钉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钞钙,隨后出現(xiàn)的幾起案子鳄橘,更是在濱河造成了極大的恐慌,老刑警劉巖芒炼,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘫怜,死亡現(xiàn)場離奇詭異,居然都是意外死亡本刽,警方通過查閱死者的電腦和手機鲸湃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門赠涮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暗挑,你說我怎么就攤上這事笋除。” “怎么了炸裆?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵垃它,是天一觀的道長。 經(jīng)常有香客問我烹看,道長国拇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任惯殊,我火速辦了婚禮贝奇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靠胜。我一直安慰自己,他們只是感情好毕源,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布浪漠。 她就那樣靜靜地躺著,像睡著了一般霎褐。 火紅的嫁衣襯著肌膚如雪址愿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天冻璃,我揣著相機與錄音响谓,去河邊找鬼。 笑死省艳,一個胖子當著我的面吹牛娘纷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跋炕,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼赖晶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辐烂?” 一聲冷哼從身側(cè)響起遏插,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纠修,沒想到半個月后胳嘲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡扣草,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年了牛,在試婚紗的時候發(fā)現(xiàn)自己被綠了颜屠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡白魂,死狀恐怖汽纤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情福荸,我是刑警寧澤蕴坪,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站敬锐,受9級特大地震影響背传,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜台夺,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一径玖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颤介,春花似錦梳星、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辕近,卻和暖如春韵吨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背移宅。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工归粉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漏峰。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓糠悼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芽狗。 傳聞我的和親對象是個殘疾皇子绢掰,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361