1. 程式人生 > >JAVA第四次作業——使用列舉類對撲克牌建模

JAVA第四次作業——使用列舉類對撲克牌建模

0x00  簡述

使用列舉型別對一副撲克牌(52張牌,不包括大小王)建模:
一副撲克牌有四種花色(Suit):HEART,SPADE,DIAMOND,CLUB;
有十三種等級(Rank):ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING;
建立2個列舉型別包含這兩類例項。
每張撲克牌(Card)物件都會有這兩個屬性,建立一個帶有這兩個列舉型別屬性的類Card。

0x01  為每個花色及大小建模

建立一個Poker類,為花色和大小分別建立兩個列舉集。

public class Poker {
    enum Suit{HEART("♥",1),SPADE("♠",2),DIAMOND("♦",3),CLUB("♣",4);

        public String s;
        public int i;

        Suit(String s,int i) {
            this.s=s;
            this.i=i;
        }

        public String getS() {
            return s;
        }

        public int getI() {
            return i;
        }
    }
    enum Rank{TWO("2",2),THREE("3",3),FOUR("4",4),FIVE("5",5),SIX("6",6),SEVEN("7",7),EIGHT("8",8),NINE("9",9),TEN("10",10),JACK("J",11),QUEEN("Q",12),KING("K",13),ACE("A",14);

        public String r;
        public int i;

        Rank(String r,int i) {
            this.r=r;
            this.i=i;
        }

        public String getR() {
            return r;
        }

        public int getI() {
            return i;
        }
    }
}



這樣,我們就有了建立一張牌的介面。

0x02  建立一張單牌

建立一個Card類,用來表明和獲取一張牌的花色大小。

public class Card {
    public  Poker.Rank rank;
    public  Poker.Suit suit;
    public Card(Poker.Suit suit,Poker.Rank rank){
        this.rank=rank;
        this.suit=suit;
    }

    public Poker.Rank getRank() {
        return rank;
    }

    public Poker.Suit getSuit() {
        return suit;
    }

    @Override
    public String toString() {
        return suit.getS()+rank.getR();
    }

}

在上述程式碼中,使用toString()方法即可獲得該卡的資訊。

0x03  判斷五張牌組成的套牌大小

根據德州撲克的玩法介紹,五張牌的花色大小決定這套牌的大小,所以我們寫一個方法為每套牌計算權重。

import java.util.Arrays;
import java.util.Comparator;

class CardSet implements Comparable {

    public Card[] cards = new Card[5];

    public CardSet(Card[] cards) {
        this.cards = cards;
        Arrays.sort(cards, new cmp());
    }

    public String getCard() {
        for(int i=0;i<5;i++) {
            System.out.print(cards[i].getSuit().s + cards[i].getRank().r+",");
        }
        return (" ");
    }

    public int getHigh() {
        int max = 0;
        for (Card c : cards) {
            if (c.getRank().getI() > max)
                max = c.getRank().getI();
            if (c.getRank().getI() == 1)
                max = 14;
        }
        return max;
    }

    public int getPair() {
        int res = 0;
        for(int i=0;i<5;i++){
            for(int j=i+1;j<5;j++){
                if(cards[i].getRank()==cards[j].getRank())
                    res++;
            }
        }
        return res;
    }

    public boolean isThree() {
        return (getPair()==3);
    }

    public int isStraight() {
        int a = cards[4].getRank().getI() - cards[3].getRank().getI();
        int b = cards[3].getRank().getI() - cards[2].getRank().getI();
        int c = cards[2].getRank().getI() - cards[1].getRank().getI();
        int d = cards[1].getRank().getI() - cards[0].getRank().getI();
        if (a == b && b == c && c == d) {
            return 1;
        } else if (a == b && b == c && d == 0) {
            return 2;
        }
        return 0;
    }

    public boolean isFlush() {
        for (int i = 0; i < 4; i++) {
            if (cards[i].getSuit() != cards[i + 1].getSuit())
                return false;
        }
        return true;
    }

    public boolean isFullHouse() {
        return (getPair() == 4);
    }

