001    /**
002     * 
003     */
004    package jagafa.rule;
005    
006    import jagafa.object.Board;
007    import jagafa.object.Card;
008    import jagafa.object.Hand;
009    import jagafa.stats.CardTool;
010    
011    import java.util.Iterator;
012    
013    /**
014     * @author Besitzer
015     * 
016     */
017    public class ObenRules implements RuleSet {
018            private enum ObenHierarchy {
019                    CAs, CK, CQ, CJ, C10, C9, C8, C7, C6;
020            }
021    
022            public Card getHigherCard(Card c1, Card c2) {
023                    Board dummy = new Board();
024                    if (this.getPower(c1, dummy) > this.getPower(c2, dummy)) {
025                            return c1;
026                    } else {
027                            return c2;
028                    }
029            }
030    
031            public int getPower(Card c, Board b) {
032                    int power = 0;
033    
034                    power = this.getValueRank(c, b);
035    
036                    power += 100 * this.getColorRank(c, b);
037    
038                    return power;
039            }
040    
041            public int getScore(Card c) {
042                    switch (ObenHierarchy.values()[c.getValue()]) {
043                    case C6:
044                            return 0;
045                    case C7:
046                            return 0;
047                    case C8:
048                            return 8;
049                    case C9:
050                            return 0;
051                    case C10:
052                            return 10;
053                    case CJ:
054                            return 2;
055                    case CQ:
056                            return 3;
057                    case CK:
058                            return 4;
059                    case CAs:
060                            return 11;
061                    }
062    
063                    return 0;
064            }
065    
066            public boolean isValid(Card cardToCheck, Hand hand, Board board) {
067                    //System.out.println(cardToCheck);
068                    if (board.get(0) != null) {
069                            Card firstCard = board.get(0);
070                            int firstColor = firstCard.getColor();
071    
072                            // Wenn keine Karten von der startFarbe auf der hand, dann egal
073                            // welche Karte gespielt wird
074                            if (CardTool.getAllOfColor(hand, firstColor).size() == 0) {
075                                    return true;
076                            } else {
077                                    // Wenn noch Karten von der startFarbe, dann muss Karte von der
078                                    // gleichen Farbe sein
079                                    if (cardToCheck.getColor() == (firstColor)) {
080                                            return true;
081                                    } else {
082                                            return false;
083                                    }
084                            }
085    
086                    }
087    
088                    return true;
089            }
090    
091            
092            public int getValueRank(Card c, Board b) {
093                    
094                    
095                    for (ObenHierarchy o : ObenHierarchy.values()) {
096                            if (o.ordinal() == c.getValue()) {
097                                    return o.ordinal();
098                            }
099                    }
100                    return -1;
101            }
102    
103            
104            public int getColorRank(Card c, Board b) {
105                    if (b.cardsPlayed() > 0) {
106                            Card firstCard = b.get(0);
107                            int firstColor = firstCard.getColor();
108                            if (firstColor == c.getColor()) {
109                                    return 2;
110                            } else {
111                                    return 1;
112                            }
113                    }
114    
115                    return 2;
116            }
117    
118            
119            public boolean compareHigher(Card c1, Board b) {
120            int posc1 = getPower(c1, b);
121            int highestOnBoard = 0;
122    
123            Iterator<Card> boardIter = b.iterator();
124    
125            while (boardIter.hasNext()) {
126                Card nextC = boardIter.next();
127                int posBoard = this.getPower(nextC, b);
128                if (posBoard > highestOnBoard) {
129                    highestOnBoard = posBoard;
130                }
131            }
132    
133            if (posc1 >= highestOnBoard) {
134                return true;
135            }
136            return false;
137    
138        }
139    
140            /* (non-Javadoc)
141             * @see jass.rule.Rules#getName()
142             */
143            public String getName() {
144                    // TODO Auto-generated method stub
145                    return "Oben";
146            }
147    
148            /* (non-Javadoc)
149             * @see jass.rule.Rules#specialColor()
150             */
151            public int specialColor() {
152                    // TODO Auto-generated method stub
153                    return -1;
154            }
155            
156            public int hashCode()
157            {
158                    int sum = 0;
159                    char carray[] = this.getName().toCharArray();
160                    for (int i = 0;i<carray.length;i++) {
161                            sum += (int) carray[i];
162                    }
163                    
164                    return sum;
165            }
166    
167            public void updateAfterTurn() {
168                    // TODO Auto-generated method stub
169                    
170            }
171    }