LinezCanvas.java
上传用户:jinxueyang
上传日期:2016-05-15
资源大小:104k
文件大小:20k
源码类别:

J2ME

开发平台:

Java

  1. package game;
  2. import java.util.*;
  3. import javax.microedition.lcdui.*;
  4. import javax.microedition.media.Manager;
  5. public class LinezCanvas extends Canvas
  6. {
  7. //Display对象
  8. Display display;
  9. //屏幕的宽度与高度
  10. private int scrWidth = 0;
  11. private int scrHeight = 0;
  12. //声明次画面
  13. private Graphics offG = null;
  14. private Image image = null;
  15. private int grid[][] = new int[9][9];
  16. private int position[][] = new int[81][2];
  17. //格子与顶部、左端的距离
  18. private int spaceTop = 0;
  19. private int spaceLeft = 0;
  20. //格子的宽度与高度
  21. private int gridWidth = 0;
  22. private int gridHeight = 0;
  23. //格子的x、y坐标
  24. private int gridX = 0;
  25. private int gridY = 0;
  26. //已经选择标记
  27. private boolean clickFlag = false;
  28. //选择框初始位置
  29. private int initRow = 4;
  30. private int initCol = 4;
  31. //球被选择的位置
  32. private int choseRow = 0;
  33. private int choseCol = 0;
  34. //声明图片对象
  35. private Image img[] = new Image[3+(ColorLinezMIDlet.gameGrade-1)*2];
  36. //声明随机数对象
  37. private Random random = null;
  38. //球的下标
  39. private int chSphere = 0;
  40. //球的颜色数
  41. private int colorTotal = 0;
  42. //消失球数
  43. private int delNum = 5;
  44. //球的总数
  45. private int sphereTotal = 0;
  46. //新球位置
  47. private int newPos = 0;
  48. //存储球位置一维下标
  49. private int posRow = 0;
  50. //游戏状态 0代表进行中 1游戏暂停 2游戏结束
  51. private int gameFlag = 0;
  52. //分数
  53. private int score = 0;
  54. //时间分钟数
  55. private int minute = 0;
  56. //秒数
  57. private int second = 0;
  58. //定时器
  59. private Timer timer = null;
  60. //球消失时闪烁的次数
  61. private int disCount = 0;
  62. //球是否正在消失
  63. private boolean deleting = false;
  64. //球色相同所在的行数
  65. private int rows[] = new int[6];
  66.     //球色相同所在的列数
  67. private int cols[] = new int[6];
  68.     //球色相同所在的行数
  69. private int same[] = new int[6];
  70.     //球消失的方向
  71. private int delDir[] = { 0, 1, 2, 2, 3, 3 };
  72.     private boolean isUper[] = new boolean[6];
  73.     //出现球的球数
  74.     private int count = 0;
  75.     private int total = 0;
  76.     
  77.     //暂停选项索引
  78.     private int pauseIndex = 0;
  79.     //暂停图片
  80.     private Image pauseImage = null;
  81.     //游戏结束选项索引
  82.     private int overIndex = 0;
  83.     //游戏结束图片
  84.     private Image overImage = null;
  85.     
  86.     /**
  87.      * 构造方法
  88.      * */
  89.     public LinezCanvas(Display display)
  90.     {
  91.      //获得Display对象
  92.      this.display = display;
  93.      //设屏全屏
  94.      this.setFullScreenMode(true);
  95.         //得到屏幕的宽度与高度
  96.      scrWidth = this.getWidth();
  97.      scrHeight = this.getHeight();
  98.      //计算格子的宽度与高度
  99.      gridWidth = ( scrWidth - 6 ) / grid[0].length;
  100.      gridHeight = gridWidth;
  101.     
  102.      //设置格子与顶部、左端的距离
  103.      spaceTop = (scrHeight - gridHeight*9)/2 + 6;
  104.      spaceLeft = (scrWidth - gridWidth*9)/2;
  105.         //获得次画笔对象
  106.      image = Image.createImage(scrWidth, scrHeight);
  107.      offG = image.getGraphics();
  108.         //创建Random对象
  109.      random = new Random();
  110.      //游戏初始化
  111.         gameInit();
  112.         
  113.      //导入图片
  114.         for ( int i = 0; i < colorTotal; i++ )
  115.         {
  116.          try
  117.          {
  118.          img[i] = Image.createImage("/res/0"+i+".png");
  119.          }
  120.          catch(Exception e)
  121.          {}
  122.         }
  123.         
  124.      //创建Timer对象
  125.      timer = new Timer();
  126.      //启动时间线程
  127.      timer.scheduleAtFixedRate(new TimeTimerTask(),100,1000);
  128.     }
  129.     
  130.     //游戏初始化
  131.     public void gameInit()
  132.     {
  133.      //游戏进行中
  134.      gameFlag = 0;
  135.      //球的颜色数
  136.      colorTotal = 3+(ColorLinezMIDlet.gameGrade-1)*2;
  137.      //球的总数
  138.      sphereTotal = 0;
  139.      //选择框初始位置
  140.      initRow = 4;
  141.      initCol = 4;
  142.      //分数
  143.         score = 0;
  144.      //时间分钟数
  145.      minute = 0;
  146.      //秒数
  147.      second = 0;
  148.      for ( int i = 0, m = 0; i < grid.length; i++ )
  149.      {
  150.      for ( int j = 0; j < grid[i].length; j++, m++ )
  151.      {
  152.      grid[i][j] = 0;
  153.                 //新出现球的位置
  154.          position[m][0] = i;
  155.          position[m][1] = j;
  156.      }
  157.      }
  158.      //游戏开始新出现5个小球
  159.      createSphere(5);
  160.     }
  161.     
  162.     protected void paint(Graphics g)
  163.     {
  164.      //清屏
  165.      offG.setColor(0xFFFFFF);
  166.      offG.fillRect(0, 0, scrWidth, scrHeight);
  167.      offG.setColor(0x000000);
  168.      //0代表游戏进行中 1游戏暂停 2游戏结束
  169.      switch ( gameFlag )
  170.      {
  171.          case 0:
  172.                 drawGrid(offG);
  173.                 break;
  174.          case 1:
  175.           pauseGame(offG);
  176.           break;
  177.          case 2:
  178.           gameOver(offG);
  179.           break;
  180.      }
  181.         g.drawImage(image, 0, 0, Graphics.TOP | Graphics.LEFT);
  182.     }
  183.     
  184.     /**
  185.      * 启动线程
  186.      * */
  187.     public void start()
  188.     {
  189.      if ( timer == null )
  190.      {
  191.            timer = new Timer();
  192.            timer.schedule(new TimeTimerTask(),100,1000);
  193.      }
  194.     }
  195.     /**
  196.      * 停止线程
  197.      * */
  198.     public void stop()
  199.     {
  200.         if(timer != null)
  201.         {
  202.             timer.cancel();
  203.             timer = null;
  204.         }
  205.     }
  206.     
  207.     /**
  208.      * 退出游戏
  209.      * */
  210.     public void quitGame()
  211.     {
  212.      stop();
  213.      for ( int i = 0; i < colorTotal; i++ )
  214.      {
  215.      img[i] = null;
  216.      }
  217.      if ( pauseImage != null )
  218.      {
  219.      pauseImage = null;
  220.      }
  221.      if ( overImage != null )
  222.      {
  223.      overImage = null;
  224.      }
  225.     }
  226.     
  227.     protected void hideNotify()
  228.     {
  229.         stop();
  230.     }
  231.     
  232.     protected void showNotify()
  233.     {
  234.      start();
  235.     }
  236.     protected void keyPressed(int keyCode)
  237.     {
  238.      //球在消失中立即返回
  239.      if ( deleting )
  240.      {
  241.      return;
  242.      }
  243.         //游戏进行中,进行上下左右移动选择
  244.      if ( gameFlag == 0 )
  245.      {
  246.      int action = this.getGameAction(keyCode);
  247.          switch (action)
  248.          {
  249.              case Canvas.UP:
  250.                     moveUp();
  251.               break;
  252.              case Canvas.DOWN:
  253.                     moveDown();
  254.               break;
  255.              case Canvas.LEFT:
  256.                     moveLeft();
  257.               break;
  258.              case Canvas.RIGHT:
  259.                     moveRight();
  260.               break;
  261.              case Canvas.FIRE:
  262.                     commitPosition();
  263.                     break;
  264.                 default:
  265.                  if ( keyCode == -7 )
  266.                  {
  267.                  gameFlag = 1;
  268.                  }
  269.                     break;
  270.          }
  271.      }
  272.      //游戏暂停
  273.      else if ( gameFlag == 1 )
  274.      {
  275.          switch ( keyCode )
  276.          {
  277.              case -1:
  278.               pauseIndex--;
  279.               if ( pauseIndex < 0 )
  280.               {
  281.               pauseIndex = 3;
  282.               }
  283.               break;
  284.              case -2:
  285.               pauseIndex++;
  286.               if ( pauseIndex > 3 )
  287.               {
  288.               pauseIndex = 0;
  289.               }
  290.               break;
  291.              case -5:
  292.               switch ( pauseIndex )
  293.               {
  294.               case 0:
  295.                   gameFlag = 0;
  296.                   start();
  297.               break;
  298.               case 1:
  299.               gameInit();
  300.               start();
  301.               break;
  302.               case 2:
  303.               quitGame();
  304.                   display.setCurrent(new MainMenuCanvas(display));
  305.                   break;
  306.               case 3:
  307.               quitGame();
  308.               ColorLinezMIDlet.quitApp();
  309.               break;
  310.               }
  311.          }
  312.      }
  313.      //游戏结束
  314.      else if ( gameFlag == 2 )
  315.      {
  316.          switch ( keyCode )
  317.          {
  318.              case -1:
  319.               overIndex--;
  320.               if ( overIndex < 0 )
  321.               {
  322.               overIndex = 2;
  323.               }
  324.               break;
  325.              case -2:
  326.               overIndex++;
  327.               if ( overIndex > 2 )
  328.               {
  329.               overIndex = 0;
  330.               }
  331.               break;
  332.              case -5:
  333.               switch ( overIndex )
  334.               {
  335.               case 0:
  336.               gameInit();
  337.               start();
  338.               break;
  339.               case 1:
  340.               quitGame();
  341.                   display.setCurrent(new MainMenuCanvas(display));
  342.                   break;
  343.               case 2:
  344.               quitGame();
  345.               ColorLinezMIDlet.quitApp();
  346.               break;
  347.               }
  348.          }
  349.      }
  350.     
  351.      if ( ColorLinezMIDlet.isPlaySound )
  352.      {
  353.          playSound();
  354.      }
  355.      repaint();
  356.     }
  357.     
  358.     //向上移
  359.     private void moveUp()
  360.     {
  361.      if ( initRow > 0 )
  362.      {
  363.      if ( clickFlag )
  364.      {
  365.      if ( (grid[initRow-1][initCol] == 0) | ((choseRow == initRow - 1) & choseCol == initCol ) )
  366.      {
  367.      initRow -= 1;
  368.      }
  369.      }
  370.      else
  371.      {
  372.              initRow -= 1;
  373.      }
  374.      }
  375.     }
  376.     
  377.     //向下移
  378.     private void moveDown()
  379.     {
  380.      if ( initRow < 8 )
  381.      {
  382.      if ( clickFlag )
  383.      {
  384.      if ( (grid[initRow+1][initCol] == 0) | ((choseRow == initRow + 1) & choseCol == initCol ) )
  385.      {
  386.      initRow += 1;
  387.      }
  388.      }
  389.      else
  390.      {
  391.              initRow += 1;
  392.      }
  393.      }
  394.     }
  395.     //向左移
  396.     private void moveLeft()
  397.     {
  398.      if ( initCol > 0 )
  399.      {
  400.      if ( clickFlag )
  401.      {
  402.      if ( grid[initRow][initCol-1] == 0 | ((choseCol == initCol - 1) & choseRow == initRow ) )
  403.      {
  404.      initCol -= 1;
  405.      }
  406.      }
  407.      else
  408.      {
  409.              initCol -= 1;
  410.      }
  411.      }
  412.     }
  413.     
  414.     //向右移
  415.     private void moveRight()
  416.     {
  417.      if ( initCol < 8 )
  418.      {
  419.      if ( clickFlag )
  420.      {
  421.      if ( grid[initRow][initCol+1] == 0 | ((choseCol == initCol + 1) & choseRow == initRow ))
  422.      {
  423.      initCol += 1;
  424.      }
  425.      }
  426.      else
  427.      {
  428.              initCol += 1;
  429.      }
  430.      }
  431.     }
  432.     
  433.     //确定移动球
  434.     private void commitPosition()
  435.     {
  436.      //选择要移动的球
  437.      if ( grid[initRow][initCol] > 0 )
  438.      {
  439.      //球是否已经被选择
  440.      if ( !clickFlag )
  441.      {
  442.      //格子的位置
  443.          choseRow = initRow;
  444.          choseCol = initCol;
  445.          //球的位置
  446.          chSphere = grid[initRow][initCol];
  447.          clickFlag = true;
  448.      }
  449.      else
  450.      {
  451.      choseRow = -1;
  452.      choseCol = -1;
  453.      clickFlag = false;
  454.      }
  455.      }
  456.      //选择要移动到的位置
  457.      else
  458.      {
  459.      if ( clickFlag )
  460.      {
  461.          //球的下标
  462.          grid[initRow][initCol] = chSphere;
  463.          grid[choseRow][choseCol] = 0;
  464.          for ( int i = 0; i < position.length; i++ )
  465.          {
  466.           if ( position[i][0] == initRow && position[i][1] == initCol )
  467.           {
  468.           position[i][0] = choseRow;
  469.           position[i][1] = choseCol;
  470.           break;
  471.           }
  472.          }
  473.          clickFlag = false;
  474.          //删除球
  475.          deleteSphere();
  476.          //产生新球
  477.          createSphere(3);
  478.      }
  479.      }
  480.     }
  481.     
  482.     
  483.     private void pauseGame(Graphics g)
  484.     {
  485.      stop();
  486.      try
  487.      {
  488.      if ( pauseImage == null )
  489.      {
  490.      pauseImage = Image.createImage("/res/pausegame.png");
  491.      }
  492.      }
  493.      catch(Exception e)
  494.      {}
  495.         g.drawImage(pauseImage, 0, 0, Graphics.TOP | Graphics.LEFT);
  496.      g.drawRect(46, 72 + pauseIndex * 25, 80, 20);
  497.     }
  498.     
  499.     private void gameOver(Graphics g)
  500.     {
  501.      stop();
  502.      try
  503.      {
  504.      if ( overImage == null )
  505.      {
  506.      overImage = Image.createImage("/res/gameover.png");
  507.      }
  508.      }
  509.      catch(Exception e)
  510.      {
  511.      System.out.println(e);
  512.      }
  513.     g.drawImage(overImage, 0, 0, Graphics.TOP | Graphics.LEFT);
  514.         HighScoreRecordStore.saveHighScore(((minute>9)?"":"0") + minute + ":" + ((second>9)?"":"0") + second, score);
  515.         g.drawRect(46, 75 + overIndex * 25, 80, 20);
  516.     }
  517.     
  518.     private void drawGrid(Graphics g)
  519.     {
  520.      //显示分数
  521.        displayScore(g);
  522.        //显示时间
  523.        displayTime(g);
  524.        count = 0;
  525.        //画格子和球
  526.      for ( int i = 0; i < grid.length; i++ )
  527.      {
  528.      for ( int j = 0; j < grid[i].length; j++ )
  529.      {
  530.      //格子的坐标
  531.      gridX = j*gridWidth+spaceLeft;
  532.      gridY = i*gridHeight+spaceTop;
  533.      g.drawRect(gridX, gridY, gridWidth, gridHeight);
  534.                 //画已经选择框
  535.                 if ( j == choseCol && i == choseRow && clickFlag )
  536.                 {
  537.                  g.setColor(0xFF0000);
  538.                  g.drawRect(gridX + 2, gridY + 2, gridWidth-4, gridHeight - 4);
  539.                  g.setColor(0x000000);
  540.                 }
  541.     
  542.      //画选择框
  543.                 if ( j == initCol && i == initRow )
  544.                 {
  545.                  g.setColor(0x0055bb);
  546.                  g.drawRect(gridX + 1, gridY + 1, gridWidth-2, gridHeight - 2);
  547.                  g.setColor(0x000000);
  548.                 }
  549.                 //画球
  550.                 if ( grid[i][j] > 0 )
  551.                 {
  552.              g.drawImage(img[grid[i][j] - 1], gridX + (gridWidth - 8) /2 , gridY + (gridHeight - 8) /2, Graphics.TOP | Graphics.LEFT);
  553.              count++;
  554.                 }
  555.      }
  556.      }
  557.      if ( !deleting )
  558.      {
  559.          total = count;
  560.      }
  561.      g.drawString("球数:" + String.valueOf(total), spaceLeft + 62, spaceTop - 15,Graphics.TOP | Graphics.LEFT);
  562.     }
  563.     /**
  564.      * 显示分数
  565.      * */
  566.     private void displayScore(Graphics g)
  567.     {
  568.      g.drawString("分数:" + score, spaceLeft, spaceTop - 15, Graphics.TOP | Graphics.LEFT);
  569.     }
  570.     
  571.     /**
  572.      * 显示时间
  573.      * */
  574.     private void displayTime(Graphics g)
  575.     {
  576.      g.drawString("时间:" + ((minute>9)?"":"0") + minute + ":" + ((second>9)?"":"0") + second, scrWidth - spaceLeft - 53, spaceTop - 15, Graphics.TOP | Graphics.LEFT);
  577.     }
  578.     
  579.     /**
  580.      * 产生新球
  581.      * */
  582.     private void createSphere(int mach)
  583.     {
  584.      if ( deleting )
  585.      {
  586.      return;
  587.      }
  588.      //产生新球
  589.         for ( int i = 0; i < mach; i++ )
  590.         {
  591.          if ( sphereTotal > 80 )
  592.          {
  593.          gameFlag = 2;
  594.              break;
  595.          }
  596.          if ( sphereTotal < 81 )
  597.          {
  598.              if ( (81 - sphereTotal)/2 > 0 )
  599.              {
  600.              newPos = random.nextInt()%((81 - sphereTotal)/2) + (81 - sphereTotal)/2+1;
  601.              }
  602.              else
  603.              {
  604.                  newPos = random.nextInt()%((81 - sphereTotal)/2+1) + (81 - sphereTotal)/2;
  605.                  if ( newPos == 0 )
  606.                  {
  607.                   newPos = 1;
  608.                  }
  609.              }
  610.          }
  611.          posRow = 80-sphereTotal;
  612.             grid[position[newPos-1][0]][position[newPos-1][1]] = random.nextInt()%ColorLinezMIDlet.gameGrade + ColorLinezMIDlet.gameGrade;
  613.             position[newPos-1][0] = position[posRow][0];
  614.             position[newPos-1][1] = position[posRow][1];
  615.             position[posRow][0] = 0;
  616.             position[posRow][1] = 0;
  617.             sphereTotal++;
  618.          if ( sphereTotal > 80 )
  619.          {
  620.          gameFlag = 2;
  621.              break;
  622.          }
  623.         }
  624.     }
  625.     
  626.     /**
  627.      * 删除球
  628.      * */
  629.     public void deleteSphere()
  630.     {
  631.      for ( int i = 0; i < grid.length; i++ )
  632.      {
  633.      for ( int n = 0; n < 6; n++ )
  634.      {
  635.      same[n] = 1;
  636.      rows[n] = -1;
  637.      cols[n] = -1;
  638.          isUper[n] = false;
  639.      }
  640.     
  641.             for ( int j = 0; j < grid[i].length; j ++ )
  642.             {
  643.                 //横行上出现大于或等于5个颜色相同并且连续的小球
  644.      if ( (grid[i][j] > 0) && (j < 8) )
  645.      {
  646.      if ( (grid[i][j] == grid[i][j+1]) & !isUper[0] )
  647.      {
  648.      same[0]++;
  649.      rows[0] = i;
  650.      cols[0] = j+1;
  651.      }
  652.      else if ( same[0] < delNum )
  653.      {
  654.      same[0] = 1;
  655.      }
  656.      else if ( same[0] > delNum - 1 )
  657.      {
  658.      isUper[0] = true;
  659.      }
  660.      }
  661.          //竖列出现大于或等于5个颜色相同并且连续的小球
  662.      if ( (grid[j][i] > 0) && (j < 8) )
  663.      {
  664.          if ( (grid[j][i] == grid[j+1][i]) & !isUper[1] )
  665.          {
  666.          same[1]++;
  667.          rows[1] = j+1;
  668.          cols[1] = i;
  669.          }
  670.          else if ( same[1] < delNum )
  671.          {
  672.          same[1] = 1;
  673.          }
  674.      else if ( same[1] > delNum - 1 )
  675.      {
  676.      isUper[1] = true;
  677.      }
  678.          }
  679.             }
  680. for ( int j = 0, n = i; j < i; j++, n-- )
  681.      {
  682.      //左斜1
  683.      if ( grid[n][j] > 0 & (grid[n][j] == grid[n-1][j+1]) & !isUper[2] )
  684.      {
  685.      same[2]++;
  686.      cols[2] = j + 1;
  687.      rows[2] = n - 1;
  688.      }
  689.      else if ( same[2] < delNum )
  690.      {
  691.      same[2] = 1;
  692.      }
  693. else if ( same[2] > delNum - 1 )
  694. {
  695. isUper[2] = true;
  696. }
  697.     
  698.      //左斜2
  699.      if ( (grid[8-j][8-n] > 0) & (grid[8-j][8-n] == grid[8-j-1][8-n+1]) & !isUper[3] )
  700.      {
  701.      same[3]++;
  702.      cols[3] = 8 - n + 1;
  703.      rows[3] = 8 - j - 1;
  704.      }
  705.      else if ( same[3] < delNum )
  706.      {
  707.      same[3] = 1;
  708.      }
  709. else if ( same[3] > delNum - 1 )
  710. {
  711. isUper[3] = true;
  712. }
  713.     
  714.      //右斜1
  715.      if ( (grid[j][8-n] > 0) & (grid[j][8-n] == grid[j+1][8-n+1]) & !isUper[4] )
  716.      {
  717.      same[4]++;
  718.      cols[4] = 8 - n + 1;
  719.      rows[4] = j + 1;
  720.      }
  721.      else if ( same[4] < delNum )
  722.      {
  723.      same[4] = 1;
  724.      }
  725. else if ( same[4] > delNum - 1 )
  726. {
  727. isUper[4] = true;
  728. }
  729.     
  730.      //右斜2
  731.      if ( (grid[8-n][j] > 0) & (grid[8-n][j] == grid[8-n+1][j+1]) & !isUper[5] )
  732.      {
  733.      same[5]++;
  734.      cols[5] = j + 1;
  735.      rows[5] = 8 - n + 1;
  736.      }
  737.      else if ( same[5] < delNum )
  738.      {
  739.      same[5] = 1;
  740.      }
  741. else if ( same[5] > delNum - 1 )
  742. {
  743. isUper[5] = true;
  744. }
  745.      }
  746.             
  747.             for ( int n = 0; n < 6; n++ )
  748.             {
  749.                 //启动球消失的线程
  750.          if ( same[n] > (delNum - 1) && !deleting )
  751.          {
  752.          DeleteTimerTask delTask = new DeleteTimerTask( rows[n], cols[n], same[n], delDir[n]);
  753.          timer.schedule( delTask, 100, 500);
  754.          deleting = true;
  755.          score += same[n];
  756.          break;
  757.          }
  758.             }
  759.      }
  760.     }
  761.     
  762.     /**
  763.      * 播放声音
  764.      */
  765.     public void playSound()
  766.     {
  767.         try
  768.         {
  769.             Manager.playTone(80, 200, 60);
  770.         }catch(Exception e){}
  771.     }
  772.     
  773.     public class TimeTimerTask extends TimerTask
  774.     {
  775.      public void run()
  776.      {
  777.         second++;
  778.         //如果秒数大于59分钟数加1
  779.         if( second > 59 )
  780.         {
  781.      minute++;
  782.      second = 0;
  783.      }
  784.      displayTime(offG);
  785.      //重新画时间
  786.      repaint(scrWidth - spaceLeft - 53, spaceTop - 15, 66, 12);
  787.      System.gc();
  788.      }
  789.     }
  790.     
  791.     public class DeleteTimerTask extends TimerTask
  792.     {
  793.      private int delCol = 0;
  794.      private int delRow = 0;
  795.      private int delTotal = 0;
  796.      private int oper = 0;
  797.      private int color = 0;
  798.     
  799.      private int tempCol = 0;
  800.      private int tempRow = 0;
  801.      private int tempCount = 0;
  802.      private int tempColor = 0;
  803.      public DeleteTimerTask( int row, int col, int total, int oper)
  804.      {
  805.      this.delCol = col;
  806.      this.delRow = row;
  807.      this.delTotal = total;
  808.      this.oper = oper;
  809.      this.color = grid[row][col];
  810.      }
  811.     
  812.      public void run()
  813.      {
  814.      tempCol = delCol;
  815.      tempRow = delRow;
  816.      tempCount = delTotal;
  817.      tempColor = color;
  818.      if ( grid[delRow][delCol] > 0 )
  819.      {
  820.      tempColor = 0;
  821.      }
  822. while ( tempCount > 0 )
  823. {
  824. grid[tempRow][tempCol] = tempColor;
  825.                 
  826. if ( disCount == 0 )
  827. {
  828. posRow = 80 - sphereTotal + 1;
  829. position[posRow][0] = tempRow;
  830. position[posRow][1] = tempCol;
  831. sphereTotal--;
  832. }
  833. switch ( oper )
  834. {
  835.      //横
  836. case 0: tempCol--; break;
  837. //竖
  838. case 1: tempRow--; break;
  839.      //左斜
  840. case 2: 
  841.          tempCol--;
  842.          tempRow++;
  843.          break;
  844.      //右斜
  845. case 3:
  846. tempCol--;
  847.          tempRow--;
  848. }
  849. tempCount--;
  850. }
  851.             repaint();
  852.             if ( disCount++ > 3 )
  853.             {
  854.              disCount = 0;
  855.              deleting = false;
  856.              createSphere(3);
  857.              repaint();
  858.              this.cancel();
  859.             }
  860.      }
  861.     }
  862. }