J2ME를 이용해서 넷빈으로 짠 테트리스 코딩입니다.
클래스는 3개 이고 스페이스 기능을 추가하려하는데 잘안되네요.
도와주세요
밑ㅇㅔ 있습니다.
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.Random;
class TetrisTask extends Thread {
 int mode;
 final int MODE_NORMAL = 1;
 final int MODE_GAMEOVER = 2;
 final int MODE_START = 3;
 final int CELL_WIDTH = 10;
 final int CELL_HEIGHT = 15; 
    final int ROTATE_0X0 = 0;
 final int ROTATE_3X3 = 1;
 final int ROTATE_4X4 = 2;
final int NOBLOCK = 9;
    final int COLOR_INIT = 0;
 final int COLOR_BLACK = 7;
 final int COLOR_R = 0, COLOR_G = 1, COLOR_B = 2;
 Random random = new Random();
 GameCanvas canvas; //Canvas
 int blockNumber;            //현재 블럭일번
 int nextBlock;              //다음 블럭번호
    final int TOTAL_BLOCK = 7;  //전체 블럭개수
 int backBoard[][] = new int[CELL_WIDTH][CELL_HEIGHT];    //전체 블럭 보드
 int blockDataBase[][][] = new int[TOTAL_BLOCK][4][4];    //전체 블럭 테이블
 int blockRotateType[] = new int[TOTAL_BLOCK];            //Rotate_Type
 int mbx;                //움직이는 block의 x 좌표
 int mby;                //움직이는 block의 y 좌표
 int movingBlockRotateType;
 int movingBlock[][] = new int[4][4];
 Image overImage;
 Image numberImage[] = new Image[10];
 Image scoreImage;
 Image nextImage;
 int score = 0;
 int speed = 1;
    
 int colorTable[][] = {
  { 200, 255, 120 },  
  { 255,   0, 120 },
  { 255, 255, 120 },
  {   0, 120, 255 },
  {   0, 255, 120 },
  { 120, 120,   0 },
  { 120, 255, 255 }, 
  {   0,   0,   0 }
    };
 
