[求助]求高手帮忙Debug_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
5
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2251 | 回复: 4   主题: [求助]求高手帮忙Debug        下一篇 
月亮圆儿
注册用户
等级:列兵
经验:87
发帖:1
精华:0
注册:2015-10-23
状态:离线
发送短消息息给月亮圆儿 加好友    发送短消息息给月亮圆儿 发消息
发表于: IP:您无权察看 2015-10-23 12:37:44 | [全部帖] [楼主帖] 楼主

这次写了一个拼图的程式(旁边有练习Thread用的小汽车),但是一直没有显示视窗出来。

在放入System.out.println("test"); 的方式后,

有找到问题出在生产不重复乱数的方法内,

但想了很久还是不知道如何解决,

所以只好拜托各位帮我看看了!

(乱数方法在82)

import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
 
class CMoveCar implements Runnable{
  private JLabel car;
  private int car_x=0, car_y, time, wide;
  
  public CMoveCar(JLabel c,int y, int t, int w){
    car = c;
    car_y = y;
    time = t;
    wide = w;
  }
 
  public void run(){
    car.setLocation(car_x, car_y);
    while(true){
      System.out.println("test");
      car_x += 2;
      car.setLocation(car_x, car_y);
      Pause(time);
      if(car_x >= wide){
        car_x = 0;
        car.setLocation(0, car_y);
      }
    }
  }
  private void Pause(int t){
    try{
      Thread.sleep(t);
    }
    catch(InterruptedException o){}
  }  
}
 
class Cpuzzle extends JFrame{
  //乱数用
  int minx = 0, max = 8;
  int[] num = new int[9];
  //其余物件
  int k = 0;
  JLabel[] picPuzzle = new JLabel[9];
  JLabel picCar = new JLabel(new ImageIcon("car.png"));
  JLabel success = new JLabel("成功!");
  ImageIcon[] pic = new ImageIcon[9];
  int pressT=0, press1 = -1, press2 = -1;
  CPuzzMAdapter listener = new CPuzzMAdapter();
   
  Cpuzzle(){
    randomOut(minx, max, num);  //生成乱数存于阵列
    //载入图片
    for(int i = 0; i<pic.length; i++){
      pic[i] = new ImageIcon(i+".jpg");
    }
    //载入拼图
    for(int i = 0; i<3; i++){
      for(int j = 0; j<3; j++){
        picPuzzle[k] = new JLabel(pic[num[k]]);
        picPuzzle[k].setBounds(100+100*j,100+100*i,100,100);
        add(picPuzzle[k]);
        picPuzzle[k].addMouseListener(listener);
        k++;
      }
    }
    picCar.setSize(100,50);
    add(picCar);
    Thread car = new Thread(new CMoveCar(picCar, 400, 100, 500));
    car.start();
 
    success.setBounds(200,400,100,50);
 
    setTitle("拼图游戏");
    setLayout(null);
    setBounds(100,100,500,500);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
 
  public void randomOut(int minx, int max, int[] data){
    Random ran = new Random(); 
    boolean pass;
    int num;
      for(int i = 0; i<data.length; i++){
      while(true){
        pass = true;
        num = ran.nextInt(max)+minx;
        for(int j = 0; j<data.length; j++){
          if(data[j] == num){
            pass = false;
            break;
          }
        }
        if(pass){
          data[i] = num;
          break;
        }
      }
    }
  }
 
  //事件处理
  class CPuzzMAdapter extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
      for(int i = 0; i<picPuzzle.length; i++){
        if(picPuzzle[i] == e.getSource()){
          pressT++;
          if(pressT == 1) press1 = i;
          if(pressT == 2) press2 = i;
        }
      }
      if(press1 != -1&& press2 != -1){  //当两个位置都被指定时
        //乱数阵列位置互换
        int temp = num[press1];
        num[press1] = num[press2];
        num[press2] = temp;
        picPuzzle[press1].setIcon(pic[num[press1]]);
        picPuzzle[press2].setIcon(pic[num[press2]]);
        pressT = 0;
        press1 = -1;
        press2 = -1;
      }
      //从乱数阵列的排序来看是否完成
      boolean pas = true;
      for(int i = 0; i<9; i++){
        pas = true;
        if(num[i] != i){
          pas = false;
          break;
        }
      }
      if(pas){
        add(success);
      }
    }
  }
}
 
public class Puzzle{
  public static void main(String[]args){
    Cpuzzle frm = new Cpuzzle();
  }
}





