Random函数的一点小问题 你这里是执行了11次run()方法,跟random()方法没有什么关系吧!你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就能够地方调用了 多余地方的全删了... 每次产生的随机数都是大于一个,跟想象的完全不一样...代码全贴出来帮你看看? 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(); } }不是很规范... 见笑了 找到问题了:你在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后面都加一个空语句; 谢谢姐姐的解答及提醒 ,已改正我不是妹子!哦,忘了说了,照你现在的代码initialize()方法只需在Map类的构造函数中调用一次就可以了,不用注释和移动jf.addKeyListener(new operate());这句代码了,直接把其它地方的initialize()注释掉也可以 java 按月份生成文件 jsp验证码 SQL Server 中字段设计中带 [ ] ,java程序中这样取这个字段中的值 商业业务逻辑开发之自动化 请教,如何在程序中导入非java原带的包 java能写操作系统吗 请各位高手们帮忙解决一下,图标的问题。 怎样在textarea或者jtextarea的里面添加图片,即image成员? 新手:在jbuilder7.0下怎样编译hello world!谢谢!急! 我想问一下斑竹,为什么我的信誉分降低了??? 问题出在哪里 。菜鸟求拯救! 代码没出错运行不了高手帮忙看
就能够地方调用了 多余地方的全删了... 每次产生的随机数都是大于一个,跟想象的完全不一样...
代码全贴出来帮你看看?
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();
}
}不是很规范... 见笑了
你可以将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后面都加一个空语句;
我不是妹子!
哦,忘了说了,照你现在的代码initialize()方法只需在Map类的构造函数中调用一次就可以了,不用注释和移动jf.addKeyListener(new operate());这句代码了,直接把其它地方的initialize()注释掉也可以