summaryrefslogtreecommitdiff
path: root/aux/Card.java
blob: c84b9bb5beb2767cdc4dbd45960a3ed84dca5137 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package mahjong.aux;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 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(); }

    public static Card readCardFromInput()
    {
        BufferedReader br = new BufferedReader(new
                InputStreamReader(System.in));
        String cardStr="Yi Wan";
        try {
            cardStr = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new Card(cardStr);
    }

    // TODO This way of input will certainly kill users
    public static Card[] readMultipleCardFromInput(int num)
    {
        Card[] res=new Card[num];
        for (int i=0;i<num;++i)
            res[i]=readCardFromInput();
        return res;
    }
}