diff options
Diffstat (limited to 'aux/Card.java')
-rw-r--r-- | aux/Card.java | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/aux/Card.java b/aux/Card.java new file mode 100644 index 0000000..cabd2d9 --- /dev/null +++ b/aux/Card.java @@ -0,0 +1,140 @@ +package mahjong.aux; + +/** + * Created by joe on 12/1/14. + */ +public class Card { + int id = 0; + static final String[] typeName = {"Wan","Tong","Tiao","Feng","Yuan"}; + static final String[] typeSuffix = {"Wan","Tong","Tiao","Feng",""}; + static final String[] shuName = {"Guard","Guard","Yi","Er","San","Si","Wu","Liu","Qi","Ba","Jiu","Guard","Guard"}; + static final String[] fengName = {"Guard","Guard","Dong","Guard","Guard","Nan","Guard","Guard","Xi","Guard","Guard","Bei","Guard","Guard"}; + static final String[] yuanName = {"Guard","Guard","Fa","Guard","Guard","Zhong","Guard","Guard","Bai","Guard","Guard"}; + static final String exName = "Hong"; + static final String errName = "ERROR"; + + static public int parseSuffixNameId(String str) + { + int id; + for (int i=0;i<typeSuffix.length;++i) + if (str.compareToIgnoreCase(typeSuffix[i])==0) + return i; + return 0; + } + static public int parseOrdNameId(String str) + { + int id; + for (int i=0;i<shuName.length;++i) + if (str.compareToIgnoreCase(shuName[i])==0) + return i; + for (int i=0;i<fengName.length;++i) + if (str.compareToIgnoreCase(fengName[i])==0) + return i; + for (int i=0;i<yuanName.length;++i) + if (str.compareToIgnoreCase(yuanName[i])==0) + return i; + return 0; + } + static public int parseExId(String str) + { + if (str.compareToIgnoreCase(exName)==0) + return 1; + return 0; + } + + // Various Constructor + public Card(){} + public Card(int id) + { + this.id=id; + } + public Card(String name) + { + int type = 4; + int ord = 0; + int ex = 0; + if (name.charAt(0)==':') + { + ord = name.charAt(1)-47; + switch (name.charAt(2)) + { + case 'M': + type=0;break; + case 'P': + type=1;break; + case 'S': + type=2;break; + case 'F': + type=3;break; + case 'Z': + type=4;break; + } + if (name.length()>3) + ex=1; + id = (((type<<4)+ord)<<1)+ex; + return; + } + String[] res = name.split("\\s"); + + ex=parseExId(res[0]); + + ord = parseOrdNameId(res[ex]); + if (res.length > ex+1) + type = parseSuffixNameId(res[ex+1]); + id = (((type<<4)+ord)<<1)+ex; + } + + // Some Getters + public int getId() { + return id; + } + public int getStdId() {return id&0xFFFE;} + public int getTypeId() + { + return id>>5; + } + public int getOrdId() + { + return (id>>1)&0xF; + } + public int getExId() + { + return id&1; + } + public String getTypeName() {return typeName[getTypeId()];} + public String getTypeSuffix() {return typeSuffix[getTypeId()];} + public String getOrdName() + { + int type = getTypeId(); + int ord = getOrdId(); + if (isShu()) + return shuName[ord]; + if (isFeng()) + return fengName[ord]; + if (isYuan()) + return yuanName[ord]; + return errName; + } + public String getBaoName() + { + if ( getExId() > 0) + return exName; + return ""; + } + public String getNormalName() + { + return getBaoName().concat(" ") + .concat(getOrdName()).concat(" ") + .concat(getTypeSuffix()) + .trim(); + } + + // Some Testers + public boolean isShu() { return getTypeId()<3; } + public boolean isFeng() { return getTypeId() == 3; } + public boolean isYuan() { return getTypeId() == 4; } + public boolean isLaoTou() { return isShu()&& (getOrdId()&7) == 0; } + public boolean isZi() { return isFeng() || isYuan(); } + public boolean is19() { return isLaoTou() || isZi();} + public boolean isZhongZhang(){ return !is19(); } +}
\ No newline at end of file |