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項條款。制定條款的目的是在程序設計的過程中(觸犯和)約束代碼風格,希望切實可