赞(0)    操作        顶端 
可爱的龙八
注册用户
等级:中尉
经验:466
发帖:10
精华:2
注册:2015-10-9
状态:离线
发送短消息息给可爱的龙八 加好友    发送短消息息给可爱的龙八 发消息
发表于: IP:您无权察看 2015-10-23 12:47:54 | [全部帖] [楼主帖] 2  楼

可以的话,其实我不是很建议用乱数的方式来做打散的效果,今天是量比较少还可以,我之前有遇过有一个人也是用这种方式来做,结果一直跑不出结果,问题就是出在于量太大,

越抽机率越小,就为了做随机抽取搞的要靠运气才做得完。

 

我看了一下你的程序,问题出在取数的范围,你的阵列大小是9,但是你取的数是0~8实际上得到的数是0~7,不包含8,又因为阵列本身内容预设全都是0,所以依照你取的条件来看,0也被排除在外,所以你只取得到1~7,七个数,剩下的两个怎么取也取不到。

 

我没仔细去看,虽然不知道为什么把max改成10无法解决,但是把max改成9同时把阵列元素值全设为-1就跑得出来了,但跑出来还有没有其他问题你就再试试了。

class Cpuzzle extends JFrame{
  //乱数用
  int minx = 0, max = 9;//改成9
  int[] num = new int[9];//这个是匿名区块,用来在方法之外做方法内才能做的事
  {
    for(int i=0;i<9;i++){
      num[i]=-1;
    }
  }




赞(0)    操作        顶端 
可爱的龙八
注册用户
等级:中尉
经验:466
发帖:10
精华:2
注册:2015-10-9
状态:离线
发送短消息息给可爱的龙八 加好友    发送短消息息给可爱的龙八 发消息
发表于: IP:您无权察看 2015-10-23 12:50:28 | [全部帖] [楼主帖] 3  楼

可以的话,其实我不是很建议用乱数的方式来做打散的效果,今天是量比较少还可以,我之前.....


我个人是不太会用while(true)的方式来跑,

除非是像程关闭之前都要让他一直跑的程式,

例如游戏动画的设计,就是结束之前就要一直更新画面,

或是聊天程式,需要一直等待接收讯息,

才会让while一直跑。

其他如果是因为没有固定执行次数,

也要特别注意在break的条件判断,因为这是还蛮容易出错的地方,

由其是使用经验不足的话。




赞(0)    操作        顶端 
月亮圆儿
注册用户
等级:列兵
经验:87
发帖:1
精华:0
注册:2015-10-23
状态:离线
发送短消息息给月亮圆儿 加好友    发送短消息息给月亮圆儿 发消息
发表于: IP:您无权察看 2015-10-23 12:56:12 | [全部帖] [楼主帖] 4  楼



可以的话,其实我不是很建议用乱数的方式来做打散的效果,<span style="font-fam.....


谢谢,不过想再问一下取乱数的方式,因为刚刚说是用随机的索引值来取得数值,可是随机生成的索引值会不会也出现重复的情况,是不是还要用到while回圈来检查ArrayList内的元素是否空了?




赞(0)    操作        顶端 
可爱的龙八
注册用户
等级:中尉
经验:466
发帖:10
精华:2
注册:2015-10-9
状态:离线
发送短消息息给可爱的龙八 加好友    发送短消息息给可爱的龙八 发消息
发表于: IP:您无权察看 2015-10-23 13:02:03 | [全部帖] [楼主帖] 5  楼

[quote=引用4楼月亮圆儿的回复:]





举例来说,ArrayList里面加入了0~8,总共9个数字,而它的index索引值也刚好是0~8,但是一个是key,一个是value,两者不是固定的配对关系,也就是你从中取出任一数,

例如get(5),就是以索引5来取出5这个数值,取出之后再remove(5),把索引5的资料给移除,这时候ArrayList里就剩索引0~7,而值依序分别是01234678,所以这时候索引5对应的就是6的值。而这时候你要再随机乱数来取的话,就要注意范围也要缩减为0~7

然后依此类推,0~60~5....值到元素都取光了为止。

 

while回圈一样还是要用,只是不是用while(true),而是要用while(!ArrayList.isEmpty())

不为空的时候回传的都是false,所以加上一个 !来让while能执行,当元素为空的时候回圈就会终止。 




赞(0)    操作        顶端 
总帖数
5
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论