2011-08-31 13 views
9

में देरी कैसे बनाएं मैंने एक ब्लैकजैक गेम बनाया, और मैं एआई प्लेयर को कार्ड लेने के बीच रोकना चाहता हूं। मैंने थ्रेड स्लीप (एक्स) का उपयोग करने की कोशिश की, लेकिन जब तक एआई प्लेयर अपने सभी कार्ड नहीं ले लेता तब तक यह स्थिर हो जाता है। मुझे पता है कि स्विंग थ्रेड सुरक्षित नहीं है, इसलिए मैंने टाइमर को देखा, लेकिन मुझे समझ में नहीं आया कि मैं इसके लिए कैसे उपयोग कर सकता हूं। यहां मेरा वर्तमान कोड है:स्विंग

while (JB.total < 21) { 

      try { 
      Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
      System.out.println("Oh noes!"); 
      } 

      switch (getJBTable(JB.total, JB.aces > 0)) { 
      case 0: 
       JB.hit(); 
       break; 
      case 1: 
       break done; 
      case 2: 
       JB.hit(); 
       JB.bet *= 2; 
       break done; 
      } 
     } 

बीटीडब्ल्यू, हिट(); विधि जीयूआई अद्यतन करता है।

उत्तर

3

ठीक है, निम्न कोड JTextame को JTextArea और JButton के साथ दिखाता है। जब बटन क्लिक किया जाता है, तो टाइमर घटना को समय-समय पर (उनके बीच दूसरी देरी के साथ) बटन से संबंधित बटन भेजता है जो वर्तमान समय के साथ एक लाइन जोड़ता है।

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Calendar; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.Timer; 


public class TimerTest extends JFrame implements ActionListener{ 

    private static final long serialVersionUID = 7416567620110237028L; 
    JTextArea area; 
    Timer timer; 
    int count; // Counts the number of sendings done by the timer 
    boolean running; // Indicates if the timer is started (true) or stopped (false) 

    public TimerTest() { 
     super("Test"); 
     setBounds(30,30,500,500); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(null); 

     area = new JTextArea(); 
     area.setBounds(0, 0, 500, 400); 
     add(area); 

     JButton button = new JButton("Click Me!"); 
     button.addActionListener(this); 
     button.setBounds(200, 400, 100, 40); 
     add(button); 

     // Initialization of the timer. 1 second delay and this class as ActionListener 
     timer = new Timer(1000, this); 
     timer.setRepeats(true); // Send events until someone stops it 
     count = 0; // in the beginning, 0 events sended by timer 
     running = false; 
     System.out.println(timer.isRepeats()); 
     setVisible(true); // Shows the frame 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (! running) { 
      timer.start(); 
      running = true; 
     } 
     // Writing the current time and increasing the cont times 
     area.append(Calendar.getInstance().getTime().toString()+"\n"); 
     count++; 
     if (count == 10) { 
      timer.stop(); 
      count = 0; 
      running = false; 
     } 
    } 

    public static void main(String[] args) { 
     // Executing the frame with its Timer 
     new TimerTest(); 
    } 
} 

अच्छा, यह कोड javax.swig.Timer ऑब्जेक्ट्स का उपयोग करने का नमूना है। प्रश्न के विशेष मामले के संबंध में। टाइमर को रोकने के लिए अगर कथन बदलना चाहिए, और जाहिर है, कार्रवाई के कार्यों को लागू किया गया है।निम्नलिखित टुकड़ा समाधान की एक कंकाल actionPerformed है:

public void actionPerformed(ActionEvent e) { 
    if (e.getComponent() == myDealerComponent()) { 
    // I do this if statement because the actionPerformed can treat more components 
     if (! running) { 
      timer.start(); 
      runnig = true; 
     } 
     // Hit a card if it must be hitted 
     switch (getJBTable(JB.total, JB.aces > 0)) { 
      case 0: 
       JB.hit(); 
       break; 
      case 1: 
       break done; 
      case 2: 
       JB.hit(); 
       JB.bet *= 2; 
       break done; 
     } 
     if (JB.total >= 21) { // In this case we don't need count the number of times, only check the JB.total 21 reached 
      timer.stop() 
      running = false; 
     } 

    } 
} 

IMHO इससे समस्या का समाधान, अब @ user920769 लगता है जहां ActionListener और प्रारंभिक/रोक की स्थिति में डाल दिया जाना चाहिए ...

@kleopatra: धन्यवाद मुझे इस टाइमर क्लास का अस्तित्व दिखाने के लिए, मुझे इसके बारे में कुछ नहीं पता है और यह आश्चर्यजनक है, स्विंग एप्लिकेशन में बहुत सी कार्यरत चीजें संभव बनाएं :)

+0

उदाहरण के लिए आपको बहुत बहुत धन्यवाद, लेकिन मुझे इन पंक्तियों पर एक त्रुटि मिल रही है: टाइमर = नया टाइमर (1000, यह); timer.setRepeats (सही); यह कहकर क्रमशः उपयुक्त कन्स्ट्रक्टर या विधि नहीं मिल रहा है। क्या वे बहिष्कृत थे? – Fractaly

+0

क्या आप टाइमर क्लास आयात करते हैं? आखिरी रिलीज में विधियों को भी बहिष्कृत नहीं किया गया है, इसलिए यह आपकी गलती है। [यहां जावा 7 एपीडोक] (http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html) – Charliemops

7

तो मैं टाइमर को देखा है, लेकिन मैं नहीं समझ सकता है कि कैसे मैं के लिए इस

टाइमर एक इस्तेमाल कर सकते हैं समाधान है, के बाद से के रूप में आप कहते हैं कि तुम जीयूआई जो पर किया जाना चाहिए अद्यतन कर रहे हैं ईडीटी

मुझे यकीन नहीं है कि आपकी चिंता क्या है। आप एक कार्ड सौदा करते हैं और टाइमर शुरू करते हैं। जब टाइमर आग लगती है तो आप एक और कार्ड लेने या पकड़ने का फैसला करते हैं। जब आप टाइमर को रोकते हैं।

+0

धन्यवाद, लेकिन मैं आपको बस कुछ उदाहरण कोड दे सकता हूं इसके लिए टाइमर का उपयोग कैसे करें? मैंने पहले कोशिश की, और यह एक त्रुटि फेंक दिया, मैं भूल गया कि वास्तव में क्या था। – Fractaly

+0

@ user920769 को देखने के लिए (और ध्यान से पढ़ें;) फिर से प्रयास करें, फिर से प्रयास करें – kleopatra

3

मुझे लगता है कि this tutorial में यह पता है कि थ्रेड के साथ निपटने के बिना आप जो चाहते हैं उसे प्राप्त करने के लिए टाइमर का उपयोग कैसे करें।

+1

एस्टा respuesta es de la buena – alex

4

ठीक है, टाइमर के बारे में एक त्वरित स्पष्टीकरण।

सबसे पहले, आपको java.util.TimerTask (चलिए इसे टास्कर कहते हैं) में आपकी कक्षा में एक java.util.Timer चर की आवश्यकता है।

टाइमर चर के प्रारंभ में बहुत आसान है:

Timer timer = new Timer(); 

अब Tasker वर्ग:

public class Tasker extends TimerTask { 
    @Override 
    public void run() { 
     actionToDo(); // For example take cards 
    } 

    // More functions if they are needed 
} 

अंत में, इससे संबंधित Tasker साथ टाइमर की स्थापना:

long delay = 0L; 
long period = pauseTime; 
timer.schedule(new Tasker(),delay,period); 

शेड्यूल फ़ंक्शन निम्न इंगित करता है: फ़िसर्ट पैराम: एक्शन टू डी o प्रत्येक अवधि मिलीसेकंड (टाइमर टास्क क्लास या उसके एक्सटेंशन के रन फ़ंक्शन निष्पादित करता है) दूसरा param: जब टाइमर शुरू होना चाहिए। इस मामले में, यह तब शुरू होता है जब शेड्यूल फ़ंक्शन कहा जाता है। निम्न उदाहरण शेड्यूल फ़ंक्शन को कॉल करने के बाद एक प्रारंभिक 1 सेकंड इंगित करता है: timer.schedule(new Tasker(),1000,period); तीसरा param: Tasker.run() फ़ंक्शन और निम्न कॉल के एक कॉल के बीच मिलीसेकंड।

मुझे आशा है कि आप इस माइक्रोक्रोटोरियल को समझें :)। यदि आपको कोई समस्या है, तो अधिक विस्तृत जानकारी मांगें!

दयालु संबंध!

+0

(निरपेक्षता को हटाने के लिए संपादित :-) वास्तव में - आप शायद ही कभी उपयोग का उपयोग करें। स्विंग में टिमर, इसके बजाय स्विंगक्स का उपयोग करें। टाइमर या (अधिक जटिल पृष्ठभूमि कार्यों के लिए) स्विंगवर्कर – kleopatra

+0

@ क्लेओपात्रा 'स्विंगक्स। टिमर' (स्क्रैच हेड) डीवाईएम एक 'javax.swing.Timer'? नहीं कह सकता कि मुझे दूसरा सामना करना पड़ा है। –

+0

ठीक है, मैंने कोड को उपयोग के साथ रखा है। टिमर क्योंकि एक साल पहले मैंने एक परियोजना में उपयोग किया था। मेरा प्रोजेक्ट एक वॉलीबॉल गेम था और हम उपरोक्त संरचना का उपयोग जानकारी को फिर से समझने और प्रत्येक 0,04 सेकंड विंडो को रीफ्रेश करने के लिए करते हैं। मुझे नहीं पता कि स्विंगक्स का उपयोग कैसे करें। टिमर, लेकिन यह कोड ग्राफिकल अनुप्रयोगों में सही तरीके से काम करता है। यह खिड़की को स्थिर नहीं करता है और उपयोगकर्ता को बिना किसी समस्या के चीजें करने देता है। =) – Charliemops