GameWorld.java
上传用户:sh2222
上传日期:2009-12-31
资源大小:84k
文件大小:32k
源码类别:

J2ME

开发平台:

Java

  1. package paopao;
  2. import javax.microedition.lcdui.*;
  3. import java.util.Hashtable;
  4. import java.io.InputStream;
  5. import com.nokia.mid.ui.*;
  6. public class GameWorld extends FullCanvas implements Runnable{
  7. final int screenW = getWidth();
  8. final int screenH = getHeight();
  9. final int paintW = 128;
  10. final int paintH = 208 - 3;
  11. final int orgX = 7;
  12. final int orgY = 3;
  13. final int midX = paintW / 2;
  14. final int midY = paintH / 2;
  15. //score
  16. int score;
  17. //Thread
  18. boolean killThread  = false;
  19. boolean pauseThread = false;
  20. boolean overThread  = false;
  21. int overCount;
  22. Thread thread = null;
  23. int interval = 50;
  24. //hardlevel setting
  25. int hardLevel;
  26. final int EASY   = 9;
  27. final int MIDDLE = 8;
  28. final int HARD   = 6;
  29. int shakeAt;                    //when ball shooted number equals or more then it shakes
  30. boolean shaking = false;
  31. int shakeOffX[];
  32. // top press
  33. int pressCount;                //round intervals per top down count
  34. int shakeCount;
  35. int nowTop;
  36. //angle
  37. int angle  = 90;
  38. int _angle = 6;
  39. int angleSinValue;
  40. int angleCosValue;
  41. //paopao
  42. int nextOneColor;
  43. int toBeShootColor;
  44. int isMovingColor;
  45. boolean isMoving = false;    //击出的球是否处于运动过程中
  46. int shootAngle;
  47. int v = 10;
  48. int timeCount;
  49. final int effectiveR = 8;
  50. final int localStand = 6;
  51. int startX;
  52. int startY;
  53. int nowX;
  54. int nowY;
  55. boolean hitted = false;
  56. int hittedI;
  57. int hittedJ;
  58. //falling
  59. int fallingNum ;
  60. int[][] fallingPara;
  61. int fallingV = 8;
  62. //time
  63. //round
  64. int[][] roundPara;
  65. int roundCount;                  //read roundPara from map.txt & count
  66. boolean roundStart = true;
  67. int roundStartCount;
  68. int round = 1;
  69. //
  70. int disappearCount;
  71.   /** Constructor */
  72.   public GameWorld(int hardLevel) {
  73.     this.hardLevel = hardLevel;
  74.     try {
  75.       jbInit();
  76.     }
  77.     catch(Exception e) {
  78.       e.printStackTrace();
  79.     }
  80.   }
  81.   protected void show()
  82.   {
  83.   if(thread == null)
  84.     thread = new Thread(this);
  85.     thread.start();
  86.   }
  87.   /**Component initialization*/
  88.   private void jbInit() throws Exception {
  89.   roundPara = new int[11][8];
  90.   this.readroundPara();
  91.   switch(hardLevel)
  92.   {
  93.   case EASY:
  94.   shakeAt = 6;
  95.   break;
  96.   case MIDDLE:
  97.   shakeAt = 5;
  98.   break;
  99.   case HARD:
  100.   shakeAt = 4;
  101.   break;
  102.   default:
  103.   break;
  104.   }
  105.   toBeShootColor =  1 + Math.abs(Resource.random.nextInt() % 8);
  106.   nextOneColor   = 1 + Math.abs(Resource.random.nextInt() % 8);
  107.   fallingPara = new int[50][3];
  108.   shakeOffX = new int[]{1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1};
  109. // Set up this Displayable to listen to command events
  110.     // add the Exit command
  111.   }
  112.   private  void readroundPara()
  113.     {
  114.       InputStream is = null;
  115.      try{
  116.         is = getClass().getResourceAsStream("/round.txt");
  117.         }
  118.       catch(Exception e)
  119.         {}
  120.       int symbol;
  121.       try{
  122.   while((symbol = is.read()) != -1)
  123.    {
  124.           if(symbol == '&')
  125.               {
  126.             roundCount ++;
  127.             if(roundCount == round)
  128.                    {
  129.                for(int i = 0;i < 5;i ++)
  130.                is.read();
  131.                int symbol2;
  132.                int rowCount  = 0;
  133.                int lineCount = 0;
  134.                while((symbol2 = is.read()) != '&')
  135.                       {
  136.                    if(symbol2 == 'r')
  137.                            {
  138.                      rowCount ++;
  139.                      lineCount = 0;
  140.                      is.read();
  141.                            }
  142.                     else roundPara[rowCount][lineCount ++] = (int)symbol2 - 48;
  143.                       }
  144.                   break;
  145.                    }
  146.                 }
  147.    }
  148.          }
  149.       catch(Exception ex)
  150.       {
  151.       }
  152.     }
  153. private void nextPaoPao()
  154.   {
  155.   isMovingColor = toBeShootColor;
  156.   toBeShootColor = nextOneColor;
  157.   nextOneColor = 1 + Math.abs(Resource.random.nextInt() % 8);
  158.   }
  159. protected void keyPressed(int keyCode)
  160.   {
  161. if(!pauseThread)
  162.     {
  163. if(keyCode == -6)
  164. PaoPao.quitApp();
  165. else if((keyCode == -5 || keyCode == 53) && isMoving  == false)
  166.   shoot();
  167. else if(keyCode == -3)
  168.     {
  169.       if(angle < 174)
  170.       angle += 6;
  171.     }
  172. else if(keyCode == -4)
  173.     {
  174.       if(angle > 6)
  175.       angle -= 6;
  176.     }
  177. else if(keyCode == -1)
  178.            {
  179.            if(angle == 90)
  180.              return;
  181.            angle = (angle > 90 ? angle - 6 : angle + 6);
  182.            }
  183.     }      //if(!pauseThread)
  184.   }
  185.   /**Handle command events*/
  186. synchronized private void shoot()
  187.   {
  188. //pressCount ++;
  189. //pressCount %= hardLevel;
  190. //if(pressCount >= shakeAt)
  191. //shaking = true;
  192. //if(pressCount == 0)
  193. //topDown();
  194. startX = 71 - orgX;
  195. startY = 170 - orgY;
  196. nowX = startX;
  197. nowY = startY;
  198. shootAngle = angle;
  199. angleSinValue = Resource.getSinAngleValue(shootAngle);
  200. angleCosValue = Resource.getCosAngleValue(shootAngle);
  201. isMoving = true;
  202. timeCount = 0;
  203. nextPaoPao();
  204.   }
  205. private void topDown()
  206.   {
  207. nowTop ++;
  208. shaking = false;
  209.   }
  210.  public void run()
  211.  {
  212.  while(!killThread)
  213.      {
  214.      if(!pauseThread)
  215.         {
  216.       if(!overThread)
  217.             {
  218.      if(roundStart)
  219.               {
  220.                  roundStartCount ++;
  221.                 if(roundStartCount >= 48)
  222.                  {
  223.                 roundStartCount = 0;
  224.                 roundStart = false;
  225.                  }
  226.               }
  227.               if(isMoving)    //被击出的球处于运动状态中
  228.                 {
  229.                   paoPaoMoving();
  230.                 }
  231.                Falling();
  232.                if(disappearCount > 0)
  233.                {
  234.                  disappearCount --;
  235.                  if(disappearCount == 0)
  236.                    for(int i = 0;i < 10;i ++)
  237.                      for(int j = 0;j < (i % 2 == 0 ? 8 : 7);j ++)
  238.                      {
  239.                      if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  240.                        roundPara[i][j] = 0;
  241.                      }
  242.                }
  243.                if(shaking)
  244.                {
  245.               shakeCount ++;
  246.               shakeCount %= 16;
  247.                }
  248.                 try
  249.                 {
  250.                 repaint();
  251.                 thread.sleep(interval);
  252.                 }
  253.                 catch(Exception ex){}
  254.             }          //if(!overThread)
  255.       //overCount ++;
  256.      // if(overCount >= paintH - nowTop * 14)
  257.       //  killThread = true;
  258.         }
  259.      }               //while(!killThread)
  260. //System.out.println("killThread = "+ killThread);
  261.          this.serviceRepaints();
  262.          System.gc();
  263.          PaoPao.shiftCanvas(PaoPao.MENU_ID,0);
  264.  }
  265. private void Falling()
  266.  {
  267.  if(fallingNum > 0)
  268.   {
  269.  for(int i = 0;i < fallingNum;i ++)
  270.     {
  271.     fallingPara[i][2] += fallingV;
  272.     }
  273.   }
  274. for(int i = 0;i < fallingNum;i ++)
  275.   {
  276.  if(fallingPara[i][2] > paintH + 8)
  277.    {
  278.     for(int j = i;j < fallingNum - 1;j ++)
  279.     {
  280.     fallingPara[j][0] = fallingPara[j + 1][0];
  281.     fallingPara[j][1] = fallingPara[j + 1][1];
  282.     fallingPara[j][2] = fallingPara[j + 1][2];
  283.     }
  284.     fallingNum--;
  285.    }
  286.   }
  287.  }
  288.  private void paoPaoMoving()
  289.  {
  290. int posX = 0;
  291. int posY = 0;
  292. int preX;
  293. int preY;
  294. int pre_x;
  295. int pre_y;
  296. preX = nowX;
  297. preY = nowY;
  298. pre_x = nowX;
  299. pre_y = nowY;
  300. if(hitted)
  301.    {
  302.    hitted = !hitted;
  303.    dealWithHit(hittedI,hittedJ);
  304.    return;
  305.    }
  306.    timeCount ++;
  307.    posX = startX + (timeCount * v) * angleCosValue / 100000;
  308.    posY = startY - (timeCount * v) * angleSinValue / 100000;
  309.    while(true)
  310.    {
  311.    if(posX  - 8 < 0)
  312.       {
  313.      startX = 8;
  314.      startY = nowY;
  315.      nowX   = 8;
  316.      timeCount = 0;
  317.      angleCosValue = 0 - angleCosValue;
  318.      //timeCount ++;
  319.      break;
  320.       }
  321.    else if(posX + 8 > paintW)
  322.       {
  323.      startX = paintW - 8;
  324.      startY = nowY;
  325.      nowX   = paintW - 8;
  326.      timeCount = 0;
  327.      angleCosValue = 0 - angleCosValue;
  328.      //timeCount ++;
  329.      break;
  330.       }
  331.    else if(posY - 8 <= 0)                      //reach the top
  332.       {
  333.      this.roundPara[0][posX / 16] = isMovingColor;
  334.      nowX = posX;
  335.      nowY = 8;
  336.      checkConnect(0,nowX / 16,isMovingColor);
  337.      if(checkDisappear())
  338.        checkFall();
  339.      isMoving = false;
  340.      return;
  341.       }
  342.    else
  343.       {
  344.       nowX = posX;
  345.       nowY = posY;
  346.       break;
  347.       }
  348.    }
  349.    if(nowY == 8)
  350.      return;
  351.    for(int i = 0;i < 10; i ++)
  352.       {
  353.    if(i % 2 == 0)
  354.         {
  355.       for(int j = 0;j < 8;j ++)
  356.          {
  357.      if(isCollided(nowX,nowY,j * 16 + 8,i * 14 + 8) && roundPara[i][j] > 0 && roundPara[i][j] < 9)
  358.           {
  359.             for(int m = 1;m <= v;m ++)
  360.                        {
  361.              preX = startX + ((timeCount - 1) * v + m) * angleCosValue / 100000;
  362.              preY = startY - ((timeCount - 1) * v + m) * angleSinValue / 100000;
  363.               if(isCollided(preX,preY,j * 16 + 8,i * 14 + 8))
  364.                          {
  365.                 hitted = true;
  366.                 nowX = preX;
  367.                 nowY = preY;
  368.                 hittedI = i;
  369.                 hittedJ = j;
  370.                 break;
  371.                          }
  372.                        }
  373.             return;
  374.           }
  375.          }
  376.         }
  377.    else if(i % 2 == 1)
  378.         {
  379.           for(int j = 0;j < 7; j ++)
  380.           {
  381.      if(isCollided(nowX,nowY,8 + j * 16 + 8,i * 14 + 8) && roundPara[i][j] > 0 && roundPara[i][j] < 9)
  382.             {
  383.               for(int m = 1;m <= v;m ++)
  384.                                    {
  385.               preX = startX + ((timeCount - 1) * v + m) * angleCosValue / 100000;
  386.               preY = startY - ((timeCount - 1) * v + m) * angleSinValue / 100000;
  387.               if(isCollided(preX,preY,8 + j * 16 + 8,i * 14 + 8))
  388.                                      {
  389.                           hitted = true;
  390.                           nowX = preX;
  391.                           nowY = preY;
  392.                           hittedI = i;
  393.                           hittedJ = j;
  394.                             break;
  395.                                      }
  396.                                    }
  397.                return;
  398.             }
  399.           }
  400.         }
  401.       }       //for(int i = 0;i < 10; i ++)
  402.  }
  403. private boolean checkDisappear()
  404.  {
  405. int sameColorCount = 0;
  406.  for(int i = 0;i < 10;i ++)
  407.    if(i % 2 == 0)
  408.    {
  409. for(int j = 0 ;j < 8 ;j ++)
  410.        if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  411.          sameColorCount ++;
  412.    }
  413.    else if(i % 2 == 1)
  414.    {
  415.       for(int j = 0;j < 7;j ++)
  416.         if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  417.           sameColorCount ++;
  418.    }
  419. if(sameColorCount >= 3)
  420.    {
  421. score += sameColorCount;
  422. disappearCount = 5;
  423. /*
  424. for(int i = 0;i < 10;i ++)
  425.      {
  426.      for(int j = 0;j < (i % 2 == 0 ? 8 : 7);j ++)
  427.       {
  428.       if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  429.         roundPara[i][j] = 0;
  430.       }
  431.      }
  432. */
  433. return true;
  434.    }
  435.    for(int i = 0;i < 10;i ++)
  436.         {
  437.         for(int j = 0;j < (i % 2 == 0 ? 8 : 7);j ++)
  438.          {
  439.          if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  440.            roundPara[i][j] -= 8;
  441.          }
  442.         }
  443.  return false;
  444.  }
  445. private void checkConnect(int x,int y,int color)         //let all round have the same color disappear
  446.  {
  447. if(x == 10 && haveNoSameRound(x,y,color))
  448.    {
  449.      overThread = true;
  450.      return;
  451.    }
  452. if(roundPara[x][y] == color)
  453.      roundPara[x][y] += 8;
  454. if(haveNoSameRound(x,y,color))
  455.      return;
  456. else
  457.    {
  458.    if(x == 9)
  459.    {
  460.    if(y == 0)
  461.     {
  462.      if(roundPara[9][1] == color)
  463.      checkConnect(9,1,color);
  464.      if(roundPara[8][1] == color)
  465.      checkConnect(8,1,color);
  466.      if(roundPara[8][2] == color)
  467.        checkConnect(8,2,color);
  468.     }
  469.    else if(y == 6)
  470.     {
  471. if(roundPara[9][7] == color)
  472.         checkConnect(10,6,color);
  473. if(roundPara[8][6] == color)
  474.         checkConnect(8,6,color);
  475.     }
  476.    else
  477.     {
  478.    if(roundPara[8][y] == color)
  479.      checkConnect(8,y,color);
  480.   if(roundPara[8][y + 1] == color)
  481.     checkConnect(8,y + 1,color);
  482.    if(roundPara[9][y - 1] == color)
  483.      checkConnect(9,y - 1,color);
  484.    if(roundPara[9][y + 1] == color)
  485.      checkConnect(9,y + 1,color);
  486.     if(roundPara[10][y] == color)
  487.       checkConnect(10,y,color);
  488.     if(roundPara[10][y + 1] == color)
  489.       checkConnect(10,y + 1,color);
  490.     }
  491.    }            //if(x == 10)
  492. else if(x == 0)                              //the first row
  493.    {
  494.    if(y == 0)
  495.       {
  496. if(roundPara[0][1] == color)
  497.    checkConnect(0,1,color);
  498. if(roundPara[1][0] == color)
  499.    checkConnect(1,0,color);
  500.       }
  501.    else if(y == 7)
  502.       {
  503.       if(roundPara[0][6] == color)
  504.         checkConnect(0,6,color);
  505.       if(roundPara[1][6] == color)
  506.         checkConnect(1,6,color);
  507.       }
  508.    else
  509.      {
  510.      if(roundPara[x][y - 1] == color)
  511.        checkConnect(x,y - 1,color);
  512.      if(roundPara[x][y + 1] == color)
  513.        checkConnect(x,y + 1,color);
  514.      if(roundPara[x + 1][y - 1] == color)
  515.        checkConnect(x + 1,y - 1,color);
  516.      if(roundPara[x + 1][y] == color)
  517.        checkConnect(x + 1,y,color);
  518.      }
  519.    }
  520. else if(y == 0)
  521.    {
  522.   if(x % 2 == 1)
  523.      {
  524.     if(roundPara[x - 1][y] == color)
  525.       checkConnect(x - 1,y,color);
  526.     if(roundPara[x - 1][y + 1] == color)
  527.       checkConnect(x- 1,y + 1,color);
  528.     if(roundPara[x][y + 1] == color)
  529.       checkConnect(x,y + 1,color);
  530.     if(roundPara[x + 1][y] == color)
  531.       checkConnect(x + 1,y,color);
  532.     if(roundPara[x + 1][y + 1] == color)
  533.       checkConnect(x + 1,y + 1,color);
  534.      }
  535.   else if(x % 2 == 0)
  536.      {
  537. if(roundPara[x - 1][y] == color)
  538.          checkConnect(x - 1,y,color);
  539. if(roundPara[x][y + 1] == color)
  540.          checkConnect(x, y + 1,color);
  541. if(roundPara[x + 1][y] == color)
  542.          checkConnect(x + 1,y ,color);
  543.      }
  544.    }
  545. else if(y == 6 && x % 2 == 1)
  546.    {
  547. if(roundPara[x - 1][y] == color)
  548.        checkConnect(x - 1,y,color);
  549. if(roundPara[x - 1][y + 1] == color)
  550.        checkConnect(x - 1,y + 1,color);
  551. if(roundPara[x][y - 1] == color)
  552.        checkConnect(x,y - 1,color);
  553. if(roundPara[x + 1][y] == color)
  554.        checkConnect(x + 1,y,color);
  555. if(roundPara[x + 1][y + 1] == color)
  556.        checkConnect(x + 1,y + 1,color);
  557.    }
  558. else if(y == 7 && x % 2 == 0)
  559.    {
  560. if(roundPara[x - 1][y - 1] == color)
  561.        checkConnect(x - 1,y - 1,color);
  562. if(roundPara[x][y - 1] == color)
  563.        checkConnect(x,y - 1,color);
  564. if(roundPara[x + 1][y - 1] == color)
  565.        checkConnect(x + 1,y - 1,color);
  566.    }
  567. else
  568.    {
  569.    if(x % 2 == 0)
  570.      {
  571. if(roundPara[x - 1][y] == color)
  572.          checkConnect(x - 1,y,color);
  573. if(roundPara[x - 1][y - 1] == color)
  574.          checkConnect(x - 1,y - 1,color);
  575. if(roundPara[x][y - 1] == color)
  576.          checkConnect(x,y - 1,color);
  577. if(roundPara[x][y + 1] == color)
  578.          checkConnect(x,y + 1,color);
  579. if(roundPara[x + 1][y] == color)
  580.          checkConnect(x + 1,y,color);
  581. if(roundPara[x + 1][y - 1] == color)
  582.          checkConnect(x + 1,y - 1,color);
  583.      }
  584.    else if(x % 2 == 1)
  585.      {
  586.        if(roundPara[x - 1][y] == color)
  587.                 checkConnect(x - 1,y,color);
  588.        if(roundPara[x - 1][y + 1] == color)
  589.                 checkConnect(x - 1,y + 1,color);
  590.        if(roundPara[x][y - 1] == color)
  591.                 checkConnect(x,y - 1,color);
  592.        if(roundPara[x][y + 1] == color)
  593.                 checkConnect(x,y + 1,color);
  594.        if(roundPara[x + 1][y] == color)
  595.                 checkConnect(x + 1,y,color);
  596.        if(roundPara[x + 1][y + 1] == color)
  597.                 checkConnect(x + 1,y + 1,color);
  598.      }
  599.     }
  600.    }
  601.                           //
  602.  }
  603. private void checkFall()
  604.  {
  605. int color;
  606. for(int i = 0;i < 10;i ++)            //have no connectting with the top wall
  607.    {
  608.        if(i % 2 == 0)
  609.      {
  610. for(int j = 0;j < 8 ;j ++)
  611.        {
  612. color = roundPara[i][j];
  613.   if(roundPara[i][j] > 0 && roundPara[i][j] < 9 && !connectWithTopWall(i,j))
  614.          {
  615.            fallingNum ++;
  616.            score ++;
  617.            roundPara[i][j] = 0;
  618.          fallingPara[fallingNum - 1][0] = color;
  619.          fallingPara[fallingNum - 1][1] = 16 * j + 8;
  620.          fallingPara[fallingNum - 1][2] = 14 * i + 8;
  621.         }
  622.         for(int x = 0;x < 10;x ++)
  623.                  {
  624.                    for(int y = 0;y < (x % 2 == 0 ? 8 : 7);y ++)
  625.                   if(roundPara[x][y] > 16 && roundPara[x][y] < 25)
  626.                     roundPara[x][y] = roundPara[x][y] - 16;
  627.                  }
  628.        }
  629.      }
  630. else if(i % 2 == 1)
  631.      {
  632. for(int j = 0;j < 7;j ++)
  633.        {
  634. color = roundPara[i][j];
  635.      if(roundPara[i][j] > 0 && roundPara[i][j] < 9 && !connectWithTopWall(i,j))
  636.          {
  637.            fallingNum ++;
  638.            score ++;
  639.            roundPara[i][j] = 0;
  640.            fallingPara[fallingNum - 1][0] = color;
  641.            fallingPara[fallingNum - 1][1] = 16 * j + 8;
  642.            fallingPara[fallingNum - 1][2] = 14 * i + 8;
  643.          }
  644.          for(int x = 0;x < 10;x ++)
  645.                     {
  646.                       for(int y = 0;y < (x % 2 == 0 ? 8 : 7);y ++)
  647.                       if(roundPara[x][y] > 16 && roundPara[x][y] < 25)
  648.                         roundPara[x][y] = roundPara[x][y] - 16;
  649.                     }
  650.        }
  651.      }
  652.    }                  //for(int i = 1;i < 10;i ++)
  653. for(int m = 0;m < 10;m ++)
  654.    {
  655.      for(int n = 0;n < (m % 2 == 0 ? 8 : 7);n ++)
  656.        System.out.print(roundPara[m][n]);
  657.    }
  658.  }
  659. private boolean connectWithTopWall(int i,int j)
  660.  {
  661. if(i == 0 && roundPara[i][j] > 0 && roundPara[i][j] < 9)
  662.      return true;
  663. else   if(roundPara[i][j] > 0 && roundPara[i][j] < 9)
  664.          {
  665.         roundPara[i][j] += 16;
  666.   if(i == 9)
  667.    {
  668.    if(j == 0)
  669.     {
  670.     if(connectWithTopWall(8,0) || connectWithTopWall(8,1) || connectWithTopWall(9,1))
  671.       return true;
  672.     }
  673.    else if(j == 6)
  674.     {
  675.      if(connectWithTopWall(8,6) || connectWithTopWall(8,7) || connectWithTopWall(9,5))
  676.      return true;
  677.     }
  678.    else if(connectWithTopWall(9,j - 1) || connectWithTopWall(9,j + 1)
  679.          ||connectWithTopWall(8,j) || connectWithTopWall(8,j + 1))
  680.      return true;
  681.    }
  682. else if(i == 0)
  683.    {
  684.    }
  685. else if(j == 0)
  686.    {
  687.   if(i % 2 == 1)
  688.      {
  689.        if(connectWithTopWall(i - 1,j + 1) || connectWithTopWall(i - 1,j)
  690.        ||connectWithTopWall(i,j + 1)
  691.        ||connectWithTopWall(i + 1,j + 1) || connectWithTopWall(i + 1,j))
  692.     return true;
  693.      }
  694.   else if(i % 2 == 0)
  695.      {
  696.      if(connectWithTopWall(i - 1,j)
  697.      || connectWithTopWall(i,j + 1) ||
  698.      connectWithTopWall(i + 1,j))
  699.        return true;
  700.      }
  701.    }
  702. else if(j == 6 && i % 2 == 1)
  703.    {
  704. if(connectWithTopWall(i - 1,j) || connectWithTopWall(i - 1,j + 1)
  705.    || connectWithTopWall(i,j - 1)
  706.    || connectWithTopWall(i + 1,j) || connectWithTopWall(i + 1,j + 1))
  707.       return true;
  708.    }
  709. else if(j == 7 && i % 2 == 0)
  710.    {
  711.    if(connectWithTopWall(i,j - 1)
  712.    || connectWithTopWall(i - 1,j - 1)
  713.    || connectWithTopWall(i + 1,j - 1))
  714.      return true;
  715.    }
  716. else
  717.    {
  718.    if(i % 2 == 0)
  719.      {
  720.      if(connectWithTopWall(i - 1,j - 1)|| connectWithTopWall(i - 1,j)
  721.         || connectWithTopWall(i, j - 1) || connectWithTopWall(i, j + 1)
  722.         || connectWithTopWall(i + 1,j - 1) || connectWithTopWall(i + 1, j))
  723.     return true;
  724.      }
  725.    else if(i % 2 == 1)
  726.      {
  727.      if(connectWithTopWall(i - 1,j) || connectWithTopWall(i - 1,j + 1)
  728.         || connectWithTopWall(i, j - 1) || connectWithTopWall(i,j + 1)
  729.         || connectWithTopWall(i + 1,j) || connectWithTopWall(i + 1,j + 1))
  730.      return true;
  731.      }
  732.    }
  733.  return false;
  734.  }
  735. else return false;
  736.  }
  737. private boolean haveNoSameRound(int x,int y,int color)
  738.  {
  739. if(x == 10)
  740.    {
  741.     if(roundPara[9][y - 1] == color || roundPara[9][y] == color)
  742.      return false;
  743.    }
  744. else if(x == 0)                              //the first row
  745.    {
  746.    if(y == 0)
  747.       {
  748.       if(roundPara[0][1] == color || roundPara[1][0] == color)
  749.         return false;
  750.       }
  751.    else if(y == 7)
  752.       {
  753.       if(roundPara[0][6] == color || roundPara[1][6] == color)
  754.         return false;
  755.       }
  756.    else if(roundPara[0][y - 1] == color || roundPara[0][y + 1] == color
  757.         || roundPara[1][y] == color || roundPara[1][y - 1] == color)
  758.         return false;
  759.    }
  760. else if(y == 0)
  761.    {
  762.   if(x % 2 == 1)
  763.      {
  764.     if(roundPara[x - 1][y] == color || roundPara[x - 1][y + 1] == color || roundPara[x][y + 1] == color
  765.     ||roundPara[x + 1][y] == color || roundPara[x + 1][y + 1] == color)
  766.     return false;
  767.      }
  768.   else if(x % 2 == 0)
  769.      {
  770.      if(roundPara[x - 1][y] == color || roundPara[x][y + 1] == color || roundPara[x + 1][y] == color)
  771.        return false;
  772.      }
  773.    }
  774. else if(y == 6 && x % 2 == 1)
  775.    {
  776.    if(roundPara[x][y - 1] == color || roundPara[x - 1][y] == color || roundPara[x - 1][y + 1] == color
  777.     ||roundPara[x + 1][y] == color || roundPara[x + 1][y + 1] == color)
  778.    return false;
  779.    }
  780. else if(y == 7 && x % 2 == 0)
  781.    {
  782.    if(roundPara[x][y - 1] == color || roundPara[x - 1][y - 1] == color || roundPara[x + 1][y - 1] == color)
  783.      return false;
  784.    }
  785. else
  786.    {
  787.    if(x % 2 == 0)
  788.      {
  789.      if(roundPara[x - 1][y - 1] == color || roundPara[x - 1][y] == color || roundPara[x][ y - 1] == color
  790.       ||roundPara[x][y + 1] == color || roundPara[x + 1][y - 1] == color || roundPara[x + 1][y] == color)
  791.     return false;
  792.      }
  793.    else if(x % 2 == 1)
  794.      {
  795.      if(roundPara[x - 1][y] == color || roundPara[x - 1][y + 1] == color || roundPara[x][y - 1] == color
  796.       ||roundPara[x][y + 1] == color || roundPara[x + 1][y] == color || roundPara[x + 1][y + 1] == color)
  797.      return false;
  798.      }
  799.    }         //else
  800. return true;
  801.  }
  802.  private void dealWithHit(int i,int j)
  803.   {
  804. int a = 8 << 1;
  805.     if(nowX == paintW - 8)
  806.         {
  807.         if(i % 2 == 0)
  808.         {
  809.           roundPara[i + 1][j - 1] = isMovingColor;
  810.          checkConnect(i + 1,j - 1,isMovingColor);
  811.         }
  812.         else
  813.          {
  814.           roundPara[i + 1][j + 1] = isMovingColor;
  815.           checkConnect(i + 1,j + 1,isMovingColor);
  816.          }
  817.         }
  818.     else if(nowX == 8)
  819.         {
  820.         roundPara[i + 1][0] = isMovingColor;
  821.         checkConnect(i + 1,0,isMovingColor);
  822.         }
  823.     else if(i % 2 == 0)
  824.        {
  825.      if(nowX < 8 + j * 16)                   //left
  826.         {
  827.     if(j >= 1 && Math.abs(nowY - (i * 14 + 8)) < localStand && roundPara[i][j - 1] == 0)
  828.           {
  829.             roundPara[i][j - 1] = isMovingColor;
  830.             checkConnect(i,j - 1,isMovingColor);
  831.           }
  832.     else  if(roundPara[i + 1][j - 1] == 0)
  833.           {
  834.             roundPara[i + 1][j - 1] = isMovingColor;
  835.           checkConnect(i + 1,j - 1,isMovingColor);
  836.         }
  837.     else  {
  838. //if(roundPara[i][j - 1] == 0)
  839.      // {
  840.       //  roundPara[i][j - 1] = isMovingColor;
  841. //checkConnect(i,j - 1,isMovingColor);
  842.       //}
  843. //else
  844.         {
  845.           roundPara[i + 1][j] = isMovingColor;
  846.           checkConnect(i + 1,j,isMovingColor);
  847.         }
  848.           }
  849.          }
  850.    else if(nowX >= 8 + j * 16)
  851.         {
  852.           if(j <= 6 && Math.abs(nowY - (i * 14 + 8)) < localStand && roundPara[i][j + 1] == 0)
  853.                 {
  854.                   roundPara[i][j + 1] = isMovingColor;
  855.                   checkConnect(i,j + 1,isMovingColor);
  856.                 }
  857.           else if(roundPara[i + 1][j] == 0) {
  858.                 roundPara[i + 1][j] = isMovingColor;
  859.                 checkConnect(i + 1,j,isMovingColor);
  860.                  }
  861.            else{
  862.              roundPara[i + 1][j - 1] = isMovingColor;
  863.              checkConnect(i + 1,j - 1,isMovingColor);
  864.                }
  865.         }
  866.        }
  867.       else if(i % 2 == 1)
  868.        {
  869.          if(nowX < 8 + j * 16 + 8)                   //left
  870.          {
  871.             if(j >= 1 && Math.abs(nowY - (i * 14 + 8)) < localStand && roundPara[i][j - 1] == 0)
  872.             {
  873.             roundPara[i][j - 1] = isMovingColor;
  874.             checkConnect(i,j - 1,isMovingColor);
  875.             }
  876.            else if(j >= 0 && roundPara[i + 1][j] == 0)
  877.            {
  878.              roundPara[i + 1][j] = isMovingColor;
  879.              checkConnect(i + 1,j,isMovingColor);
  880.            }
  881.            else
  882.            {
  883.            roundPara[i + 1][j + 1] = isMovingColor;
  884.         checkConnect(i + 1,j + 1,isMovingColor);
  885.          }
  886.           }
  887.          else if(nowX >= 8 + j * 16 + 8)
  888.             {
  889.       if(j <= 5 && Math.abs(nowY - (i * 14 + 8)) < localStand && roundPara[i][j + 1] == 0)      //down
  890.                {
  891.                  roundPara[i][j + 1] = isMovingColor;
  892.                  checkConnect(i,j + 1,isMovingColor);
  893.                }
  894.             else  if(roundPara[i + 1][j + 1] == 0)
  895.               {
  896.                 roundPara[i + 1][j + 1] = isMovingColor;
  897.                 checkConnect(i + 1,j + 1,isMovingColor);
  898.               }
  899.               else
  900.               {
  901.                 roundPara[i + 1][j] = isMovingColor;
  902.                 checkConnect(i + 1,j,isMovingColor);
  903.               }
  904.             }
  905.        }
  906.      for(int x = 0;x < 10;x ++)
  907.      {
  908.        for(int y = 0;y < (x % 2 == 0 ? 8 : 7);y ++)
  909.          System.out.print(roundPara[x][y]);
  910.      }
  911.        if(checkDisappear())            // if this round three or more ball disappeared
  912.        checkFall();
  913.        isMoving = false;
  914.   }                                       //dealWithHit()
  915. private boolean gameOver()
  916.   {
  917. for(int i = 11 - nowTop;i < 12;i ++)
  918.     {
  919. for(int j = 0;j < (i % 2 == 0 ? 8 : 7);j ++)
  920. if(roundPara[i][j] > 0 && roundPara[i][j] < 9)
  921.             return true;
  922.     }
  923. return false;
  924.   }
  925. private boolean isCollided(int x1,int y1,int x2,int y2)
  926.  {
  927.  if((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= (8 + effectiveR) * (8 + effectiveR))
  928.      return true;
  929.  else return false;
  930.  }
  931.   /** Required paint implementation */
  932. protected void paint(Graphics g)
  933.   {
  934. g.setColor(0,0,0);
  935. g.fillRect(0,0,screenW,screenH);
  936. drawBackGround(g);
  937. g.translate(7,3);
  938. g.setClip(0,0,paintW,paintH);
  939. DirectGraphics dg = DirectUtils.getDirectGraphics(g);
  940. drawForeGround(g,dg);
  941.    /** @todo Add paint codes */
  942.   }
  943. private void addBalls(int floors)
  944.   {
  945.   for(int i = 0;i < 8;i ++)           //往最底层加上一层泡泡
  946.    {
  947.    for(int j = 10;j > 0;j --)
  948.       {
  949.       if(roundPara[i][j] != 0)
  950.          {
  951.            if(i % 2 == 0)
  952.             {
  953. if(roundPara[i][j + 1] == 0)
  954.                 addOneBall(i,j + 1);
  955.                 break;
  956.             }
  957.             else if(i % 2 == 1)                        // i % 2 == 1
  958.             {
  959. roundPara[i + 1][j - 1] = roundPara[i + 1][j - 1] == 0 ? 1 + (((Resource.random.nextInt() % 8)<<1)>>1) : roundPara[i + 1][j - 1];
  960. roundPara[i + 1][j] = roundPara[i + 1][j] == 0 ? 1 + (((Resource.random.nextInt() % 8) << 1)>>1) : roundPara[i + 1][j] ;
  961.             }
  962.          }
  963.        }
  964.    }
  965.   }
  966. private void addOneBall(int x,int y)
  967.   {
  968.   if(
  969.       (x % 2 == 0 && y < 8 && roundPara[x][y] == 0) ||
  970.       (x % 2 == 1 && y < 7 && roundPara[x][y] == 0)
  971.     )
  972.      roundPara[x][y] = 1 + Math.abs(Resource.random.nextInt() % 8);
  973.   }
  974. private void drawScore(Graphics g)
  975.   {
  976. g.setClip(102,192,74,16);
  977. g.setColor(100,255,100);
  978. g.drawString("score:"+ score,104,194,Graphics.LEFT | Graphics.TOP);
  979. g.setClip(0,0,176,208);
  980.   }
  981. private void drawPaoPao(Graphics g)
  982.   {
  983.   for(int i = 0;i < 11;i ++)
  984.     {
  985.        if(i % 2 == 0)
  986.         for(int j = 0;j < 8;j ++)
  987.         {
  988.      if(roundPara[i][j] > 0 && roundPara[i][j] < 9)
  989.           {
  990.       g.setClip(16 * j,14 * i,16,16);
  991.       g.drawImage(Resource.getImage(Resource.BALL),
  992.       j * 16  - (roundPara[i][j] - 1) * 16 +(shaking ? shakeOffX[shakeCount]:0),
  993.       i * 14 ,Graphics.LEFT | Graphics.TOP);
  994.       g.setClip(0,0,paintW,paintH);
  995.           }
  996.       else if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  997.       {
  998.       g.setClip(16 * j,14 * i,16,16);
  999.       switch(disappearCount)
  1000.       {
  1001.       case 5:
  1002.         g.drawImage(Resource.getImage(Resource.BALL),
  1003.         j * 16  - (roundPara[i][j] - 8 - 1) * 16 +(shaking ? shakeOffX[shakeCount]:0),
  1004.         i * 14 ,Graphics.LEFT | Graphics.TOP);
  1005.       break;
  1006.       case 4:
  1007.       case 3:
  1008.       case 2:
  1009.       case 1:
  1010.         g.drawImage(Resource.getImage(Resource.BALL),
  1011.           j * 16  - (15 - disappearCount / 3) * 16 +(shaking ? shakeOffX[shakeCount]:0),
  1012.           i * 14 ,Graphics.LEFT | Graphics.TOP);
  1013.       break;
  1014.       default:
  1015.       break;
  1016.       }
  1017.       g.setClip(0,0,paintW,paintH);
  1018.       }
  1019.          }
  1020.          else  if(i % 2 == 1)
  1021.          for( int j = 0;j < 7 ; j ++)
  1022.          {
  1023.          if(roundPara[i][j] > 0 && roundPara[i][j] < 9)
  1024.           {
  1025.          g.setClip(8 + 16 * j,14 * i,16,16);
  1026.          g.drawImage(Resource.getImage(Resource.BALL),
  1027.          8 + 16 * j - (roundPara[i][j] - 1) * 16 + (shaking ? shakeOffX[shakeCount]:0),
  1028.          i * 14 ,Graphics.TOP | Graphics.LEFT);
  1029.          g.setClip(0,0,paintW,paintH);
  1030.           }
  1031.          else if(roundPara[i][j] > 8 && roundPara[i][j] < 17)
  1032.            {
  1033.              g.setClip(16 * j + 8,14 * i,16,16);
  1034.                   switch(disappearCount / 3)
  1035.                   {
  1036.                   case 5:
  1037.                     g.drawImage(Resource.getImage(Resource.BALL),
  1038.                     j * 16 + 8 - (roundPara[i][j] - 8 - 1) * 16 +(shaking ? shakeOffX[shakeCount]:0),
  1039.                     i * 14 ,Graphics.LEFT | Graphics.TOP);
  1040.                   break;
  1041.                   case 4:
  1042.                   case 3:
  1043.                   case 2:
  1044.                   case 1:
  1045.                     g.drawImage(Resource.getImage(Resource.BALL),
  1046.                       j * 16 + 8 - (15 - disappearCount / 3) * 16 +(shaking ? shakeOffX[shakeCount]:0),
  1047.                       i * 14 ,Graphics.LEFT | Graphics.TOP);
  1048.                   break;
  1049.                   default:
  1050.                   break;
  1051.                   }
  1052.                   g.setClip(0,0,paintW,paintH);
  1053.            }
  1054.          }
  1055.      }
  1056.   }
  1057. private void drawForeGround(Graphics g,DirectGraphics dg)
  1058.   {
  1059.         //drawTop(g);
  1060.         drawToBeShoot(g);
  1061.         drawNextOne(g);
  1062.         drawIsMoving(g);
  1063.         drawPointer(dg);
  1064.         drawPaoPao(g);
  1065.         drawFalling(g);
  1066.     if(roundStart)
  1067.     {;}
  1068.     else
  1069.     {
  1070.     if(overThread)
  1071.      {
  1072.     g.setClip(0,paintH - overCount,paintW,overCount);
  1073.     for(int i = 0;i < 12;i ++)
  1074.     for(int j = 0;j < (i % 2 == 0 ? 8 : 7);j ++)
  1075.       if(roundPara[i][j] != 0)
  1076.     g.drawImage(Resource.getImage(Resource.BBALL),j * 16 + 8 + (i % 2 == 0 ? 0 : 8),
  1077.         i * 14,Graphics.VCENTER |Graphics.HCENTER);
  1078.     g.setClip(0,0,paintW,paintH);
  1079.      }
  1080.     else
  1081.      {
  1082.      }
  1083.     }
  1084.     if(roundStart)
  1085.     drawRoundStart(dg);
  1086.   }
  1087. private void drawBackGround(Graphics g)
  1088.   {
  1089. g.drawImage(Resource.getImage(Resource.BG),0,0,Graphics.LEFT | Graphics.TOP);
  1090. drawScore(g);
  1091.   }
  1092. private void drawTop(Graphics g)
  1093.   {
  1094.   }
  1095. private void drawPointer(DirectGraphics dg)
  1096.   {
  1097. if(angle <= 90)
  1098. dg.drawImage(Resource.getImage(angle / 6),71 - orgX,170 - orgY,
  1099.              Graphics.VCENTER | Graphics.HCENTER,0);
  1100. else if(angle >= 90)
  1101. dg.drawImage(Resource.getImage((180 - angle) / 6),71 - orgX,170 - orgY,
  1102.              Graphics.VCENTER | Graphics.HCENTER,
  1103.              DirectGraphics.FLIP_HORIZONTAL);
  1104.   }
  1105. private void drawIsMoving(Graphics g)
  1106.   {
  1107. if(isMoving)
  1108.     {
  1109. g.setClip(nowX - 8,nowY - 8,16,16);
  1110. g.drawImage(Resource.getImage(Resource.BALL),nowX - 8 - (isMovingColor - 1) * 16,nowY - 8,Graphics.LEFT | Graphics.TOP);
  1111. g.setClip(0,0,paintW,paintH);
  1112.     }
  1113.   }
  1114. private void drawToBeShoot(Graphics g)
  1115.   {
  1116. g.setClip(71 - orgX - 8,170 - orgY - 8,16,16);
  1117. g.drawImage(Resource.getImage(Resource.BALL),71 - orgX - 8 - (toBeShootColor - 1) * 16,
  1118.                 170 - orgY - 8,Graphics.LEFT | Graphics.TOP);
  1119. g.setClip(0,0,paintW,paintH);
  1120.   }
  1121. private void drawNextOne(Graphics g)
  1122.   {
  1123. g.setClip(54 - orgX - 8,190 - orgY - 16,16,16);
  1124. g.drawImage(Resource.getImage(Resource.BALL),54 - orgX - 8 - (nextOneColor - 1) * 16,
  1125.                 190 - orgY - 16,Graphics.TOP | Graphics.LEFT);
  1126. g.setClip(0,0,paintW,paintH);
  1127.   }
  1128. private void drawFalling(Graphics g)
  1129.   {
  1130.   if(fallingNum > 0)
  1131.    {
  1132.      for(int i = 0;i < fallingNum;i ++)
  1133.       {
  1134.       g.setClip(fallingPara[i][1] - 8,fallingPara[i][2] - 8,16,16);
  1135.       g.drawImage(Resource.getImage(Resource.BALL),
  1136.                   fallingPara[i][1]  - 8 - 16 * (fallingPara[i][0] - 1),
  1137.                   fallingPara[i][2] - 8,Graphics.LEFT | Graphics.TOP);
  1138.       g.setClip(0,0,paintW,paintH);
  1139.        }
  1140.     }
  1141.   }
  1142. public static void drawRoundStart(Graphics g)
  1143.   {
  1144.   }
  1145. private void drawRoundStart(DirectGraphics dg)
  1146.   {
  1147. if(roundStartCount <= 16)
  1148.     {
  1149.     }
  1150. else if(roundStartCount <= 32)
  1151.     {
  1152. if(roundStartCount >= 48)
  1153.       {
  1154.       }
  1155.     }
  1156. else
  1157.     {
  1158.     }
  1159.   }
  1160. private void drawGameOver(Graphics g)
  1161.   {
  1162.   }
  1163. }