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

  1. import waba.fx.*;
  2. import waba.ui.*;
  3. import waba.sys.*;
  4.  
  5. class Computer
  6. {
  7.   Graphics g;
  8.  
  9.   int intComputerAction=0; //0-no action, 1-get a face, 2-removed a face, 3-four, 4-got from opp.
  10.  
  11.   // player hand
  12.   int intMJFace[] = new int[15];
  13.   int intMJStage[] = new int[15];
  14.   int intMJAbort[] = new int[28];
  15.   // Is a Done hand or not?
  16.   int intDone=0;
  17.   // player properties
  18.   int intLuck=0;
  19.   int intDoneFans=0;
  20.   int intOwn=0;
  21.   int intWind=0;
  22.   int intSeat=0;
  23.   int intLevel=0;
  24.  
  25.   public Computer(Graphics gWindow, int Own, int Wind, int Seat, int Level)
  26.   {
  27.     int i;
  28.  
  29.     g=gWindow;
  30.     intOwn=Own;
  31.     intWind=Wind;
  32.     intSeat=Seat;
  33.     intLevel=Level;
  34.     for(i=0;i<15;i++) {intMJFace[i]=Var.MJNOTDEFINED; intMJStage[i]=MJ.Stage.HIDE;}
  35.     for(i=0;i<28;i++) intMJAbort[i]=Var.MJNOTDEFINED;
  36.   }
  37.  
  38.   public int LastAction()
  39.   {
  40.     return intComputerAction;
  41.   }
  42.  
  43.   public void LastAction(int intAction)
  44.   {
  45.     intComputerAction=intAction;
  46.   }
  47.  
  48.   public int LastAbortFace()
  49.   {
  50.     int i;
  51.  
  52.     for(i=27;i>=0;i--)
  53.     {
  54.       if (intMJAbort[i]!=Var.MJNOTDEFINED)
  55.       {
  56.         return intMJAbort[i];
  57.       }
  58.     }
  59.     return Var.MJNOTDEFINED;
  60.   }
  61.  
  62.   public void RemoveLastAbortFace()
  63.   {
  64.     int i;
  65.  
  66.     for(i=27;i>=0;i--)
  67.     {
  68.       if (intMJAbort[i]!=Var.MJNOTDEFINED)
  69.       {
  70.         intMJAbort[i]=Var.MJNOTDEFINED;
  71.         break;
  72.       }
  73.     }
  74.     Paint();
  75.   }
  76.  
  77.   public void SetStage(int intWhich, int intStage)
  78.   {
  79.     int i=0;
  80.  
  81.     if(intWhich>15)
  82.     {
  83.       for(i=0;i<15;i++)
  84.       {
  85.         if (intMJStage[i]!=MJ.Stage.FOUR) intMJStage[i]=intStage;
  86.       }
  87.     }
  88.     else
  89.     {
  90.       intMJStage[intWhich]=intStage;
  91.     }
  92.   }
  93.  
  94.   public void SortMJ()
  95.   {
  96.     int i,j;
  97.     int intTemp;
  98.  
  99.     //sort stage
  100.     for(i=0;i<14;i++)
  101.     {
  102.       for(j=0;j<14;j++)
  103.       {
  104.         if(intMJStage[j]>intMJStage[j+1])
  105.         {
  106.           // swap face
  107.           intTemp=intMJFace[j];
  108.           intMJFace[j]=intMJFace[j+1];
  109.           intMJFace[j+1]=intTemp;
  110.           // swap stage
  111.           intTemp=intMJStage[j];
  112.           intMJStage[j]=intMJStage[j+1];
  113.           intMJStage[j+1]=intTemp;
  114.         }
  115.       }
  116.     }
  117.   }
  118.  
  119.   public void AddMJ(int intFace)
  120.   {
  121.     int i;
  122.  
  123.     for (i=0;i<15;i++)
  124.     {
  125.       if(intMJFace[i]==Var.MJNOTDEFINED)
  126.       {
  127.         intMJFace[i]=intFace;
  128.         break;
  129.       }
  130.     }
  131.   }
  132.  
  133.   public void AddAbortMJ(int intFace)
  134.   {
  135.     int i;
  136.  
  137.     for (i=0;i<28;i++)
  138.     {
  139.       if(intMJAbort[i]==Var.MJNOTDEFINED)
  140.       {
  141.         intMJAbort[i]=intFace;
  142.         break;
  143.       }
  144.     }
  145.   }
  146.  
  147.   public void Paint()
  148.   {
  149.     int i;
  150.     Image iMJ;
  151.     Graphics gMJ;
  152.     Font f = new Font("Arial", Font.PLAIN, 12);
  153.  
  154.     iMJ=new Image(Var.COMPHANDW,Var.COMPHANDH);
  155.     gMJ=new Graphics(iMJ);
  156.     gMJ.setColor(Var.WHITE,Var.WHITE,Var.WHITE);
  157.     gMJ.fillRect(0,0,Var.COMPHANDW,Var.COMPHANDH);
  158.  
  159.     // show info
  160.     gMJ.setColor(Var.BLACK, Var.BLACK, Var.BLACK);
  161.     gMJ.setFont(f);
  162.     gMJ.drawText(" Point:"+intOwn+"  Seat:"+MJ.RealNum2Name(intSeat), 0, Var.MJH+Var.FONTVSPACE);
  163.  
  164.     // draw hand
  165.     if(intMJFace[14]!=Var.MJNOTDEFINED)
  166.     {
  167.       gMJ.drawImage(MJ.CreateMaJong(intMJStage[14], intMJFace[14]), 0, 0);
  168.     }
  169.     for (i=13-intDone;i>=0;i--)
  170.     {
  171.       if(intMJFace[i]!=Var.MJNOTDEFINED)
  172.       {
  173.         gMJ.drawImage(MJ.CreateMaJong(intMJStage[i], intMJFace[i]), (Var.MAXMJPERROW-1-i)*(Var.MJW+Var.MJSPACE), 0);
  174.       }
  175.     }
  176.     g.drawImage(iMJ,Var.COMPHANDX,Var.COMPHANDY);
  177.  
  178.     // draw abort pool
  179.     iMJ=new Image(Var.COMPPOOLW, Var.COMPPOOLH);
  180.     gMJ=new Graphics(iMJ);
  181.     gMJ.setColor(Var.WHITE,Var.WHITE,Var.WHITE);
  182.     gMJ.fillRect(0, 0, Var.COMPPOOLW, Var.COMPPOOLH);
  183.  
  184.     if (Var.PLATFORM==0)
  185.     {
  186.       for (i=(Var.MAXMJPERROW*2)-1;i>=0;i--)
  187.       {
  188.         if(intMJAbort[i]!=Var.MJNOTDEFINED)
  189.         {
  190.           gMJ.drawImage(MJ.CreateMaJong(MJ.Stage.OPEN, intMJAbort[i]), ((Var.MAXMJPERROW-1)-(i%Var.MAXMJPERROW))*(Var.MJW+Var.MJSPACE), (1-(i/Var.MAXMJPERROW))*Var.MJOPENVSPACE);
  191.         }
  192.       }
  193.     }
  194.     else
  195.     {
  196.       for (i=0;i<=(Var.MAXMJPERROW*2)-1;i++)
  197.       {
  198.         if(intMJAbort[i]!=Var.MJNOTDEFINED)
  199.         {
  200.           gMJ.drawImage(MJ.CreateMaJong(MJ.Stage.OPEN, intMJAbort[i]), ((Var.MAXMJPERROW-1)-(i%Var.MAXMJPERROW))*(Var.MJW+Var.MJSPACE), (1-(i/Var.MAXMJPERROW))*Var.MJOPENVSPACE);
  201.         }
  202.       }
  203.     }
  204.  
  205.     g.drawImage(iMJ, Var.COMPPOOLX, Var.COMPPOOLY);
  206.   }
  207.  
  208.   public int CheckPlayerAbort(int intFace) // return > 0 if done
  209.   {
  210.     int i,j;
  211.     int intRet=0;  // 0-nothing happen
  212.  
  213.     for (i=0;i<12;i++)
  214.     {
  215.       if(intMJFace[i]==intFace && intMJStage[i]==MJ.Stage.HIDE)
  216.       {
  217.         j=MJ.rand(29-intLuck); // random win
  218.         if(j==0)
  219.         {
  220.           intComputerAction=4;
  221.           intMJFace[14]=intMJFace[13];
  222.           SetStage(Var.MJNOTDEFINED,MJ.Stage.OPEN);
  223.           Paint();
  224.           intRet=MJ.CheckFan(intMJFace, 0, intWind, intSeat, true, g)+1;
  225.           break;
  226.         }
  227.  
  228.         if(MJ.rand(2)==1) // half of chance will take
  229.         {
  230.           //use player aborted face
  231.           j=(i/3)*3;
  232.           if (intMJFace[j]==intMJFace[j+1] && intMJFace[j+1]==intMJFace[j+2] && MJ.rand(5)==1) // five out of one will four
  233.           {
  234.               intComputerAction=3;
  235.               intMJStage[j]=MJ.Stage.FOUR;
  236.               intMJStage[j+1]=MJ.Stage.FOUR;
  237.               intMJStage[j+2]=MJ.Stage.FOUR;
  238.           }
  239.           else
  240.           {
  241.             intComputerAction=4;
  242.             MJ.intFaceCount[MJ.Face2RealNum(intFace)]--;
  243.             intMJStage[j]=MJ.Stage.OPEN;
  244.             intMJStage[j+1]=MJ.Stage.OPEN;
  245.             intMJStage[j+2]=MJ.Stage.OPEN;
  246.           }
  247.           SortMJ();
  248.           break;
  249.         }
  250.       }
  251.     }
  252.     return intRet;
  253.   }
  254.  
  255.   public int GetNewFace(int intFace)
  256.   {
  257.     int i,j;
  258.     int intRet=0;  // 0-nothing happen
  259.  
  260.     intLuck++; // have more luck
  261.     intMJFace[14]=intFace;
  262.     Paint();
  263.     if (Var.PLATFORM != 1) Vm.sleep(3*Var.DELAY);
  264.  
  265.     // calculate random win factor
  266.     i=(29*(intDoneFans+1))-(intLuck*(intDoneFans+1));
  267.     if (i<2) i=2;
  268.  
  269.     j=MJ.rand(i); // random win
  270.  
  271.     if(j==1 && intComputerAction!=4)
  272.     {
  273.       intMJFace[14]=intMJFace[13];
  274.       SetStage(Var.MJNOTDEFINED,MJ.Stage.OPEN);
  275.       Paint();
  276.       if(intComputerAction==3)
  277.       {
  278.         intRet=MJ.CheckFan(intMJFace, 2, intWind, intSeat, true, g)+1;
  279.       }
  280.       else
  281.       {
  282.         intRet=MJ.CheckFan(intMJFace, 1, intWind, intSeat, true, g)+1;
  283.       }
  284.       return intRet;
  285.     }
  286.  
  287.     intComputerAction=1;
  288.  
  289.     for (i=0;i<12;i++)
  290.     {
  291.       if(intMJFace[i]==intFace)
  292.       {
  293.         j=(i/3)*3;
  294.         if (intMJFace[j]==intMJFace[j+1] && intMJFace[j+1]==intMJFace[j+2])
  295.         {
  296.           intComputerAction=3; //four of a kind
  297.           intMJStage[j]=MJ.Stage.FOUR;
  298.           intMJStage[j+1]=MJ.Stage.FOUR;
  299.           intMJStage[j+2]=MJ.Stage.FOUR;
  300.           break;
  301.         }
  302.       }
  303.     }
  304.     intMJFace[14]=Var.MJNOTDEFINED;
  305.     if (intComputerAction!=3)
  306.     {
  307.  
  308.       AddAbortMJ(intFace);
  309.     }
  310.     Paint();
  311.     return intRet;
  312.   }
  313.  
  314.   public void SeatEast()
  315.   {
  316.     AddAbortMJ(intMJFace[14]);
  317.     intMJFace[14]=Var.MJNOTDEFINED;
  318.     Paint();
  319.   }
  320.  
  321.   public void GetDone()
  322.   {
  323.     int i,j;
  324.     int intMJ=0;
  325.     int intExpectedFans=0, intCheckedFans=-1, intTried=0;
  326.     boolean booFound=false;
  327.  
  328.     intMJFace[14]=intMJFace[13];  // in case of seating EAST
  329.  
  330. if (Var.DEBUG) System.out.println("Level ="+intLevel);
  331.    intExpectedFans=MJ.rand(intLevel);
  332.    if (intExpectedFans>5) intExpectedFans=5;  // Max random fans is 5
  333. if (Var.DEBUG) System.out.println("ExpectedFans ="+intExpectedFans);
  334.  
  335.     while (intExpectedFans>intCheckedFans && intTried++<10)
  336.     {
  337.       //put back titles
  338.       for (i=0;i<14;i++)
  339.       {
  340.         if(intMJFace[i]!=Var.MJNOTDEFINED)
  341.         {
  342.           MJ.intFaceCount[MJ.Face2RealNum(intMJFace[i])]--;
  343.           intMJFace[i]=Var.MJNOTDEFINED;
  344.         }
  345.       }
  346.  
  347.       //construct done hand
  348.       for(i=0;i<4;i++)
  349.       {
  350.         booFound=false;
  351.         while(booFound==false)
  352.         {
  353.           intMJ=MJ.rand(34);
  354.           if (intMJ>=27 || MJ.rand(2)==0) //three of a kind
  355.           {
  356.             if (MJ.intFaceCount[intMJ]<2)
  357.             {
  358.               MJ.intFaceCount[intMJ]=MJ.intFaceCount[intMJ]+3;
  359.               booFound=true;
  360.               AddMJ(MJ.Real2FaceNum(intMJ));
  361.               AddMJ(MJ.Real2FaceNum(intMJ));
  362.               AddMJ(MJ.Real2FaceNum(intMJ));
  363.             }
  364.           }
  365.           else if(intMJ<=6 || (intMJ>=9 && intMJ<=15) || (intMJ>=18 && intMJ<=24)) //ordered
  366.           {
  367.             if (MJ.intFaceCount[intMJ]<4 && MJ.intFaceCount[intMJ+1]<4 && MJ.intFaceCount[intMJ+2]<4)
  368.             {
  369.               booFound=true;
  370.               MJ.intFaceCount[intMJ]++;
  371.               AddMJ(MJ.Real2FaceNum(intMJ));
  372.               MJ.intFaceCount[intMJ+1]++;
  373.               AddMJ(MJ.Real2FaceNum(intMJ+1));
  374.               MJ.intFaceCount[intMJ+2]++;
  375.               AddMJ(MJ.Real2FaceNum(intMJ+2));
  376.             }
  377.           }
  378.         }
  379.       }
  380.       //generate a pair
  381.       booFound=false;
  382.       while(booFound==false)
  383.       {
  384.         intMJ=MJ.rand(34);
  385.         if (MJ.intFaceCount[intMJ]<3)
  386.         {
  387.           MJ.intFaceCount[intMJ]=MJ.intFaceCount[intMJ]+2;
  388.           booFound=true;
  389.           AddMJ(MJ.Real2FaceNum(intMJ));
  390.           AddMJ(MJ.Real2FaceNum(intMJ));
  391.         }
  392.       }
  393.       intCheckedFans=MJ.CheckFan(intMJFace, 0, intWind, intSeat, false, g);
  394.       intDoneFans=intCheckedFans;
  395. if (Var.DEBUG) System.out.println("Computer Fan = "+intCheckedFans);
  396.       MJ.srand(1);
  397.     }
  398.     intDone=1;
  399.   }
  400. }
  401.