home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 Mobile / Chip_Mobile_2001.iso / palm / spiele / hkmajong / hkmajong.exe / majong / src / Player.java < prev    next >
Text File  |  1999-03-01  |  14KB  |  560 lines

  1. import waba.fx.*;
  2. import waba.ui.*;
  3. import waba.sys.*;
  4.  
  5. class Player
  6. {
  7.   Graphics g;
  8.   // player hand
  9.   int intMJFace[] = new int[14];
  10.   int intMJStage[] = new int[14];
  11.   int intMJAbort[] = new int[28];
  12.   int int13Face[]={MJ.M1, MJ.M9, MJ.B1, MJ.B9, MJ.T1, MJ.T9, MJ.EAST, MJ.SOUTH, MJ.WEST, MJ.NORTH, MJ.MIDDLE, MJ.FAT, MJ.WHITE};
  13.   int intTmpFace[]=new int[14];
  14.   // player action
  15.   int intPlayerAction = 0; //0-no action, 1-get a face, 2-removed a face, 3-four, 4-got from opp.
  16.   // player properties
  17.   int intOwn=0;
  18.   int intWind=0;
  19.   int intSeat=0;
  20.  
  21.   public Player(Graphics gWindow, int Own, int Wind, int Seat)
  22.   {
  23.     int i;
  24.  
  25.     g=gWindow;
  26.     intOwn=Own;
  27.     intWind=Wind;
  28.     intSeat=Seat;
  29.     for(i=0;i<14;i++) {intMJFace[i]=Var.MJNOTDEFINED; intMJStage[i]=MJ.Stage.SHOW;}
  30.     for(i=0;i<28;i++) intMJAbort[i]=Var.MJNOTDEFINED;
  31.   }
  32.  
  33.   public int LastAbortFace()
  34.   {
  35.     int i;
  36.  
  37.     for(i=27;i>=0;i--)
  38.     {
  39.       if (intMJAbort[i]!=Var.MJNOTDEFINED)
  40.       {
  41.         return intMJAbort[i];
  42.       }
  43.     }
  44.     return Var.MJNOTDEFINED;
  45.   }
  46.  
  47.   public void RemoveLastAbortFace()
  48.   {
  49.     int i;
  50.  
  51.     for(i=27;i>=0;i--)
  52.     {
  53.       if (intMJAbort[i]!=Var.MJNOTDEFINED)
  54.       {
  55.         intMJAbort[i]=Var.MJNOTDEFINED;
  56.         break;
  57.       }
  58.     }
  59.     Paint();
  60.   }
  61.  
  62.   public void SetStage(int intWhich, int intStage)
  63.   {
  64.     int i=0;
  65.  
  66.     if(intWhich>14)
  67.     {
  68.       for(i=0;i<14;i++)
  69.       {
  70.         if (intMJStage[i]!=MJ.Stage.FOUR) intMJStage[i]=intStage;
  71.       }
  72.     }
  73.     else
  74.     {
  75.       intMJStage[intWhich]=intStage;
  76.     }
  77.   }
  78.  
  79.   public void SortMJ()
  80.   {
  81.     int i,j;
  82.     int intTemp;
  83.  
  84.     //sort stage
  85.     for(i=0;i<14;i++)
  86.     {
  87.       for(j=0;j<13;j++)
  88.       {
  89.         if(intMJStage[j]>intMJStage[j+1])
  90.         {
  91.           // swap face
  92.           intTemp=intMJFace[j];
  93.           intMJFace[j]=intMJFace[j+1];
  94.           intMJFace[j+1]=intTemp;
  95.           // swap stage
  96.           intTemp=intMJStage[j];
  97.           intMJStage[j]=intMJStage[j+1];
  98.           intMJStage[j+1]=intTemp;
  99.         }
  100.       }
  101.     }
  102.     //sort face
  103.     for(i=0;i<14;i++)
  104.     {
  105.       for(j=0;j<13;j++)
  106.       {
  107.         if(intMJFace[j]>intMJFace[j+1] && intMJStage[j]==intMJStage[j+1])
  108.         {
  109.           // swap face
  110.           intTemp=intMJFace[j];
  111.           intMJFace[j]=intMJFace[j+1];
  112.           intMJFace[j+1]=intTemp;
  113.           // swap stage
  114.           intTemp=intMJStage[j];
  115.           intMJStage[j]=intMJStage[j+1];
  116.           intMJStage[j+1]=intTemp;
  117.         }
  118.       }
  119.     }
  120.   }
  121.  
  122.   public void AddMJ(int intFace)
  123.   {
  124.     int i;
  125.  
  126.     for (i=0;i<14;i++)
  127.     {
  128.       if(intMJFace[i]==Var.MJNOTDEFINED)
  129.       {
  130.         intMJFace[i]=intFace;
  131.         break;
  132.       }
  133.     }
  134.   }
  135.  
  136.   public void AddAbortMJ(int intFace)
  137.   {
  138.     int i;
  139.  
  140.     for (i=0;i<28;i++)
  141.     {
  142.       if(intMJAbort[i]==Var.MJNOTDEFINED)
  143.       {
  144.         intMJAbort[i]=intFace;
  145.         break;
  146.       }
  147.     }
  148.   }
  149.  
  150.   public void Paint()
  151.   {
  152.     int i;
  153.     Image iMJ;
  154.     Graphics gMJ;
  155.     Font f = new Font("Arial", Font.PLAIN, 12);
  156.  
  157.     iMJ=new Image(Var.PLAYERHANDW, Var.PLAYERHANDH);
  158.     gMJ=new Graphics(iMJ);
  159.     gMJ.setColor(Var.WHITE, Var.WHITE, Var.WHITE);
  160.     gMJ.fillRect(0, 0, Var.PLAYERHANDW, Var.PLAYERHANDH);
  161.  
  162.     // show info
  163.     gMJ.setColor(Var.BLACK, Var.BLACK, Var.BLACK);
  164.     gMJ.setFont(f);
  165.     gMJ.drawText(" Point:"+intOwn+"  Seat:"+MJ.RealNum2Name(intSeat), 0, 0);
  166.  
  167.     // draw hand
  168.     for (i=0;i<14;i++)
  169.     {
  170.       if(intMJFace[i]!=Var.MJNOTDEFINED)
  171.       {
  172.         if(intMJStage[i]!=MJ.Stage.SELECTED)
  173.         {
  174.           gMJ.drawImage(MJ.CreateMaJong(intMJStage[i], intMJFace[i]), i*(Var.MJW+Var.MJSPACE), Var.PLAYERHANDH-Var.MJH);
  175.         }
  176.         else
  177.         {
  178.           gMJ.drawImage(MJ.CreateMaJong(intMJStage[i], intMJFace[i]), i*(Var.MJW+Var.MJSPACE), Var.PLAYERHANDH-Var.MJH-Var.MJSELECTVSPACE);
  179.         }
  180.       }
  181.     }
  182.     g.drawImage(iMJ, Var.PLAYERHANDX, Var.PLAYERHANDY);
  183.  
  184.     // draw abort pool
  185.     iMJ=new Image(Var.PLAYERPOOLW, Var.PLAYERPOOLH);
  186.     gMJ=new Graphics(iMJ);
  187.     gMJ.setColor(Var.WHITE, Var.WHITE, Var.WHITE);
  188.     gMJ.fillRect(0, 0, Var.PLAYERPOOLW, Var.PLAYERPOOLH);
  189.     for (i=0;i<Var.MAXMJPERROW*2;i++)
  190.     {
  191.       if(intMJAbort[i]!=Var.MJNOTDEFINED)
  192.       {
  193.         gMJ.drawImage(MJ.CreateMaJong(MJ.Stage.OPEN, intMJAbort[i]), (i%Var.MAXMJPERROW)*(Var.MJW+Var.MJSPACE), (i/Var.MAXMJPERROW)*Var.MJOPENVSPACE);
  194.       }
  195.     }
  196.     g.drawImage(iMJ, Var.PLAYERPOOLX, Var.PLAYERPOOLY);
  197.   }
  198.  
  199.   public int LastAction()
  200.   {
  201.     return intPlayerAction;
  202.   }
  203.  
  204.   public boolean onPenDown(int x, int y)
  205.   {
  206.     int i=0;
  207.     int intHit=0;
  208.  
  209.     intHit=(int) x/(Var.MJW+Var.MJSPACE);
  210.     if (intHit>13) intHit=13;
  211.     if (intHit<0) intHit=0;
  212.     if (intMJFace[13]==Var.MJNOTDEFINED && intHit==13)
  213.     {
  214.       //deselected faces on hand
  215.       for (i=0;i<13;i++)
  216.       {
  217.         if (intMJStage[i]==MJ.Stage.SELECTED)
  218.         {
  219.           intMJStage[i]=MJ.Stage.SHOW;
  220.         }
  221.       }
  222.       //get a new face
  223.       intPlayerAction=1;
  224.       return true;
  225.     }
  226.     else if (intMJFace[13]!=Var.MJNOTDEFINED && intMJStage[intHit]==MJ.Stage.SHOW)
  227.     {
  228.       intPlayerAction=2;
  229.       AddAbortMJ(intMJFace[intHit]);
  230.       intMJFace[intHit]=Var.MJNOTDEFINED;
  231.       Paint();
  232.       if (Var.PLATFORM != 1) Vm.sleep(1*Var.DELAY);
  233.       SortMJ();
  234.       Paint();
  235.       return true;
  236.     }
  237.     else // select or deselect a face
  238.     {
  239.       if(intMJStage[intHit]==MJ.Stage.SHOW)
  240.       {
  241.         intMJStage[intHit]=MJ.Stage.SELECTED;
  242.         Paint();
  243.       }
  244.       else if(intMJStage[intHit]==MJ.Stage.SELECTED)
  245.       {
  246.         intMJStage[intHit]=MJ.Stage.SHOW;
  247.         Paint();
  248.       }
  249.     }
  250.     return false;
  251.   }
  252.  
  253.   public int PressFour()
  254.   {
  255.     int intRet=0; // return status 1=used
  256.     int i=0,j=0,k=0;
  257.     int intFoundFace=Var.MJNOTDEFINED;
  258.  
  259.     if (intMJFace[13]==Var.MJNOTDEFINED)
  260.     {
  261.        return intRet;
  262.     }
  263.  
  264.     //check all faces on hand with 4 matched
  265.     for (i=0;i<14 && intFoundFace==Var.MJNOTDEFINED;i++)
  266.     {
  267.       k=0;
  268.       for (j=0;j<14 && intMJStage[i]!=MJ.Stage.FOUR;j++)
  269.       {
  270.         if (intMJFace[i]==intMJFace[j] && i!=j)
  271.         {
  272.           k++;
  273.         }
  274.       }
  275.       if (k==3)
  276.       {
  277.         intFoundFace=intMJFace[i];
  278.       }
  279.     }
  280.  
  281.     if (intFoundFace!=Var.MJNOTDEFINED)
  282.     {
  283.       intPlayerAction=3;
  284.       intRet=1;
  285.       j=0;
  286.       for (i=0;i<14;i++)
  287.       {
  288.         if (intMJFace[i]==intFoundFace)
  289.         {
  290.           if (j==0)
  291.           {
  292.             intMJStage[i]=MJ.Stage.SHOW;
  293.             intMJFace[i]=Var.MJNOTDEFINED;
  294.           }
  295.           else
  296.           {
  297.             intMJStage[i]=MJ.Stage.FOUR;
  298.           }
  299.           j++;
  300.         }
  301.       }
  302.       SortMJ();
  303.       Paint();
  304.     }
  305.     return intRet;
  306.   }
  307.  
  308.   public int CheckDone(int ComputerAbortFace)
  309.   {
  310.     int intRet=0; // return 1 if done hand
  311.     int i=0,j=0,k=0;
  312.     int intDoneFace[];
  313.     int intDoneByOwn=0; //0-not done by own, 1-done by own, 2-done by four
  314.     int intFanChecked=0;
  315.     int intHeightFanChecked=0;
  316.     boolean booShow=false;
  317.  
  318.     // copy intMJFace to intTmpFace
  319.     for(i=0;i<14;i++)
  320.     {
  321.       intTmpFace[i]=intMJFace[i];
  322.     }
  323.     if(intTmpFace[13]==Var.MJNOTDEFINED) // if need computer aborted face
  324.     {
  325.       intTmpFace[13]=ComputerAbortFace;
  326.     }
  327.     if(intPlayerAction==1) intDoneByOwn=1;
  328.     if(intPlayerAction==3) intDoneByOwn=2;
  329.  
  330.     // sort it
  331.     for(i=0;i<14;i++)
  332.     {
  333.       for(j=0;j<13;j++)
  334.       {
  335.         if(intTmpFace[j]>intTmpFace[j+1])
  336.         {
  337.           // swap face
  338.           k=intTmpFace[j];
  339.           intTmpFace[j]=intTmpFace[j+1];
  340.           intTmpFace[j+1]=k;
  341.         }
  342.       }
  343.     }
  344.  
  345.     for (i=0;i<2;i++) // check at the first time, show for the second time
  346.     {
  347.       if (i==0 || intHeightFanChecked==1)
  348.       {
  349.         // check 13 faces
  350.         intDoneFace=MJ.CheckDone13Face(intTmpFace);
  351.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  352.         {
  353.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  354.           if(intFanChecked>intRet)
  355.           {
  356.             intRet=intFanChecked;
  357.             intHeightFanChecked=1;
  358.           }
  359.         }
  360.       }
  361.  
  362.       if (i==0 || intHeightFanChecked==2)
  363.       {
  364.         // check from left to right in order first
  365.         intDoneFace=MJ.CheckDoneLeft2RightOPE(intTmpFace);
  366.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  367.         {
  368.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  369.           if(intFanChecked>intRet)
  370.           {
  371.             intRet=intFanChecked;
  372.             intHeightFanChecked=2;
  373.           }
  374.         }
  375.       }
  376.  
  377.       if (i==0 || intHeightFanChecked==3)
  378.       {
  379.         // check from right to left in order first
  380.         intDoneFace=MJ.CheckDoneRight2LeftOPE(intTmpFace);
  381.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  382.         {
  383.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  384.           if(intFanChecked>intRet)
  385.           {
  386.             intRet=intFanChecked;
  387.             intHeightFanChecked=3;
  388.           }
  389.         }
  390.       }
  391.  
  392.       if (i==0 || intHeightFanChecked==4)
  393.       {
  394.         // check from left to right 3 kind first
  395.         intDoneFace=MJ.CheckDoneLeft2RightPOE(intTmpFace);
  396.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  397.         {
  398.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  399.           if(intFanChecked>intRet)
  400.           {
  401.             intRet=intFanChecked;
  402.             intHeightFanChecked=4;
  403.           }
  404.         }
  405.       }
  406.  
  407.       if (i==0 || intHeightFanChecked==5)
  408.       {
  409.         // check from right to left 3 kind first
  410.         intDoneFace=MJ.CheckDoneRight2LeftPOE(intTmpFace);
  411.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  412.         {
  413.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  414.           if(intFanChecked>intRet)
  415.           {
  416.             intRet=intFanChecked;
  417.             intHeightFanChecked=5;
  418.           }
  419.         }
  420.       }
  421.  
  422.       if (i==0 || intHeightFanChecked==6)
  423.       {
  424.         // check from left to right in order first
  425.         intDoneFace=MJ.CheckDoneLeft2RightOEP(intTmpFace);
  426.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  427.         {
  428.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  429.           if(intFanChecked>intRet)
  430.           {
  431.             intRet=intFanChecked;
  432.             intHeightFanChecked=6;
  433.           }
  434.         }
  435.       }
  436.  
  437.       if (i==0 || intHeightFanChecked==7)
  438.       {
  439.         // check from right to left in order first
  440.         intDoneFace=MJ.CheckDoneRight2LeftOEP(intTmpFace);
  441.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  442.         {
  443.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  444.           if(intFanChecked>intRet)
  445.           {
  446.             intRet=intFanChecked;
  447.             intHeightFanChecked=7;
  448.           }
  449.         }
  450.       }
  451.  
  452.       if (i==0 || intHeightFanChecked==8)
  453.       {
  454.         // check from left to right 3 kind first
  455.         intDoneFace=MJ.CheckDoneLeft2RightPEO(intTmpFace);
  456.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  457.         {
  458.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  459.           if(intFanChecked>intRet)
  460.           {
  461.             intRet=intFanChecked;
  462.             intHeightFanChecked=8;
  463.           }
  464.         }
  465.       }
  466.  
  467.       if (i==0 || intHeightFanChecked==9)
  468.       {
  469.         // check from right to left 3 kind first
  470.         intDoneFace=MJ.CheckDoneRight2LeftPEO(intTmpFace);
  471.         if (intDoneFace[0]!=Var.MJNOTDEFINED)
  472.         {
  473.           intFanChecked=MJ.CheckFan(intDoneFace,intDoneByOwn,intWind,intSeat,booShow,g)+1;
  474.           if(intFanChecked>intRet)
  475.           {
  476.             intRet=intFanChecked;
  477.             intHeightFanChecked=9;
  478.           }
  479.         }
  480.       }
  481.  
  482.       if(i==0 && intRet!=0)
  483.       {
  484.         SetStage(Var.MJNOTDEFINED,MJ.Stage.OPEN);
  485.         Paint();
  486.         booShow=true;
  487.       }
  488.     }
  489.  
  490.     return intRet;
  491.   }
  492.  
  493.   public int OppPoolClick(int intFace)
  494.   {
  495.     int intRet=0; // return status 1=used
  496.     int i=0,j=-1;
  497.     int intSelected[]=new int[13];
  498.     int intSelectedPos[]=new int[13];
  499.  
  500.     //get selected faces on hand
  501.     for (i=0;i<13;i++)
  502.     {
  503.       if (intMJStage[i]==MJ.Stage.SELECTED)
  504.       {
  505.         j=j+1;
  506.         intSelected[j]=intMJFace[i];
  507.         intSelectedPos[j]=i;
  508.         intMJStage[i]=MJ.Stage.SHOW;
  509.       }
  510.     }
  511.     if (j>=0)
  512.     {
  513.       Paint();
  514.       if (Var.PLATFORM != 1) Vm.sleep(2*Var.DELAY);
  515.     }
  516.  
  517.     //check if three of a kind
  518.     if (j==1 && intSelected[0]==intFace && intSelected[1]==intFace)
  519.     {
  520.       intPlayerAction=4;
  521.       intRet=1;
  522.       intMJFace[13]=intFace;
  523.       intMJStage[13]=MJ.Stage.OPEN;
  524.       intMJStage[intSelectedPos[0]]=MJ.Stage.OPEN;
  525.       intMJStage[intSelectedPos[1]]=MJ.Stage.OPEN;
  526.       SortMJ();
  527.       Paint();
  528.     }
  529.  
  530.     //check if four of a kind
  531.     if (j==2 && intSelected[0]==intFace && intSelected[1]==intFace && intSelected[2]==intFace)
  532.     {
  533.       intPlayerAction=3;
  534.       intRet=1;
  535.       intMJStage[intSelectedPos[0]]=MJ.Stage.FOUR;
  536.       intMJStage[intSelectedPos[1]]=MJ.Stage.FOUR;
  537.       intMJStage[intSelectedPos[2]]=MJ.Stage.FOUR;
  538.       SortMJ();
  539.       Paint();
  540.     }
  541.  
  542.     //check if in order
  543.     if (j==1 && 
  544.        ( (intSelected[0]==intFace-2 && intSelected[1]==intFace-1) ||
  545.          (intSelected[0]==intFace-1 && intSelected[1]==intFace+1) ||
  546.          (intSelected[0]==intFace+1 && intSelected[1]==intFace+2) ))
  547.     {
  548.       intPlayerAction=4;
  549.       intRet=1;
  550.       intMJFace[13]=intFace;
  551.       intMJStage[13]=MJ.Stage.OPEN;
  552.       intMJStage[intSelectedPos[0]]=MJ.Stage.OPEN;
  553.       intMJStage[intSelectedPos[1]]=MJ.Stage.OPEN;
  554.       SortMJ();
  555.       Paint();
  556.     }
  557.     return intRet;
  558.   }
  559. }
  560.