在做java的课程设计,准备做个人名pk器,完全可以实现了,就是体力,攻击,防御,你打我一下,我打你一下,通过一个while循环,当有某一人体力小于等于0时候跳出循环,现在的问题是运行后所有动作都会直接输出出来,所以我想在while循环中加入一段代码使得一次循环结束后间隔一秒再进行下一次,也就是没隔一秒打一下,并输出出来今天找了一下午,也试过用try{
    Thread.sleep(500);
}
catch(Exception e){}但是这个会是我点击开始PK后,等上十几秒,等于把循环中的所有停顿的时间都聚在一起停了,然后一下出来所有动作,完全不能实现我期望的效果所以请教下高手们应该怎么做谢谢大家了。。

解决方案 »

  1.   

    while(){
    Thread.sleep(500);

    这样是可以的你没写对吧。。
      

  2.   

    GUI.java
    package namevsname;
    import java.util.*;
    public class GUI extends javax.swing.JFrame {     public GUI() {
            initComponents();
        }
        @SuppressWarnings("unchecked")
                         
        private void initComponents() {        jLabel1 = new javax.swing.JLabel();
            jTextField1 = new javax.swing.JTextField();
            jTextField2 = new javax.swing.JTextField();
            jButton1 = new javax.swing.JButton();
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextArea1 = new javax.swing.JTextArea();
            jLabel2 = new javax.swing.JLabel();
            jLabel3 = new javax.swing.JLabel();
            jLabel4 = new javax.swing.JLabel();
            jLabel5 = new javax.swing.JLabel();
            jLabel6 = new javax.swing.JLabel();
            jLabel7 = new javax.swing.JLabel();        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("人名PK器");
            setBackground(new java.awt.Color(255, 102, 102));
            setMinimumSize(new java.awt.Dimension(450, 350));
            setName(""); // NOI18N
            getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());        jLabel1.setText("请输入要PK的两个名字");
            getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(133, 19, -1, -1));        jTextField1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jTextField1ActionPerformed(evt);
                }
            });
            getContentPane().add(jTextField1, new org.netbeans.lib.awtextra.AbsoluteConstraints(69, 40, 80, -1));
            getContentPane().add(jTextField2, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 40, 80, -1));        jButton1.setText("开始PK");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
            getContentPane().add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 90, -1, -1));        jTextArea1.setColumns(20);
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);        getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(41, 190, 325, -1));        jLabel2.setText("体力");
            getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(69, 94, 70, -1));        jLabel3.setText("攻击");
            getContentPane().add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 120, 70, -1));        jLabel4.setText("防御");
            getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 150, 70, -1));        jLabel5.setText("体力");
            getContentPane().add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 90, 80, 20));        jLabel6.setText("攻击");
            getContentPane().add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 120, 80, 20));        jLabel7.setText("防御");
            getContentPane().add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 150, 80, 20));        pack();
        }                     
       private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            try
            {
                String n1=CodeChange.change(jTextField1.getText());
                String n2=CodeChange.change(jTextField2.getText());
                
                int tili1=(Integer.parseInt(n1.substring(0,3))-500)/3+300;
                int gongji1=(Integer.parseInt(n1.substring(3,5))-75)/2+50;
                int fangyu1=(Integer.parseInt(n1.substring(5,6))-5)/2+10;
                int tili2=(Integer.parseInt(n2.substring(0,3))-500)/3+300;
                int gongji2=(Integer.parseInt(n2.substring(3,5))-75)/2+50;
                int fangyu2=(Integer.parseInt(n2.substring(5,6))-5)/2+10;
                jLabel2.setText("体力:"+tili1);
                jLabel3.setText("攻击:"+gongji1);
                jLabel4.setText("防御:"+fangyu1);
                jLabel5.setText("体力:"+tili2);
                jLabel6.setText("攻击:"+gongji2);
                jLabel7.setText("防御:"+fangyu2);
                int na=6;
                int nb=6;
                jTextArea1.setText(""); 
          
                while(tili1>=0 & tili2>=0)
                {
                    
                    Random a=new Random();
                    if(tili1>=0)
                    {
                    if(a.nextInt(2)==1 & na<n1.length()-1)
                    {
                    switch(Integer.parseInt(n1.substring(na,++na))){
                        case 0:
                        {
                            tili2=tili2-20;
                            jTextArea1.append(jTextField1.getText()+"捡起板砖拍"+jTextField2.getText()+"一下  "+jTextField2.getText()+"体力减少20\n");
                        break;}
                        case 1:
                        {
                            tili2=tili2-10;
                            jTextArea1.append(jTextField1.getText()+"用水枪射"+jTextField2.getText()+"   "+jTextField2.getText()+"体力减少10\n");
                        break;}
                        case 2:
                        {
                            tili2=tili2-50;
                            jTextArea1.append(jTextField1.getText()+"指挥飞机轰炸"+jTextField2.getText()+"   "+jTextField2.getText()+"体力减少50\n");
                        break;}
                        case 3:
                        {
                            tili2=tili2-30;
                            jTextArea1.append(jTextField1.getText()+"放狗咬"+jTextField2.getText()+"   "+jTextField2.getText()+"体力减少30\n");
                           break; }
                        case 4:
                        {
                            tili2=tili2-15;
                            jTextArea1.append(jTextField1.getText()+"扇了"+jTextField2.getText()+"一巴掌 "+jTextField2.getText()+"体力减少15\n");
                        break;}
                        case 5:
                        {
                            gongji1=gongji1+gongji1/5;
                            jTextArea1.append(jTextField1.getText()+"中了大奖  "+jTextField1.getText()+"攻击提高20%\n");
                        break;}
                        case 6:
                        {
                            tili1=tili1+20;
                            jTextArea1.append(jTextField1.getText()+"捡到一瓶矿泉水  "+jTextField1.getText()+"体力增加20\n");
                        break;}
                        case 7:
                        {
                            gongji1=gongji1/2;
                            jTextArea1.append(jTextField1.getText()+"吃路边烧烤中毒  "+jTextField1.getText()+"攻击减半\n");
                        break;}
                        case 8:
                        {
                            tili1=tili1-20;
                            jTextArea1.append(jTextField1.getText()+"踩到香蕉皮滑倒  "+jTextField1.getText()+"体力减少20\n");
                        break;}
                        case 9:
                        {
                            fangyu1=fangyu1/2;
                            jTextArea1.append(jTextField1.getText()+"踩到便便  "+jTextField1.getText()+"防御减少20\n");
                        break;}
                                  
                    }
                    }
                    else{
                        if(fangyu2<gongji1)
                        {
                        tili2=tili2+fangyu2-gongji1;
                        int temp1;
                        temp1=gongji1-fangyu2;
                        jTextArea1.append(jTextField1.getText()+"对"+jTextField2.getText()+"造成普通攻击 体力减少"+temp1+"\n");
                        }
                        else 
                        jTextArea1.append(jTextField1.getText()+"的攻击没有超过"+jTextField2.getText()+"的防御 不掉血!\n");
                    }
                }
                    else 
                    {
                        jTextArea1.append(jTextField2.getText()+"获得胜利!\n");
                        break;
                    
                    }
                                jLabel2.setText("体力:"+tili1);
                jLabel3.setText("攻击:"+gongji1);
                jLabel4.setText("防御:"+fangyu1);
                jLabel5.setText("体力:"+tili2);
                jLabel6.setText("攻击:"+gongji2);
                jLabel7.setText("防御:"+fangyu2);
      

  3.   

    接上面            try{
                    Thread.sleep(500);      //t1等待1秒后继续执行下面的内容            }catch(Exception e){}
                    if(tili2>=0)
                    {
                        if(a.nextInt(2)==1 & nb<n2.length()-1)
                        {
                            switch(Integer.parseInt(n2.substring(nb,++nb))){
                        case 0:
                        {
                            tili1=tili1-20;
                            jTextArea1.append(jTextField2.getText()+"捡起板砖拍"+jTextField1.getText()+"一下  "+jTextField1.getText()+"体力减少20\n");
                        break;}
                        case 1:
                        {
                            tili1=tili1-10;
                            jTextArea1.append(jTextField2.getText()+"用水枪射"+jTextField1.getText()+"   "+jTextField1.getText()+"体力减少10\n");
                        break;}
                        case 2:
                        {
                            tili1=tili1-50;
                            jTextArea1.append(jTextField2.getText()+"指挥飞机轰炸"+jTextField1.getText()+"   "+jTextField1.getText()+"体力减少50\n");
                        break;}
                        case 3:
                        {
                            tili1=tili1-30;
                            jTextArea1.append(jTextField2.getText()+"放狗咬"+jTextField1.getText()+"   "+jTextField1.getText()+"体力减少30\n");
                           break; }
                        case 4:
                        {
                            tili1=tili1-15;
                            jTextArea1.append(jTextField2.getText()+"扇了"+jTextField1.getText()+"一巴掌 "+jTextField1.getText()+"体力减少15\n");
                       break; }
                        case 5:
                        {
                            gongji2=gongji2+gongji2/5;
                            jTextArea1.append(jTextField2.getText()+"中了大奖  "+jTextField2.getText()+"攻击提高20%\n");
                        break;}
                        case 6:
                        {
                            tili2=tili2+20;
                            jTextArea1.append(jTextField2.getText()+"捡到一瓶矿泉水  "+jTextField2.getText()+"体力增加20\n");
                        break;}
                        case 7:
                        {
                            gongji2=gongji2/2;
                            jTextArea1.append(jTextField2.getText()+"吃路边烧烤中毒  "+jTextField2.getText()+"攻击减半\n");
                        break;}
                        case 8:
                        {
                            tili2=tili2-20;
                            jTextArea1.append(jTextField2.getText()+"踩到香蕉皮滑倒  "+jTextField2.getText()+"体力减少20\n");
                        break;}
                        case 9:
                        {
                            fangyu2=fangyu2/2;
                            jTextArea1.append(jTextField2.getText()+"踩到便便  "+jTextField2.getText()+"防御减少20\n");
                        break;}
                                  
                    }
                        }
                        else{
                        if(fangyu1<gongji2)
                        {
                        tili1=tili1+fangyu1-gongji2;
                        int temp2;
                        temp2=gongji2-fangyu1;
                        jTextArea1.append(jTextField2.getText()+"对"+jTextField1.getText()+"造成普通攻击 体力减少"+temp2+"\n");
                        }
                        else 
                        jTextArea1.append(jTextField2.getText()+"的攻击没有超过"+jTextField1.getText()+"的防御 不掉血!\n");
                    }
                    }
                    else 
                    {
                        jTextArea1.append(jTextField1.getText()+"获得胜利!\n");
                        break;
                    
                    }
                                jLabel2.setText("体力:"+tili1);
                jLabel3.setText("攻击:"+gongji1);
                jLabel4.setText("防御:"+fangyu1);
                jLabel5.setText("体力:"+tili2);
                jLabel6.setText("攻击:"+gongji2);
                jLabel7.setText("防御:"+fangyu2);
                try{
                    Thread.sleep(500);      //t1等待1秒后继续执行下面的内容            }catch(Exception e){}
                    if(gongji1<=fangyu2 & gongji2<=fangyu1)
                    {
                        jTextArea1.append(jTextField1.getText()+"和"+jTextField2.getText()+"都无法对对方造成伤害,平局!");
                        break;
                    }
                }
                if(tili1<=0)
                {
                     jTextArea1.append(jTextField2.getText()+"获得胜利!\n");
                }
                //else
                  //   jTextArea1.append(jTextField1.getText()+"获得胜利!\n");
            }
            catch(NoChineseException e){
                System.out.println(e.toString());
            }
            
        }                                            private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
            // TODO add your handling code here:
        }                                               /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {            public void run() {
                    new GUI().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel3;
        private javax.swing.JLabel jLabel4;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JLabel jLabel6;
        private javax.swing.JLabel jLabel7;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        private javax.swing.JTextField jTextField1;
        private javax.swing.JTextField jTextField2;               
    }
      

  4.   

    CodeChange.java
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package namevsname;
    import java.lang.Character.UnicodeBlock;
    import java.math.BigInteger;/**
     *
     * @author hanzi
     */class NoChineseException extends Exception
    {
    String message;
    NoChineseException(String e)
    {
    message=e+"���Ǻ��֣�";
    }
    public String toString()
    {
    return message;
    }
    }public class CodeChange{
     public static String change(String str) throws NoChineseException{
      char[] myBuffer = str.toCharArray();
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < str.length(); i++) {
       UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);
       if (ub != UnicodeBlock.BASIC_LATIN & ub != UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS)
       {
        // ����
        short s = (short) myBuffer[i];
        String hexS = Integer.toHexString(s);
        sb.append(hexS.toLowerCase());
       }
       else
       {
       NoChineseException exception=new NoChineseException(str);
       throw exception;
    }
      }
      return (new BigInteger(sb.toString(), 16).toString());
     }
     public static void main(String[] args) {
      try{
       String s="郑撼";
       s=CodeChange.change(s);
       System.out.println(s);
    }
    catch(NoChineseException e)
    {
    System.out.println(e.toString());
    }
     }
    }
      

  5.   

    情何以堪了。。去掉中间两段
    try{
                    Thread.sleep(500);      //t1等待1秒后继续执行下面的内容            }catch(Exception e){}
    是可以运行的 效果就是直接出谁赢谁输的结果我想要的是一步一步出现,搞不了啊
      

  6.   

    楼主你确定是while(tili1>=0 & tili2>=0)
    而不是while(tili1>=0 && tili2>=0)
      

  7.   

    以前用C#写游戏的时候也有这样的问题。界面是由执行main()方法的那个主线程来管理的,这点你要明白。
    1,如果你没有使用多线程:
    界面只能等待后台计算完毕,才能更新。这个明显不能用来做界面实时更新的。
    2,
    如果你使用多线程了,那个主线程会等待子线程计算完毕后才更新界面。
    C#为解决这个问题,引用了INVOKE 关键来呼叫主线程实时更新界面。
    ===============
    没有用JAVA写过带界面的,以上供参考。
    你可以看看JAVA有没有类似Invoke的方法。
      

  8.   

    同情楼主,看来是挺纠结的,帮你一把!
    首先,可以肯定的是,你写的循环啊什么的,都没有大问题(我是没认真看啦,太长了)!
    唯一的问题是,你没有仔细看awt和swing之间的区别!
    你的错就错在你使用了swing组件,而不是awt组建,仔细看下他们的API介绍,在线程问题上是有很明显的区别的!
    解决办法:
    1、用awt组件替换swing组件,典型的比如使用java.awt.TextArea而不是javax.swing.JTextArea;
    2、让你的按钮事件处理方法,在一个独立的线程内执行!
      

  9.   

    1 应该是每一次做完之后需要手动刷新界面吧2 LZ的代码我感觉可以改进
    玩家1和玩家2做的事情是一样的,不妨写一个玩家类,比如叫Player,里面可以有个方法,不妨叫
    void pk(Player p) 意思是当前玩家和玩家p PK3 用拼音做变量名俺觉得不舒服= = 当然这是个人习惯,有仁兄还用中文做变量名
      

  10.   

    感谢楼上几位,昨晚用timer做了出来