    public boolean isFour() {
        return (getPair()==6);
    }

    public boolean isStraightFlush() {
        return (isStraight() == 1) && isFlush();
    }

    public boolean isRoyal() {
        return (isStraight() == 2) && isFlush();
    }

    public int getPoints() {
        if (isRoyal())
            return 23;
        else if (isStraightFlush())
            return 22;
        else if (isFour())
            return 21;
        else if (isFullHouse())
            return 20;
        else if (isFlush())
            return 19;
        else if (isStraight() != 0)
            return 18;
        else if (isThree())
            return 17;
        else if (getPair() == 2)
            return 16;
        else if (getPair() == 1)
            return 15;
        else
            return getHigh();
    }

    public String getName() {
        if (isRoyal())
            return "皇家同花順";
        else if (isStraightFlush())
            return "同花順";
        else if (isFour())
            return "四條";
        else if (isFullHouse())
            return "葫蘆";
        else if (isFlush())
            return "同花";
        else if (isStraight() != 0)
            return "順子";
        else if (isThree())
            return "三條";
        else if (getPair() == 2)
            return "兩對";
        else if (getPair() == 1)
            return "一對";
        else
            return "散牌";

    }

    @Override
    public int compareTo(Object o) {
        if (this.getPoints() != ((CardSet) o).getPoints()) {
            if (this.getPoints() > ((CardSet) o).getPoints())
                return 1;
            else
                return -1;
        } else
            return 0;
    }

    class cmp implements Comparator {
        @Override
        public int compare(Object o1, Object o2) {
            Card c1 = (Card) o1;
            Card c2 = (Card) o2;
            if (c1.getRank().getR() != c2.getRank().getR())
                return c1.getRank().getI() > c2.getRank().getI() ? 1 : -1;
            else
                return 0;
        }
    }
}

其中散牌的權重為2-14依據其中最大單牌決定,而一對到皇家同花順的權重從15依次加到23。

0x04  建立不同的幾套牌進行比對

public class Main {
    public static void main(String[] args) {
        Card[] c1={new Card(Poker.Suit.DIAMOND,Poker.Rank.ACE ),new Card(Poker.Suit.DIAMOND,Poker.Rank.JACK ),new Card(Poker.Suit.DIAMOND,Poker.Rank.KING),
                new Card(Poker.Suit.DIAMOND,Poker.Rank.TEN ),new Card(Poker.Suit.DIAMOND,Poker.Rank.QUEEN )};
        Card[] c2={new Card(Poker.Suit.SPADE,Poker.Rank.JACK ),new Card(Poker.Suit.HEART,Poker.Rank.JACK ),new Card(Poker.Suit.CLUB,Poker.Rank.JACK),
                new Card(Poker.Suit.CLUB,Poker.Rank.FIVE ),new Card(Poker.Suit.SPADE,Poker.Rank.TWO )};
        Card[] c3={new Card(Poker.Suit.DIAMOND,Poker.Rank.ACE ),new Card(Poker.Suit.DIAMOND ,Poker.Rank.FOUR ),new Card(Poker.Suit.DIAMOND,Poker.Rank.THREE),
                new Card(Poker.Suit.CLUB,Poker.Rank.NINE ),new Card(Poker.Suit.SPADE,Poker.Rank.SIX )};
        Card[] c4={new Card(Poker.Suit.HEART,Poker.Rank.KING ),new Card(Poker.Suit.HEART,Poker.Rank.EIGHT ),new Card(Poker.Suit.DIAMOND,Poker.Rank.THREE ),
                new Card(Poker.Suit.CLUB,Poker.Rank.SEVEN ),new Card(Poker.Suit.SPADE,Poker.Rank.SEVEN )};
        Card[] c5={new Card(Poker.Suit.HEART,Poker.Rank.QUEEN ),new Card(Poker.Suit.HEART,Poker.Rank.TWO ),new Card(Poker.Suit.SPADE,Poker.Rank.THREE ),
                new Card(Poker.Suit.HEART,Poker.Rank.SEVEN ),new Card(Poker.Suit.DIAMOND,Poker.Rank.SEVEN )};

        CardSet deck1 = new CardSet(c1);
        CardSet deck2 = new CardSet(c2);
        CardSet deck3 = new CardSet(c3);
        CardSet deck4 = new CardSet(c4);
        CardSet deck5 = new CardSet(c5);
        System.out.print("套牌一為:");
        System.out.println(deck1.getCard() + "種類是: " + deck1.getName());
        System.out.print("套牌二為:");
        System.out.println(deck2.getCard() + "種類是: " + deck2.getName());
        System.out.print("套牌三為:");
        System.out.println(deck3.getCard() + "種類是: " + deck3.getName());
        System.out.print("套牌四為:");
        System.out.println(deck4.getCard() + "種類是: " + deck4.getName());
        System.out.print("套牌五為:");
        System.out.println(deck5.getCard() + "種類是: " + deck5.getName());
        System.out.println("套牌一是否比套牌二大:"+deck1.compareTo(deck2));
        System.out.println("套牌二是否比套牌三大:"+deck2.compareTo(deck3));
        System.out.println("套牌三是否比套牌一大:"+deck3.compareTo(deck1));
        System.out.println("套牌三是否比套牌四大:"+deck3.compareTo(deck4));
        System.out.println("套牌五是否比套牌二大:"+deck5.compareTo(deck2));
        System.out.println("套牌五是否比套牌四大:"+deck5.compareTo(deck4));
    }
}

