2013-12-10 55 views
0
public class CardGame implements KeyListener 
    { 
     static Player[] players; 
     static int handSize; 
     static Queue<Card>[] playingDeckArray; 
     static int playersNum; 
     static Object game; 
     static boolean pressed = false; 
     static boolean running = true; 

     public static void main(String[] args){ 
      Scanner reader = new Scanner(System.in); 

      System.out.println("\nHello, how many players would you like"); 
      playersNum = Integer.parseInt(Checks.userInputCheck("\\d")); 
      System.out.println("\nHow many cards should each player begin with"); 
      int handSize = Integer.parseInt(Checks.userInputCheck("\\d")); 
      System.out.println("\nWhich strategy would you like to use 1 or 2"); 
      int strategy = Integer.parseInt(Checks.userInputCheck("[12]$")); 

      Logger.createDeck(playersNum, handSize); 

      makePlayers(playersNum, handSize, strategy); 

      makePlayingDecks(playersNum); 

      dealInitialHand(playersNum, players, handSize); 

      makePlayerOutputs(); 

      MyKeyListenerThread elt = new MyKeyListenerThread(); 
      PauseGenerator pG = new PauseGenerator(); 

      pG.addMyKeyListener(elt); 

      elt.start(); 
      pG.start(); 

      //makeDeckOutputs(); 

      for (int i = 0; i < players.length; i++){ 
       logInitialHand(players[i]); 
      } 

      for (int i = 0; i < players.length; i++){ 
       isWinner(players[i]); 
      } 

      for (int i = 0; i < players.length; i++){ 
       new Thread(players[i]).start(); 
      } 

      while(running){ 
       String input = reader.next(); 
       System.out.println(input); 
       if (input == "p"){ 
        System.out.println("pressed"); 
        CardGame.pressed = true; 
       }else if(input == "r"){ 
        System.out.println("pressed"); 
        CardGame.pressed = false; 
       } 
      } 
     } 

static class PauseGenerator extends Thread{ 

      private MyKeyListener[] listeners = new MyKeyListener[0]; 

      Scanner s = new Scanner(System.in); 

      public void addMyKeyListener(MyKeyListener t) { 
       MyKeyListener[] tmp = new MyKeyListener[this.listeners.length+1]; 
       for (int i = 0; i < this.listeners.length; i++) 
       tmp[i] = this.listeners[i]; 
       tmp[this.listeners.length] = t; 
       this.listeners = tmp; 
      } 

      public void run(){ 
       for(;;){ 
        if(CardGame.pressed == true){ 
         fireMyKeyEvent(new MyKeyEvent(this)); 
         System.out.println("notified"); 
        } 
       } 
      } 

      void fireMyKeyEvent(MyKeyEvent evt) { 
       for (int i=0; i<this.listeners.length; i++) { 
        this.listeners[i].keyPressedEvent(evt); 
       } 
      } 
     } 
} 

Player類如何使用事件和監聽

public class Player implements Runnable 
{ 
    LinkedList<Card> hand; 
    String playerName; 
    int strategyChosen; 
    int playerNumber; 

    private boolean running = true; 
    private boolean paused = false; 

    private Object game; 

    public void setPaused(boolean paused){ 
     this.paused = paused; 
    } 

    public synchronized void run(){ 
     while(running){ 
     if(!paused){ 
      if (playerNumber == 1){ 
       if(CardGame.playingDeckArray[CardGame.playersNum-1].isEmpty()){ 
       try{ 
        System.out.println("Thread " + playerNumber + " will sleep"); 
        Thread.sleep(2000); 
        }catch(InterruptedException e){ 
        } 
       }else{ 
        System.out.println("Thread " + playerNumber + " is running"); 
        playGame(); 
       } 
      }else if(CardGame.playingDeckArray[playerNumber-1] == null){ 
       try{ 
        System.out.println("Thread " + playerNumber + " will sleep"); 
        Thread.sleep(2000); 
        }catch(InterruptedException e){ 
        } 
       }else{ 
        System.out.println("Thread " + playerNumber + " is running"); 
        playGame(); 
       } 
      } 
     } 
    } 


    private void playGame(){ 
      switch(strategyChosen){ 
       case 1 : playStratOne(); 
       break; 
       case 2 : playStratTwo(); 
       break; 
      } 
    } 

關鍵lisntener線程

public class MyKeyListenerThread extends Thread implements MyKeyListener{ 
public void keyPressedEvent(MyKeyEvent evt){ 
    Object o = evt.getSource(); 

    //if(o == "p"){ 
     for (Player player : CardGame.players){ 
      player.setPaused(true); 
     //} 
     //}else if (o == "r"){ 
     // for (Player player : CardGame.players){ 
      // player.setPaused(false); 
     // } 
    } 
} 

public void run(){ 
    for(;;) { 
    } 
} 
} 

我的主要事件類

public class MyKeyEvent extends EventObject { 
public MyKeyEvent(Object source) { 
    super(source); 
} 
} 

我的按鍵偵聽器添加暫停功能界面

public interface MyKeyListener extends EventListener { 
public void keyPressedEvent(MyKeyEvent evt); 
} 

這個想法是,當我運行程序和玩家玩遊戲時,用戶應該能夠在程序運行暫停和恢復遊戲時輸入p和r,並且應該使用事件和聽衆,但是當我運行程序時,我似乎無法在遊戲運行時輸入輸入,或者至少輸入不能正常暫停。我不確定這是爲什麼,請有人幫忙。謝謝。

+0

比較一下你是什麼意思? – user3074140

回答

0

,而不是作爲

if(o=="p") 

比較在MyKeyListenerthread

KeyEvent.VK_P

+0

我沒有使用Java提供的KeyListener,這是一個自定義事件偵聽器,所以我無法訪問KeyEvent.VK_P,因爲從我的理解中,類只能用於swing GUI,而且我需要我的命令才能工作線。 – user3074140

+0

嘗試使用JNativeHook,https://code.google.com/p/jnativehook/ – Aditya