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,並且應該使用事件和聽衆,但是當我運行程序時,我似乎無法在遊戲運行時輸入輸入,或者至少輸入不能正常暫停。我不確定這是爲什麼,請有人幫忙。謝謝。
比較一下你是什麼意思? – user3074140