執行後如圖所示
在這裡插入圖片描述

0x05  小結

列舉類通常用於一個類的物件是有限且固定的時候。對於撲克牌大小比較這塊,還是借鑑肖大佬許多部分,實屬慚愧。這次程式碼的比較部分還有許多缺陷,如在兩套牌牌型一致,但最大單牌不同時,程式仍會把兩套牌認為大小相同,如上圖套牌4和5。又由於構造套牌方式的問題,無法為這5套牌一併進行大小比對。

相關推薦

JAVA作業——使用列舉撲克牌建模

0x00  簡述 使用列舉型別對一副撲克牌(52張牌,不包括大小王)建模: 一副撲克牌有四種花色(Suit):HEART,SPADE,DIAMOND,CLUB; 有十三種等級(Rank):ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIG

Java作業

lin blank 繼承 font pan ips 軟件設計 dial csdn 題目描寫敘述: 參考第三次作業的源碼,完畢以下問題的編程:升級雨刷系統,使得業務流程例如以下圖所看到的。要求:1.採用軟件設計的”開-閉“原則。即源碼(Lever、Dial、Brus

JAVA作業(2介面練習題)

課堂練習2:大學裡的學生(Student)需要交學費,而研究生(Graduate)作為學生比較特殊,除了需要交學費外,還可以獲取一部分科研津貼,由學校(University)統一發放。此外,學校還需要發放教師(Teacher)的工資。 編寫程式碼模擬上述場景: 1)   

程式設計作業-java“肯德基點餐系統-圖+java程式+除錯測試截圖”

題目: 同學們應該都去麥當勞或肯德基吃過快餐吧?請同學們參考肯德基官網的資訊模擬肯德基快餐店的收銀系統,合理使用C++/python/Java,結合設計模式(2種以上)實現系統的以下功能: 1.正常餐品結算和找零。 2.基本套餐結算和找零。 3.使用優惠劵購買餐

Java程序設計作業內容

