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