import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameFrame extends JFrame implements KeyListener {
private final int DEFAULT_WIDTH=500;
private final int DEFAULT_HEIGHT=700;
Random ran=new Random();
//方块形状
private int Fstate=ran.nextInt(7);
//方块状态
private int Sstate=ran.nextInt(4);
private int X=130;
private int left=130;
private int top=0;
private int[][][] shapes;
private int[]s;
private int[][]sh;
Shapes shape=new Shapes();
private JButton btnStart ,btnPause;
private boolean flag=false;
private GamePanel panel;
private int[][]map=new int[60][30];
private int tx=13;
private int ty=3;
public GameFrame()
{

shapes=shape.getShapes();
s=shapes[Fstate][Sstate];
sh=getS(s);
panel=new GamePanel();
panel.setLayout(null);
setTitle("Tetris game");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
btnStart=new JButton("开始游戏");

btnStart.addKeyListener(new KeyAdapter()
 {
 @Override
 public void keyPressed(KeyEvent e) {
 if(e.getKeyCode()==KeyEvent.VK_ENTER)
 {
 flag=true;
   btnStart.requestFocus(false);
   panel.requestFocus();
 }
 
 }
 });
btnStart.addActionListener(new ActionListener()
{
   @Override
   public void actionPerformed(ActionEvent arg0) {
   flag=true;
   btnStart.requestFocus(false);
   panel.requestFocus();
}
});
btnStart.setBounds(350, 350, 100, 30);

btnPause=new JButton("暂停");
    btnPause.addActionListener(new ActionListener()
    {
     @Override
public void actionPerformed(ActionEvent arg0) {
flag=false;
panel.requestFocus();
}
});
    btnPause.setBounds(350, 400, 100, 30);
    panel.add(btnPause);
this.setLocationRelativeTo(null);
this.add(panel); this.addKeyListener(this);
panel.addKeyListener(GameFrame.this);
GameThread gth=new GameThread();
Thread th=new Thread(gth);
th.start(); panel.add(btnStart);
}
public int[][]  getS(int[]a)
{ int[][]sa=new int[4][4];
int n=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
sa[i][j]=a[n];
n++;
}

}

return sa;
}
private class GamePanel extends JPanel
{
    public void paintComponent(Graphics g)
    {
     Graphics2D g2d=(Graphics2D)g;
     g2d.setColor(Color.black);
     g2d.fill3DRect(20, 20, 300, 600, true);
     g2d.drawRect(350, 40, 80, 80);
    
     for(int j=0;j<sh.length;j++)
     {
     for(int i=0;i<sh.length;i++)
     {
          if(sh[j][i]==1)
     {
       
     g2d.setColor(Color.RED);
     g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true);      }      }
     }
     for(int i=0;i<60;i++)
     {
     for(int j=0;j<30;j++)
     {
     if(map[i][j]==1)
     {
     g2d.setColor(Color.RED);
     g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true);
     }
    
    
     }
     }
    
    }
}
//判断是否出界
public int isOut(int x,int y)
{
int[] aa=shapes[x][y];
int[][]b=getS(aa);
for(int j=0;j<b.length;j++)
{
     for(int i=0;i<b.length;i++)
     {
          if(b[j][i]==1)
     {    
                 if((left+20+10*i)<20||(left+30+10*i)>300)
                 {
                  return 1;
                 }
                 if(top>620)
                 {
                  return 2;
                 }
    
     }     }
}
return 0;
}
//向左移动方法
public void left()
{
left-=10;
tx-=1;
if(isOut(Fstate,Sstate)==1)
{
left+=10;
tx+=1;
}
}
//向右移动方法
public void right()
{
left+=10;
tx+=1;
if(isOut(Fstate,Sstate)==1)
{
left-=10;
tx-=1;
}
}
public void setmap()
{

}
//向下移动方法
public void down()
{
top+=10;
int y=ty+1;
int x=tx;
    for(int i=0;i<4;i++)
    {
     for(int j=0;j<4;j++)
     {
     if(sh[i][j]==1&&top+i*10==590)
     {
     for(int m=i;m>=0;m--)
     {
     for(int n=j;n>=0;n--)
     {
    
     System.out.println(ty);
     System.out.println(tx);
     if(sh[i][j]==1)
     {
     map[ty][tx+m-1]=1;
     }
    
     }
     ty--;
     }
     }
     }
    }
    ty=y;
    tx=x;
    for(int i=3;i>=0;i--)
    {
     for(int j=3;j>=0;j--)
     {
     System.out.println(ty);
     if(sh[i][j]==1&&map[ty][tx+j-1]==1)
     {
     for(int m=i;m>=0;m--)
     {
     for(int n=j;n>=0;n--)
     {
     if(sh[i][j]==1)
     {
     map[ty][tx+m-1]=1;
     }
    
     }
     ty--;
     }
     }
     }
     ty--;
    }
    ty=y;        
       
    
   
}
class GameThread implements Runnable
{ @Override
public void run() {

while(true)
{

shapes=shape.getShapes();
s=shapes[Fstate][Sstate]; sh=getS(s);


if(flag)

{

      down();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {

e.printStackTrace();
}
repaint();
}
}

}
public static void main(String[] args) {
GameFrame frame=new GameFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);

 }@Override
public void keyPressed(KeyEvent e) {

if(e.getKeyCode()==KeyEvent.VK_UP)
{

//改变图形状态
if(Sstate<3)
{

 Sstate++;

}
else
{

Sstate=0;

} }
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
top+=20;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
right();
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
left();
}
}
@Override
public void keyReleased(KeyEvent arg0) {}
@Override
public void keyTyped(KeyEvent arg0) {}
   
}
我相信鉴于代码的凌乱程度,能看懂就是个奇迹。但更我相信,在这个世界是不乏创造奇迹的人的,所以我就把这些代码放到了这里 来等待一个奇迹。我知道,也许我该推到,重做的,但我总觉得半途而废总是不好的,而且我相信成功的道路不止一条,就算为走了很多弯路,起码还可以让我知道,哦 原来还可以这样。
我想完成一个俄罗斯方块游戏 现在为就想实现把落下的方块存放到map中 也就是整个游戏区,但是怎么也弄不出来,在向下的方法中总是提示数组越界。
下面是为图形类
import java.util.Random;
public class Shapes {
int[]a=new int[3];
// private int allshaps[][][];
   Random ran=new Random();
private int Fstate=ran.nextInt(7);
private int Sstate=ran.nextInt(4);
public int [][][] getShapes()
{

int[][] map = new int[30][60];
int allshaps[][][]=new int[][][]{
            // i
            { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
                    { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
            // s
            { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
            // z
            { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
            // j
            { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                    { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
            // o
            { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
            // l
            { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                    { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
            // t
            { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                    { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                    { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
            
return allshaps;


}
// public void drawShaps(int f,int s)
// {
//
// }}

解决方案 »

  1.   

    我相信鉴于代码的凌乱程度,能看懂就是个奇迹。但更我相信,在这个世界是不乏创造奇迹的人的,所以我就把这些代码放到了这里 来等待一个奇迹。我知道,也许我该推到,重做的,但我总觉得半途而废总是不好的,而且我相信成功的道路不止一条,就算为走了很多弯路,起码还可以让我知道,哦 原来还可以这样。
    我想完成一个俄罗斯方块游戏 现在为就想实现把落下的方块存放到map中 也就是整个游戏区,但是怎么也弄不出来,在向下的方法中总是提示数组越界。
      

  2.   

    写代码也是一种艺术,我们真在无限接近ing......
      

  3.   

    没写过java的 只写过C#和jsp的  你的代码好乱  没有耐心看
      

  4.   

    写的还行 放在编译工具里还不算乱 最起码比public class GameFrame extends JFrame implements KeyListener {
         // 待开发
    }好很多