ase 定義 cnblogs 設計 分支 鍵盤 12個 nth 情況 第六題:使用判斷語句,根據數字,輸出對應的中文是星期幾? 直接使用一個if語句的情況 int weekDay=3; if(weekDay==1){   sop("今天是星期一"); } if(weekDa

OO作業-前三作業總結

效果 感到 增加 時間 第一次作業 重要 發現 改進 並不是 第一次作業由於直接沒怎麽學過java,全靠一星期速成,前幾天看了java的語法,但是因為光看沒有打代碼,學習效果並不是特別好。由面向過程轉向面向對象,不是特別清楚該怎麽辦,雖然寫的是兩個類,但實際上是one-fo

作業測試代碼+018+李濱

double adapt scan 類圖 handle 作業 () || != 一、類圖 二、代碼 import java.util.Scanner; public class homeWork01 { public static String triangle(S

2014080360107作業

lac image repeat-y tex center gif line text ppp .x1 { font-size: 200% } div p { font-style: italic } p[align] { color: red } p[align="rig

2017年軟件工程作業-1代碼規範

不同 都沒有 ucid word -1 代碼量 目的 tex studio one 結對同學:黃澤宇 地址:http://www.cnblogs.com/ddzchild/p/7635239.html two 要求1 《代碼規範》包括10項條款。制定條款的目的是在程序設計的

軟件工程作業二—單元測試 —[結對劉成誌]

mil blog erro 操作數棧 得出 遍歷字符串 兩個 檢查 等於 單元測試: 結對開發成員:劉成誌 git代碼發布地址: 本次軟件工程作業程序代碼說明: 一、程序目的 本次作業目的在於設置一個四則運算的計算機,根據需求,我大致劃分了四個功能: 1.不

軟件工程作業——代碼規範

兩個人 擴展 情況下 ++ 軟件 代碼註釋 編譯 swe 次數 作業要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/993 代碼規範文檔: 結對夥伴:田繼平 一、代碼規範原因: 代碼是程序

作業四則運算

bsp 作用 表達式 cnblogs 四則運算 討論 .com 個數 oev 代碼git地址:https://git.coding.net/Rainbows/ruanjiangongcheng.git 對於本周作業,老師要求的是結對編程。作業要求如下: 功能1. 四則運算

軟件工程——作業(3)

一起 習慣 算法 ges 結對編程 問題 保留 清理 表達式 要求一 (1) 給出每個功能的重點、難點、編程收獲。(2)給出結對編程的體會(3) 至少5項在編碼、爭論、復審等活動中花費時間較長,給你較大收獲的事件。 答:(1)功能的重點、難點及編程收獲 a.對運算符的考慮。

軟件工程作業 - 每周例行匯報

order wid bsp 代碼 匯報 img 後綴表達式 .cn -1 本周PSP 本周進度條 博文字數 1437字 代碼行數 415行 所用知識點 中綴表達式轉換後綴表達式 累計進度圖

軟件工程作業-1代碼規範

下劃線 多功能 是否 技術分享 說明 困難 image 變量命名 ase 結對同學:姜珊 排版規範 1.在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之後或者前後要加空格;進行非對等操作時,如果是關系密切的立即操作符(如->),後不應加空格,

2017秋-軟件工程作業(4)-、五周例行總結

png src .cn 工程 行數 alt 文字 技術 分享 1本周PSP 2字數統計 3代碼行數 4博文字數 5本周餅狀圖 2017秋-軟件工程第四次作業(4)-第四、五周例行總結

軟件工程作業——單元測試

.com 第四次作業 str itl 要求 作業 軟件 home logs 作業要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/994 測試用例:https://git.coding.net/tianj

軟件工程-東北師大戰-作業(2)

lin logs ref lan bsp www div html 完成 結對編程成員: 徐劭斌,藺依銘 此項作業為兩人共同完成,博客作業發布地址為: http://www.cnblogs.com/linym762/p/7650093.html 軟件工程-東北師大戰-第四次

作業之單元測試

定義 .com 檢驗 編碼 一周 一次 註意 div das 結對成員:李圓圓 要求1 對每個功能,先給出測試用例,然後再編碼功能。請註意把測試用例視為功能需求完成的檢驗指標。 功能一:判斷符號的優先性。 功能二:判斷等式中括號出現位置是否正確。 功能三:命令行的字符判斷

作業之代碼規範

釋放 初始化 進行 過程 函數名 實現 在底部 查找 合成 這次作業,由我和李圓圓同學共同完成,結合老師的要求和對資料的查閱,對程序實施有效的約束,讓其方便觀察。 要求1 《代碼規範》包括10項條款。制定條款的目的是在程序設計的過程中(觸犯和)約束代碼風格,希望切實可