diff options
| -rw-r--r-- | Main.java | 3 | ||||
| -rw-r--r-- | aux/set/Hand.java | 10 | ||||
| -rw-r--r-- | aux/set/Meld.java (renamed from aux/set/Aside.java) | 6 | ||||
| -rw-r--r-- | engine/Action.java | 83 | ||||
| -rw-r--r-- | engine/Engine.java | 15 | ||||
| -rw-r--r-- | engine/Logger.java | 7 | ||||
| -rw-r--r-- | player/CmdPlayerHandler.java | 47 | ||||
| -rw-r--r-- | player/GenericPlayer.java | 6 | ||||
| -rw-r--r-- | player/PlayerActionServer.java | 6 | ||||
| -rw-r--r-- | player/human/LocalHuman.java | 2 | ||||
| -rw-r--r-- | tools/Alert.java | 21 | ||||
| -rw-r--r-- | tools/Deck.java | 4 | 
12 files changed, 185 insertions, 25 deletions
| @@ -2,6 +2,7 @@ package mahjong;  import mahjong.aux.set.CardSet;  import mahjong.aux.set.Set; +import mahjong.engine.Action;  import mahjong.player.human.LocalHuman;  import mahjong.tools.Timer; @@ -32,6 +33,6 @@ public class Main {          timer.tock();          System.out.println(timer.elapse()); -        LocalHuman local=new LocalHuman("Joe"); +        System.out.println(new Action(new Action(Action.Type.System,Action.Place.Info,Action.Act.Info,"Test").toString()).toString());      }  } diff --git a/aux/set/Hand.java b/aux/set/Hand.java index a66944f..a865a90 100644 --- a/aux/set/Hand.java +++ b/aux/set/Hand.java @@ -23,19 +23,19 @@ public class Hand extends Set {          super(cards);      } -    public Vector<Aside> asides = new Vector<Aside>(); +    public Vector<Meld> melds = new Vector<Meld>();      public void init()      {          cards.clear(); -        asides.clear(); +        melds.clear();      }      public boolean huAble(Card card)      {          boolean hu=false;          accountant.add(card,1); -        if (accountant.calTing(asides.size())==0) +        if (accountant.calTing(melds.size())==0)              hu=true;          accountant.add(card,-1);          return hu; @@ -69,8 +69,8 @@ public class Hand extends Set {      public boolean jiaGangAble(Card card)      { -        for (Aside i:asides) -        if (i.getType()== Aside.Type.Peng && card.getStdId() == i.getRep()[0].getStdId()) +        for (Meld i:melds) +        if (i.getType()== Meld.Type.Peng && card.getStdId() == i.getRep()[0].getStdId())              return true;          return false;      } diff --git a/aux/set/Aside.java b/aux/set/Meld.java index 2a3b530..8da091b 100644 --- a/aux/set/Aside.java +++ b/aux/set/Meld.java @@ -6,21 +6,21 @@ import mahjong.player.GenericPlayer;  /**   * Created by joe on 12/2/14.   */ -public class Aside { +public class Meld {      public enum Type {Chi,Peng,aGang,mGang,jGang};      private Type type;      private Card[] rep;      private int from; -    public Aside(Card[] rep,Type type,int from) +    public Meld(Card[] rep,Type type,int from)      {          this.rep=rep;          this.type=type;          this.from=from;      } -    public Aside(Card[] rep,Type type) +    public Meld(Card[] rep,Type type)      {          this.rep=rep;          this.type=type; diff --git a/engine/Action.java b/engine/Action.java index 3009fa0..3f2f365 100644 --- a/engine/Action.java +++ b/engine/Action.java @@ -1,29 +1,38 @@  package mahjong.engine; +import java.util.Random; +  /**   * Created by joe on 12/3/14. + * Action handles information passing between server and clients   */  public class Action {      // TODO Generic action      // Requirement: printable,parseable,coverage      // Coverage: System,player -    public enum Type {System,Player}; +    private static Random idGen = new Random(); +    private static int cnter = 0; +    public enum Type {System,Player}      // System info merely reflect system state      // Player info pertaining to players; -    public enum Place {Info,East,South,West,North}; -    public enum Act {Info,CardDraw,CardPut,Aside}; +    public enum Place {Info,East,South,West,North} +    public enum Act {Info,Draw,Put,Meld}      Type type;      Act act;      Place place;      String message; +    int guid; -    public Type getType() { -        return type; +    public void newGUID() +    { +        this.guid=(idGen.nextInt()&0xFFF000)+cnter; +        cnter = (cnter+1)&0xFFF;      }      public Action(Type type,Place place,Act act,String message)      { +        newGUID();          this.type = type;          this.place = place;          this.act = act; @@ -31,10 +40,72 @@ public class Action {      }      public Action(String str)      { +        String[] res=str.trim().split("\t"); +        guid = Integer.parseInt(res[0]); +        switch (res[1].trim().toUpperCase().charAt(0)) +        { +            case 'S': +                type=Type.System; +                break; +            case 'P': +                type=Type.Player; +        } +        switch (res[2].trim().toUpperCase().charAt(0)) +        { +            case 'I': +                place=Place.Info; +                break; +            case 'E': +                place=Place.East; +                break; +            case 'S': +                place=Place.South; +                break; +            case 'W': +                place=Place.West; +                break; +            case 'N': +                place=Place.North; +        } +        switch (res[3].trim().toUpperCase().charAt(0)) +        { +            case 'I': +                act=Act.Info; +                break; +            case 'D': +                act=Act.Draw; +                break; +            case 'P': +                act=Act.Put; +                break; +            case 'M': +                act=Act.Meld; +        } +        message=res[4];      }      @Override      public String toString() { -        return super.toString(); +        return String.format("%d\t%c\t%c\t%c\t%s",guid,type.toString().charAt(0),place.toString().charAt(0),act.toString().charAt(0),message); +    } + +    public Act getAct() { +        return act; +    } + +    public Place getPlace() { +        return place; +    } + +    public String getMessage() { +        return message; +    } + +    public int getGuid() { +        return guid; +    } + +    public Type getType() { +        return type;      }  } diff --git a/engine/Engine.java b/engine/Engine.java index 6a8773d..7507ca1 100644 --- a/engine/Engine.java +++ b/engine/Engine.java @@ -1,7 +1,7 @@  package mahjong.engine;  import mahjong.aux.Card; -import mahjong.aux.set.Aside; +import mahjong.aux.set.Meld;  import mahjong.aux.set.Set;  import mahjong.player.GenericPlayer;  import mahjong.player.PlayerActionServer; @@ -46,10 +46,15 @@ public class Engine {          deck = Deck.generateDeck(true);      } -    public static void playerPutAsideCards(GenericPlayer player, Card card, Aside aside) +    public boolean sync4Player(int id) +    { +        return (players[id].stateAlert(new Action(Action.Type.System, Action.Place.Info, Action.Act.Info,"Heartbeat")).getMessage().compareTo("ACK")==0); +    } + +    public static void playerPutAsideCards(GenericPlayer player, Card card, Meld meld)      {          boolean mark=true; -        for (Card asCard:aside.getRep()) +        for (Card asCard:meld.getRep())              if (card.getId() == asCard.getId() && mark)                  mark = true;              else @@ -58,7 +63,7 @@ public class Engine {      public void mainLoop()      { -        start(); +        /*start();          boolean hu=false;          int pos=0;          while (!hu && deck.getSize()>0) @@ -97,6 +102,6 @@ public class Engine {              //              pos=(pos+1)%4; -        } +        }*/      }  } diff --git a/engine/Logger.java b/engine/Logger.java index fb56698..566fa08 100644 --- a/engine/Logger.java +++ b/engine/Logger.java @@ -19,6 +19,13 @@ public class Logger {          actions.add(action);      } +    public int getLastGuidIndex() +    { +        if (actions.size()==0) +            return -1; +        return actions.lastElement().getGuid(); +    } +      @Override      public String toString() {          String str=""; diff --git a/player/CmdPlayerHandler.java b/player/CmdPlayerHandler.java new file mode 100644 index 0000000..8d1e91b --- /dev/null +++ b/player/CmdPlayerHandler.java @@ -0,0 +1,47 @@ +package mahjong.player; + +import mahjong.engine.Action; +import mahjong.engine.Logger; + +/** + * Created by joe on 12/5/14. + */ +public class CmdPlayerHandler implements PlayerActionHandler { +    GenericPlayer player; +    Logger logger; + +    public CmdPlayerHandler(GenericPlayer player) +    { +        this.player = player; +    } + +    @Override +    public Action stateAlert(Action action) { +        if (action.getType()== Action.Type.System) +        { +            // System info +            if (action.getPlace() == Action.Place.Info) +            { +                if (action.getMessage().compareTo("") == 0) +            } +            else +                switch (action.getPlace()) { +                    case East: +                    case South: +                    case West: +                    case North: +                        break; +                } +        } +        else +        { +        } +        return null; +    } + +    @Override +    public void stateUpdate(Action action) { +        if (action == null) +            return; +    } +}
\ No newline at end of file diff --git a/player/GenericPlayer.java b/player/GenericPlayer.java index 23cea93..f1a9755 100644 --- a/player/GenericPlayer.java +++ b/player/GenericPlayer.java @@ -1,7 +1,7 @@  package mahjong.player;  import mahjong.aux.Card; -import mahjong.aux.set.Aside; +import mahjong.aux.set.Meld;  import mahjong.aux.set.Hand;  import mahjong.aux.set.Set;  import mahjong.engine.Action; @@ -22,7 +22,9 @@ public abstract class GenericPlayer {      }      public abstract Action stateAlert(Action action); -    public abstract void stateUpdate(Action action); +    public void stateUpdate(Action action) +    { +    }      public void setScore(int score) {          this.score = score; diff --git a/player/PlayerActionServer.java b/player/PlayerActionServer.java index 09d2417..9e126d4 100644 --- a/player/PlayerActionServer.java +++ b/player/PlayerActionServer.java @@ -2,6 +2,7 @@ package mahjong.player;  import mahjong.aux.set.Hand;  import mahjong.engine.Action; +import mahjong.tools.Alert;  /**   * Created by joe on 12/4/14. @@ -25,13 +26,18 @@ public class PlayerActionServer implements PlayerActionHandler {          return name;      } +    @Override      public Action stateAlert(Action action)      { +        Alert.Error(action==null,"Action can't be null in alert");          return null;      } +    @Override      public void stateUpdate(Action action)      { +        if (action == null) +            return;      }      public int getScore() { diff --git a/player/human/LocalHuman.java b/player/human/LocalHuman.java index e04b89a..e9641dd 100644 --- a/player/human/LocalHuman.java +++ b/player/human/LocalHuman.java @@ -1,7 +1,7 @@  package mahjong.player.human;  import mahjong.aux.Card; -import mahjong.aux.set.Aside; +import mahjong.aux.set.Meld;  import mahjong.aux.set.Hand;  import mahjong.engine.Action;  import mahjong.player.GenericPlayer; diff --git a/tools/Alert.java b/tools/Alert.java new file mode 100644 index 0000000..55d7838 --- /dev/null +++ b/tools/Alert.java @@ -0,0 +1,21 @@ +package mahjong.tools; + +/** + * Created by joe on 12/6/14. + */ +public class Alert { +    public static void Error(boolean bool,String str) +    { +        if (bool) +        { +            System.out.println(str); +            System.exit(1); +        } +    } + +    public static void Info(boolean bool,String str) +    { +        if (bool) +            System.out.println(str); +    } +} diff --git a/tools/Deck.java b/tools/Deck.java index 6ff2cc9..0198e45 100644 --- a/tools/Deck.java +++ b/tools/Deck.java @@ -16,8 +16,8 @@ public class Deck {              deck.add(new Card(CardSet.deckIds[i]));          if (ex)          { -            deck.remove(new Card(":5s"));deck.remove(new Card(":5p"));deck.remove(new Card(":5m")); -            deck.remove(new Card(":0s"));deck.remove(new Card(":0p"));deck.remove(new Card(":0m")); +            deck.remove(new Card(":5s"));deck.remove(new Card(":5p"));deck.remove(new Card(":5p"));deck.remove(new Card(":5m")); +            deck.remove(new Card(":0s"));deck.remove(new Card(":0p"));deck.remove(new Card(":0p"));deck.remove(new Card(":0m"));          }          return deck;      } | 
