Advertisement
Guest User

Rummikub

a guest
Nov 29th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.99 KB | None | 0 0
  1. import static java.lang.Math.*;
  2. import java.util.*;
  3. import java.util.stream.*;
  4. import java.util.regex.*;
  5. class RummikubGame{
  6.     public static void main(String[] args){
  7.         RummikubBag deck= new RummikubBag();
  8.         RummikubPlayer p1=new RummikubPlayer();
  9.         StringBuilder firstHand=new StringBuilder("p1 picked: ");
  10.         /*picks 14 cards*/
  11.         for(int i=0;i<14;i++){
  12.             String a=deck.pick();
  13.             p1.addCard(a);
  14.             firstHand.append(a+" ");
  15.         }
  16.         System.out.println(firstHand);
  17.         p1.firstMove();
  18.     }
  19. }
  20. class RummikubPlayer{
  21.     public final static int OPEN_NUM=30;
  22.     private final static String NONE="none";
  23.     private final static String REGEX_GROUP="[BRPY]{3,4}#\\d{1,2}";
  24.     private final static String REGEX_RUN="\\d{1,2}[_]\\d{1,2}";
  25.     HashMap<Character,List<Integer>> hand;
  26.     RummikubPlayer(){
  27.         hand= new HashMap<>();
  28.         for(int i=0;i<4;i++)
  29.             hand.put(getChar(i),new ArrayList<Integer>());
  30.     }
  31.     void firstMove(){
  32.         sortHand();
  33.         StringBuilder out=new StringBuilder("rack:[ ");
  34.         String groups=tryGroups();
  35.         String runs=tryRuns();
  36.         int currVal=0;
  37.         if(runs.length()==0&&groups.length()==0){
  38.             System.out.println("no run or group possible");
  39.         }
  40.         else if(runs.length()==0){
  41.             Matcher m=Pattern.compile(REGEX_GROUP).matcher(groups);
  42.             while(m.find()){
  43.                 String r=groups.substring(m.start(),m.end());
  44.                 int mul=r.substring(0,r.indexOf("#")).length();
  45.                 int n=Integer.parseInt(r.substring(r.indexOf("#")+1));
  46.                 currVal+=(mul*n);
  47.             }
  48.         }
  49.         else if(groups.length()==0){
  50.             Matcher m=Pattern.compile(REGEX_RUN).matcher(runs);
  51.             while(m.find()){
  52.                 String t=runs.substring(m.start(),m.end());
  53.                 int a=Integer.parseInt(t.substring(0,t.indexOf("_")));
  54.                 int b=Integer.parseInt(t.substring(t.indexOf("_")+1));
  55.                 currVal+=(a*(a+1))/2-((b-1)*b)/2;
  56.             }
  57.         }
  58.         else{
  59.             Matcher m=Pattern.compile(REGEX_GROUP).matcher(groups);
  60.             while(m.find()){
  61.                 String r=groups.substring(m.start(),m.end());
  62.                 int mul=r.substring(0,r.indexOf("#")).length();
  63.                 int n=Integer.parseInt(r.substring(r.indexOf("#")+1));
  64.                 currVal+=(mul*n);
  65.             }
  66.             m=Pattern.compile(REGEX_RUN).matcher(runs);
  67.             while(m.find()){
  68.                 String t=runs.substring(m.start(),m.end());
  69.                 int a=Integer.parseInt(t.substring(0,t.indexOf("_")));
  70.                 int b=Integer.parseInt(t.substring(t.indexOf("_")+1));
  71.                 currVal+=(a*(a+1))/2-((b-1)*b)/2;
  72.             }          
  73.         }
  74.         if(currVal<OPEN_NUM){
  75.             System.out.println("IMPOSSIBLE");
  76.         }
  77.         else{
  78.             System.out.println(runs+"\n"+groups);
  79.         }
  80.        
  81.     }
  82.     void addCard(String card){
  83.         if(!card.equals("EMPTY")){
  84.             Integer num=Integer.valueOf(card.substring(1));
  85.             hand.get(card.charAt(0)).add(num);
  86.         }
  87.     }
  88.     /*returns possible groups
  89.      *format used e.g. "BYP#13 RYP#2 " */
  90.     private String tryGroups(){
  91.         StringBuilder out=new StringBuilder();
  92.         ArrayList<Integer> alreadyPicked=new ArrayList<>();
  93.         boolean r=false,y=false,p=false,b=false;
  94.         //Looks for group a looping B list
  95.         for(Integer s:hand.get('B')){
  96.             if(!alreadyPicked.contains(s)){
  97.                 r=hand.get('R').contains(s);
  98.                 y=hand.get('Y').contains(s);
  99.                 p=hand.get('P').contains(s);
  100.                 if(r&&y||r&&p||p&&y){
  101.                     alreadyPicked.add(s);
  102.                     out.append("B");
  103.                     if(r)out.append('R');
  104.                     if(y)out.append('Y');
  105.                     if(p)out.append('P');
  106.                     out.append("#").append(s).append(" ");
  107.                 }
  108.             }
  109.         }
  110.         //Looks for a group looping R list
  111.         for(Integer s:hand.get('R')){
  112.             if(!alreadyPicked.contains(s)){
  113.                 b=hand.get('B').contains(s);
  114.                 y=hand.get('Y').contains(s);
  115.                 p=hand.get('P').contains(s);
  116.                 if(b&&y||b&&p||y&&p){
  117.                     alreadyPicked.add(s);
  118.                     out.append("R");
  119.                     if(b)out.append('B');
  120.                     if(y)out.append('Y');
  121.                     if(p)out.append('P');
  122.                     out.append("#").append(s).append(" ");
  123.                 }
  124.             }
  125.         }
  126.         return out.toString();
  127.     }
  128.     /*Looks for every possible run
  129.      *(3 cards abc same suit / b=a-1 c=a-2)*/
  130.     private String tryRuns(){
  131.         StringBuilder out=new StringBuilder();
  132.         String b=findRunsOfSuit('B');
  133.         String r=findRunsOfSuit('R');
  134.         String y=findRunsOfSuit('Y');
  135.         String p=findRunsOfSuit('P');
  136.        
  137.         if(!b.equals(NONE))out.append(b);
  138.         if(!r.equals(NONE))out.append(r);
  139.         if(!y.equals(NONE))out.append(y);
  140.         if(!p.equals(NONE))out.append(p);
  141.        
  142.         return out.toString();
  143.     }
  144.     /*finds every possible run of a v suit
  145.      * and returns in a String with this format:
  146.      * "B>13_10#5_3/"*/
  147.     private String findRunsOfSuit(char v){
  148.         ArrayList<Integer> copy=new ArrayList<>(hand.get(v));
  149.        
  150.         boolean b=false,c=false;
  151.         StringBuilder out=new StringBuilder().append(v).append(">");
  152.         if(copy.size()<3)
  153.             return NONE;
  154.         int s=copy.get(copy.size()-1);
  155.         while(s>=2){
  156.             if(copy.contains(s)){
  157.                 b=copy.contains(s-1);
  158.                 c=copy.contains(s-2);
  159.                 if(b&&c){
  160.                     copy.remove(new Integer(s-1));
  161.                     int t=s-2;
  162.                     while(copy.contains(t)){
  163.                         copy.remove(new Integer(t));
  164.                         t--;
  165.                     }
  166.                     out.append(s).append("_").append(t+1).append("#");
  167.                 }
  168.             }
  169.             s--;
  170.         }
  171.         if(out.toString().matches("[BRYP][>]"))
  172.             return NONE;
  173.         else
  174.             return out.append("/").toString();
  175.     }
  176.     private int getIndex(char v){
  177.         return (v=='B')?0:(v=='R')?1:(v=='Y')?2:3;
  178.     }
  179.     private char getChar(int v){
  180.         return (v==0)?'B':(v==1)?'R':(v==2)?'Y':'P';
  181.     }
  182.     private void sortHand(){
  183.         for(int i=0;i<hand.size();i++)
  184.             Collections.sort(hand.get(getChar(i)));
  185.     }
  186. }
  187. class RummikubBag{
  188.     StringBuilder bag;
  189.     RummikubBag(){
  190.         bag=new StringBuilder(104);
  191.         char max=105;
  192.         for(char i=1;i<max;i++)
  193.             bag.append(i);
  194.     }
  195.     boolean isEmpty(){
  196.         return bag.length()==0;
  197.     }
  198.     int getTilesLeft(){
  199.         return bag.length();
  200.     }
  201.     String pick(){
  202.         if(isEmpty())
  203.             return "EMPTY";
  204.  
  205.         StringBuilder out=new StringBuilder();
  206.         int index=(int)rint((bag.length()-1)*random());
  207.         int tile=bag.charAt(index);
  208.         int num=tile%13;
  209.        
  210.         bag.deleteCharAt(index);
  211.         //suit
  212.         if(tile<=26)
  213.             out.append("B");
  214.         else if(tile<=52)
  215.             out.append("R");
  216.         else if(tile<=78)
  217.             out.append("Y");
  218.         else
  219.             out.append("P");
  220.         //tile number
  221.         if(num==0)
  222.             out.append(13);
  223.         else
  224.             out.append(num);   
  225.         return out.toString();
  226.     }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement