你这里是执行了11次run()方法,跟random()方法没有什么关系吧!
你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题

解决方案 »

  1.   


    就能够地方调用了 多余地方的全删了...  每次产生的随机数都是大于一个,跟想象的完全不一样...
    代码全贴出来帮你看看? 
    class Map  
    {
    int [][]  beijing = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
    Icon [][]  icons = new Icon [4][4];

    JFrame jf = new JFrame();
    JPanel jp = new JPanel();
    int a,b;


    public Map()
    {

    ran();
    chushihua();
    initialize();

    }



     void chushihua() {
    for (int i=0;i<4;i++)
    {
    for (int j=0;j<4;j++)
    {
    if (beijing[i][j]==2)
    {
    icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\2.jpg");
    }
    if (beijing[i][j]==4)
    {
    icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\4.jpg");
    }
    if (beijing[i][j]==8)
    {
    icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\8.jpg");
    }
    if (beijing[i][j]==16)
    {
    icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\16.jpg");
    }
    if(beijing[i][j]==0)
    {
    icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\0.jpg");
    }
    jp.add(new JLabel(icons[i][j]));
    }
    }
    }


     void ran()  {


      a=(int) ((Math.random()*100)%3);
      b=(int) ((Math.random()*100)%3);
    //  while ( beijing[a][b]==2)
    //  {
    // a=(int) ((Math.random()*100)%3);
    //  b=(int) ((Math.random()*100)%3);
    //  }
     beijing[a][b]=2;
     System.out.print(".a"+a + b);
     }

      

     

     void initialize()
     {
    jp.setLayout(new GridLayout(4,4));
    jf.addKeyListener(new operate()); 

    jf.add(jp);
    jf.setVisible(true);
    jf.setBounds(300, 100, 400, 400);
     }

     class operate implements KeyListener
     {
    public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode())
    {
    case  KeyEvent.VK_LEFT :  //左
    {

    for (int a=0;a<4;a++)
    {
    for (int b=0;b<4;b++)
    {

    if (beijing[a][b]==2&&b!=0)
    {
    beijing[a][b]=0;
    beijing[a][0]=2;

    }

    }

    }
    jp.removeAll();
    chushihua();

    initialize();
    }; 
    break;
    case KeyEvent.VK_DOWN://下
    {
    jp.removeAll();
    ran();
    chushihua();

    initialize();
    };
    break;
    case KeyEvent.VK_RIGHT://右
    {

    };
    break;
    case KeyEvent.VK_UP://上
    {

    };
    break;
    default:;
    break;
    }
    } public void keyReleased(KeyEvent e) {
    }

    public void keyTyped(KeyEvent e) {
    }


     }

    }public class jiemian  {
       public static void main(String[] args)  {
        new Map();
           
        
      }  
      }不是很规范...  见笑了 
      

  2.   

    找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用
    你可以将jf.addKeyListener(new operate());  放到map的构造函数中去,将 initialize()中的注释掉就好啦
    void initialize()
    {
    jp.setLayout(new GridLayout(4, 4));
    //jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序
    jf.add(jp);
    jf.setVisible(true);
    jf.setBounds(300, 100, 400, 400);
    }
    提醒一下你:为啥你switch中的每个case后面都加一个空语句;
      

  3.   

        谢谢姐姐的解答及提醒 ,已改正
    我不是妹子!

    哦,忘了说了,照你现在的代码initialize()方法只需在Map类的构造函数中调用一次就可以了,不用注释和移动jf.addKeyListener(new operate());这句代码了,直接把其它地方的initialize()注释掉也可以