    public TetrisTask(GameCanvas canvas) {
        this.canvas = canvas;
        try {
            overImage = Image.createImage("/go.png"); // Game Over 이미지
            scoreImage = Image.createImage("/gs.png"); // Game Score 이미지
            for (int i=0; i<10; i++) {
                numberImage[i] = Image.createImage("/" + i + ".png");
            }
            nextImage = Image.createImage("/gn.png"); // Next 블럭 이미지
        } catch(IOException ioe) {
            System.out.println("FILE IO ERROR: " + ioe);
        }
        int blockPattern0[][] = {
            { 9, 9, 9, 9 },
            { 9, 9, 9, 9 },
            { 0, 0, 0, 0 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern0, ROTATE_4X4);
        int blockPattern1[][] = {
            { 9, 9, 9, 9 },
            { 1, 9, 9, 9 },
            { 1, 1, 1, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern1, ROTATE_3X3);
        int blockPattern2[][] =  {
            { 9, 9, 9, 9 },
            { 9, 9, 2, 9 },
            { 2, 2, 2, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern2, ROTATE_3X3);
        int blockPattern3[][] =  {
            { 9, 9, 9, 9 },
            { 3, 3, 9, 9 },
            { 9, 3, 3, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern3, ROTATE_3X3);
        int blockPattern4[][] =  {
            { 9, 9, 9, 9 },
            { 9, 4, 4, 9 },
            { 4, 4, 9, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern4, ROTATE_3X3);
        int blockPattern5[][] =  {
            { 9, 9, 9, 9 },
            { 9, 5, 5, 9 },
            { 9, 5, 5, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern5, ROTATE_0X0);
        int blockPattern6[][] =  {
            { 9, 9, 9, 9 },
            { 9, 6, 9, 9 },
            { 6, 6, 6, 9 },
            { 9, 9, 9, 9 }
        };
        addPattern(blockPattern6, ROTATE_3X3);
nextBlock = (int)(Math.abs(random.nextInt()) % blockNumber);
        updateMovingBlock();
        mode = MODE_START;
        for(int i=0; i<CELL_WIDTH; i++) {
            for(int ii=0; ii<CELL_HEIGHT; ii++) {
                backBoard[i][ii] = COLOR_INIT;
            }
        }
    }
 protected void paint(Graphics g) { 
  try {
            sleep(100);
  } catch(Exception e) { }
  
  g.setColor(0, 0, 0);
  g.fillRect(0, 0,canvas.getWidth(),canvas.getHeight()); 
  
  try {
            for(int i=0; i<CELL_WIDTH; i++) {
                for(int ii=0; ii<CELL_HEIGHT; ii++) {
                    if(backBoard[i][ii] != NOBLOCK)
                        drawCell(g, backBoard[i][ii], i * 6 + 1, ii * 6 + 10, 5, 5);
                    else
                        drawCell(g, COLOR_BLACK, i * 6 + 1, ii * 6 + 10, 5, 5);
    }
   }
  } catch(Exception e) {}
  g.setColor(255, 255, 0);
  g.drawLine(61, 10, 61, 100);
  drawScore(g);  
  drawNextBlock(g);  
  drawMovingBlock(g);
  if(mode == MODE_GAMEOVER) { 
            g.drawImage(overImage,canvas.getWidth()/4,5+canvas.getHeight()/4,
   g.HCENTER | g.VCENTER);
  }
 }
protected void keyHandler(int action) {
        switch(action) {
            case Canvas.RIGHT: // right key
                if (mode != MODE_NORMAL) return;
                mbx++;
                if(!moveOK()) mbx--;
                canvas.repaint();
                break;
            case Canvas.LEFT: // left key
                if(mode != MODE_NORMAL) return;
                mbx--;
                if(!moveOK()) mbx++;
                canvas.repaint();
                break;
            case Canvas.DOWN: // down key
                if(mode == MODE_NORMAL)
                    normalProc();
                break;
           
            case Canvas.UP:
            case Canvas.FIRE:
/여기에 코딩을 추가해서 스페이스키를 코딩해야 하는데요 도와주세요
                         switch(mode) {
                    case MODE_NORMAL:
                        int tempBlock[][] = new int[4][4];
                        for(int i=0; i<4; i++) {
                            for(int ii=0; ii<4; ii++) {
                                tempBlock[i][ii] = movingBlock[i][ii];
                            }
                        }
                        int w;
                        if(movingBlockRotateType == ROTATE_3X3) {
                            w = movingBlock[2][0];
                            movingBlock[2][0] = movingBlock[2][2];
                            movingBlock[2][2] = movingBlock[0][2];
                            movingBlock[0][2] = movingBlock[0][0];
                            movingBlock[0][0] = w;
                            w = movingBlock[1][0];
                            movingBlock[1][0] = movingBlock[2][1];
                            movingBlock[2][1] = movingBlock[1][2];
                            movingBlock[1][2] = movingBlock[0][1];
                            movingBlock[0][1] = w;
                        }
                        if(movingBlockRotateType == ROTATE_4X4) {
                            w = movingBlock[2][0];
                            movingBlock[2][0] = movingBlock[0][2];
                            movingBlock[2][1] = movingBlock[0][2];
                            movingBlock[2][3] = movingBlock[0][2];
                            movingBlock[0][2] = w;
                            movingBlock[1][2] = w;
                            movingBlock[3][2] = w;
                        }
                        if(!moveOK()) {
                            for(int i=0; i<4; i++) {
                               for(int ii=0; ii<4; ii++) {
                                    movingBlock[i][ii]=tempBlock[i][ii];
                                }
                            }
                        } else {
                            canvas.repaint();
                        }
                        break;
                    case MODE_GAMEOVER:
                        mode = MODE_START;
                        score = 0;
                        break;
                } // endswitch(Fire mode)
            break;
        } // end-switch(action)
}
 void drawCell(Graphics g,int cindex,int x,int y,int sx,int sy) {
        g.setColor(colorTable[cindex][COLOR_R],colorTable[cindex][COLOR_G],
                colorTable[cindex][COLOR_B]);
  g.fillRect(x, y, sx, sy);
 }
 void drawScore(Graphics g) {
  int n, s = 0;
        g.drawImage(scoreImage, 65, 52, g.LEFT | g.TOP);
        System.out.println("score:"+score);
        for(int i=4, j=0; i>=0; i--, j++) {
            int p = 0;
            p = pow(10,i);
            if (i < 1) p = 1;
            System.out.print("i:"+i+" p:"+p);
            n = (int)((score - s) / p);
            s += (n * p);
            System.out.println(", n:"+n+" s:"+s);
            g.drawImage(numberImage[n], 68 + (5 * j), 70, g.LEFT | g.TOP);
        }
 }
    int pow(int v, int n) {
      //System.out.println("v:"+v+" n:"+n);
  n--;
      //System.out.println("v:"+v+" n:"+n);
  if (n < 1) return v;
        return v * pow(v, n);
    }
 void drawNextBlock(Graphics g) {
  g.drawImage(nextImage, 65, 10, g.LEFT | g.TOP);
  for(int i=0; i<4; i++) {
            for(int ii=0; ii<4; ii++) {
                if(blockDataBase[nextBlock][i][ii] != NOBLOCK)
                    drawCell(g, blockDataBase[nextBlock][i][ii],
                        (i * 6) + 67, (ii * 6) + 25, 5, 5);
            }
        }
   }
    void drawMovingBlock(Graphics g) {
  for(int i=0; i<4; i++) {
            for(int ii=0; ii<4; ii++) {
                if(movingBlock[i][ii] != NOBLOCK) {
                    drawCell(g, movingBlock[i][ii], (i+mbx)*6 + 1,
                        (ii+mby)*6 + 10, 5, 5);
                }
            }
        }
  }
    public void run() {
        try {
            while(true) {
                switch(mode) {
                    case MODE_START:
                        startProc();
                        break;
                    case MODE_NORMAL:
                        normalProc();
                        break;
                    case MODE_GAMEOVER:
                        break;
                }
                Thread.sleep((int)(1000 / speed));
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
 }
    public void addPattern(int ptrn[][], int rflag) {
  if(blockNumber >= TOTAL_BLOCK) return;
  for(int i=0; i<4; i++) {
            for(int ii=0; ii<4; ii++) {
                blockDataBase[blockNumber][i][ii] = ptrn[i][ii];
            }
  }
  blockRotateType[blockNumber] = rflag;
  blockNumber++;
 }
 
 void updateMovingBlock() {
        //System.out.println(nextBlock);
        for(int i=0; i<4; i++) {
            for(int ii=0; ii<4; ii++) {
                movingBlock[i][ii] = blockDataBase[nextBlock][i][ii];
                movingBlockRotateType = blockRotateType[nextBlock];
            }
        }
        mbx = 4;
        mby = 0;
        nextBlock = (int)(Math.abs(random.nextInt()) % blockNumber);
 }
 
 boolean moveOK() {
        try {
            for(int i=0; i<4; i++) {
                for(int ii=0; ii<4; ii++) {
                    if(movingBlock[i][ii] != NOBLOCK) {
                        if((i+mbx < 0) || (i+mbx >= CELL_WIDTH)
                            || (ii+mby < 0)|| (ii+mby >= CELL_HEIGHT)) {
                            return false;
                        }
                        if(backBoard[i+mbx][ii+mby] != NOBLOCK) {
                            return false;
                        }
                    }
                }
            }
        } catch(Exception e) {
            System.out.println("Exception in moveOK");
        }
        return true;
    }
 void startProc() {
  for(int i=0; i<CELL_WIDTH; i++) {
            for(int ii=0; ii<CELL_HEIGHT; ii++) {
                backBoard[i][ii] = NOBLOCK;
            }
        }
        mode = MODE_NORMAL;
        canvas.repaint();
 }
    void normalProc() {
        mby++;
  if(!moveOK()) { 
   mby--;
   freezeMovingBlock();
   canvas.repaint();
  }
        canvas.repaint();
  formALine();
        int w = (int)((score % 5000) / 1000);
  w++;
  speed = w;
    }
    void freezeMovingBlock() {
        
        for(int i=0; i<4; i++) {
            for(int ii=0; ii<4; ii++) {
                if(movingBlock[i][ii] != NOBLOCK) {
                    backBoard[i+mbx][ii+mby] = movingBlock[i][ii];
                }
             }
        }
        updateMovingBlock();
        canvas.repaint();  
        if(!moveOK()) mode = MODE_GAMEOVER;
 }
void formALine() {
  boolean flg;
  int lscore = 0;
  for(int i=(CELL_HEIGHT-1); i>=0; i--) {
            flg = true;
            //한 라인이 블럭으로 모두 채워지면
            for(int ii=0; ii<CELL_WIDTH; ii++) {
                if(backBoard[ii][i] == NOBLOCK)
                    flg = false;
            }
            //위의 라인들을 채워진 라인의 위치로 옮긴다.
            if(flg) {
                for(int y=i; y>=1; y--) {
                    for(int x=0; x<CELL_WIDTH; x++) {
                        backBoard[x][y] = backBoard[x][y-1];
                    }
                }
                //채워진 라인의 제거로 인해 남은라인들의  y좌표 수정
                i++;
                lscore++;
                canvas.repaint();
                try {
                    sleep(100);
                } catch(InterruptedException ie) { }
            }
        }
        switch(lscore) { //line 365 : 점수를 올린다.
            case 1:
                score += 123;
   break;
            case 2:
                score += 234;
   break;
            case 3:
                score += 567;
   break;
            case 4:
                score += 1234;
   break;
        }
        if(lscore > 0) {
            canvas.repaint();
            try {
                sleep(100);
            } catch(InterruptedException ie) { }
        }
 }
}



(지금 소스상으로는 UP 기능과 동일하게 구현되어 있어서요..
구현할수 있는 방법은 여러가지인데, 그중 가장 한가지 방법은
case SPACE:
for(i=0;i<30;i++) { // normalProc() 함수를 조금 수정해서 사용하면 됩니다.
// 30이라는 숫자는 Y 의 블럭수입니다.
mby++;
if(!moveOK()) {
mby--;
freezeMovingBlock();
canvas.repaint();
formALine(); // 이거는 안해줘도 될거 같은데. 무슨함수인지 몰라서...
break;
}
canvas.repaint();
formALine();
}
그냥 이정도면 될거 같은데요...필요한 부분은 직접 수정해 보세요 .~~