2012-12-29 18 views
-2

我想知道是否有任何人可以看看我的代码,这是工作,所以你可以复制并测试它麻烦。当底栏倒数到底时,我的问题是什么,它应该结束游戏,然后再从头开始。但是我认为我错过了一些代码,或者我的代码没有正确编写来做我想做的事情。任何人都可以查看它并查看我出错的地方吗?我有这个非常简单的猜数游戏,它几乎完成,但我有它的一些

这是游戏画面的所有GUI和主():

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.Timer; 

public class GameScreen { 

    public static void main(String[] args) throws InterruptedException { 
     final ProgressBar progressBar = new ProgressBar() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(0, 30); 
      } 
     }; 
     final JFrame game = new JFrame(); 
     final JButton playButton, guessButton; 
     final JPanel topPanel, gamePanel, rangePanel, guessPanel; 
     final JTextArea gameStatus; 
     final GuessingGame gameNumbers; 
     final JLabel rangeLabel = new JLabel("Range: "); 
     final JTextField playerName = new JTextField("", 20); 
     final JTextField guessInput = new JTextField("", 20); 

     gameStatus = new JTextArea(10, 20); 
     JScrollPane scroll = new JScrollPane(gameStatus); 
     gameNumbers = new GuessingGame(); 

     playButton = new JButton("Play"); 
     guessButton = new JButton("Guess"); 
topPanel = new JPanel(); 
     topPanel.setBackground(Color.yellow); 
     topPanel.add(new JLabel("Player: ")); 
     topPanel.add(playerName); 
     topPanel.add(playButton); 

     rangePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     rangePanel.add(rangeLabel, BorderLayout.CENTER); 

     guessPanel = new JPanel(); 
     guessPanel.add(new JLabel("Guess: ")); 
     guessPanel.add(guessInput); 
     guessPanel.add(guessButton); 

     gamePanel = new JPanel(new BorderLayout()); 
     gamePanel.add(rangePanel, BorderLayout.NORTH); 
     gamePanel.add(guessPanel); 

     game.setTitle("Guessing Game"); 
     game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     game.add(topPanel, BorderLayout.NORTH); 
     game.add(scroll, BorderLayout.EAST); 
     game.add(gamePanel, BorderLayout.CENTER); 
     game.add(progressBar, BorderLayout.SOUTH); 

     gameStatus.setFocusable(false); 
     guessButton.setEnabled(false); 
     guessInput.setEnabled(false); 
     final Timer gameTimer = new Timer(1000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (progressBar.getRunStatus() == false){ 
        System.out.println("YAY"); 
        guessButton.setEnabled(false); 
        guessInput.setEnabled(false); 
        playButton.setEnabled(true); 
        playerName.setEnabled(true); 
       } 
      } 
     }); 
     playButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (playerName.getText().equals("")) { 
        JOptionPane.showMessageDialog(gamePanel, "Invalid Player Name"); 
       } else { 
        progressBar.repaint(); 
        progressBar.StartTimer(); 
        progressBar.setBackground(Color.gray); 
        gameNumbers.play(); 
        gameStatus.append("Game Started!\n"); 
        rangeLabel.setText(gameNumbers.toString()); 
        guessButton.setEnabled(true); 
        guessInput.setEnabled(true); 
        playButton.setEnabled(false); 
        playerName.setEnabled(false); 
        gameTimer.start(); 
} 
      } 
     }); 
     guessButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int playerGuess = Integer.parseInt(guessInput.getText()); 
       if (gameNumbers.isGuessCorrect(playerGuess)) { 
        gameStatus.append("Game Over!\n"); 
        guessButton.setEnabled(false); 
        guessInput.setEnabled(false); 
        playButton.setEnabled(true); 
        playerName.setEnabled(true); 
        JOptionPane.showMessageDialog(gamePanel, "" + playerName.getText() + " wins!"); 
       } 
       if (gameNumbers.isGuessAlmostCorrect(playerGuess)) { 
        gameStatus.append("very close!\n"); 
        guessInput.requestFocus(); 
       } 
       if (gameNumbers.isGuessLarger(playerGuess)) { 
        gameStatus.append("try something smaller...\n"); 
        guessInput.requestFocus(); 
       } 
       if (gameNumbers.isGuessSmaller(playerGuess)) { 
        gameStatus.append("try something larger...\n"); 
        guessInput.requestFocus(); 
       } 
      } 
     }); 

     game.pack(); 
     game.setVisible(true); 
    } 
; 
} 

这是我的ProgressBar类:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

class ProgressBar extends JPanel { 

    public int minValue, maxValue; 
    private int currentValue; 
    public boolean running; 
    private ArrayList<Rectangle> rects = new ArrayList<>(); 
    private int removeValue = 0; 

    public ProgressBar() { 
     setMaxValue(); 
     minValue = 0; 
     this.running = true; 
     currentValue = maxValue; 
     this.setBackground(Color.green); 
    } 

    public void StartTimer() { 
     setMaxValue(); 
     Timer progressBarCountDownTimer = new Timer(1000, new ActionListener() { 
      int count = getMaxValue(); 
      @Override 
      public void actionPerformed(ActionEvent ae) { 

       if (getValue() == 0) { 
        setRunStatus(false); 
        ((Timer) ae.getSource()).stop(); 
        System.out.println("YAY"); 
        ; 

       } else { 
        count--; 
        System.out.println(getValue()); 
        setValue(count); 
       } 
       setValue(count); 
      } 
     }); 
     progressBarCountDownTimer.start(); 
    } 
@Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 

     rects.clear(); 
     int rectWidths = getWidth()/getMaxValue(); 
     int startingX = 0; 

     for (int i = 0; i < (getMaxValue() - removeValue); i++) { 
      rects.add(new Rectangle(startingX, 0, rectWidths, getHeight())); 
      startingX += rectWidths; 
     } 

     for (Rectangle r : rects) { 
      g2d.setColor(Color.green); 
      g2d.fillRect(r.x, r.y, r.width, r.height); 
     } 
    } 

    public int getValue() { 
     return currentValue; 
    } 

    public void setRunStatus(boolean running) { 
     this.running = running; 
    } 

    public boolean getRunStatus() { 
     if (this.running == true) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void setValue(int value) { 
     int rem = value - currentValue; 
     removeValue -= rem; 
     currentValue = value; 
     repaint(); 
    } 

    public int getMaxValue() { 
     return maxValue; 
    } 

    public void setMaxValue() { 
     maxValue = RandomValues.integer(5, 20); 
    } 
} 

这是我的猜测游戏类():

public class GuessingGame { 

    int minRange, maxRange, secretNumber; 
    RandomValues randomValue; 

    public GuessingGame() { 
     randomValue = new RandomValues(); 
    } 

    public int getMinRange() { 
     return minRange; 
    } 

    public int getMaxRange() { 
     return maxRange; 
    } 

    public void setMinRange() { 
     this.minRange = randomValue.integer(1, 10); 
    } 

    public void setMaxRange() { 
     this.maxRange = randomValue.integer(80, 100); 
    } 

    public int getSecretNumber() { 
     return secretNumber; 
    } 

    public void setSecretNumber() { 
     this.secretNumber = randomValue.integer(minRange, maxRange); 
    } 

    public void play() { 
     setMinRange(); 
     setMaxRange(); 
     setSecretNumber(); 
    } 

    public boolean isGuessCorrect(int guess) { 
     if (guess == this.secretNumber) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public boolean isGuessAlmostCorrect(int guess) { 
     if (guess >= this.secretNumber - 5 & guess <= this.secretNumber + 5 & guess != this.secretNumber) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public boolean isGuessSmaller(int guess) { 
     if (guess < this.secretNumber) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public boolean isGuessLarger(int guess) { 
     if (guess > this.secretNumber) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public String toString() { 
     return String.format("Range: %d to %d answer: %d", getMinRange(), getMaxRange(), getSecretNumber()); 
    } 
} 

最后,这只是我简单的RandomValues类来获得随机数字:

import java.util.Random; 


public class RandomValues { 

    public static int integer(int min, int max) { 
     Random randomNum = new Random(); 
     int randomValue = randomNum.nextInt(max - min + 1) + min; 
     return randomValue; 
    } 
} 

我很抱歉,如果这是一个有点太长了,但如果你做的复制和粘贴,它的工作,并加载它只是倒计时器部分只是似乎不是想工作这样,我希望它......如果有任何人可以帮助我,我会永远爱他们:)

+0

*“但如果您复制并粘贴它,”* 4次,为4个公开课。如果其中3个是默认访问权限,则可以使用'main(String [])'将它们移动到源代码的末尾。从而将其减少到** 1 **复制/粘贴。 –

+0

的描述有点vague-“它没有做我想要什么” - 通过代码阅读和玩了之后,我想我知道它的“假设”的事,但是这将是一个猜测充其量 – MadProgrammer

+0

KrazyKat89说实话,你似乎没有花时间去制定这个问题。当然,有些人会回答任何问题,但是你真的应该缩小问题的范围以便提出具体的问题 - 不要只是向人们扔一堆代码并问“出了什么问题?”如果你这样做,它往往不会在这些网站上得到太好的评价。 –

回答

2

在你gameTimerprogressBar.getRunStatus() == false,你需要停止计时器... ((Timer)ae.getSource()).stop();

现在...说实话,我不会打扰。

我会使用类似ChangeListenerPropetyListener的东西来提供ProgressBar其他类可注册的回调机制。这意味着反馈变得更加被动,而不是当前正在经历的这种活跃的“ping”过程。

基本上,这意味着你将提供一种手段让其他对象中可以根据需要的进度条更改了状态,他们会有什么反应时,被通知登记的兴趣。

ProgressBar#paintComponent是......坦率地说...有点怪

尝试,而不是画,它表示可用宽度,而不是百分比的矩形...

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 

    int x = 0; 
    int y = 0; 
    int width = Math.round(getWidth() * (((float)getValue()/(float)getMaxValue()))); 
    g2d.setColor(Color.GREEN); 
    g2d.fillRect(x, y, width, getHeight()); 

//   rects.clear(); 
//   int rectWidths = getWidth()/getMaxValue(); 
//   int startingX = 0; 
// 
//   for (int i = 0; i < (getMaxValue() - removeValue); i++) { 
//    rects.add(new Rectangle(startingX, 0, rectWidths, getHeight())); 
//    startingX += rectWidths; 
//   } 
// 
//   for (Rectangle r : rects) { 
//    g2d.setColor(Color.green); 
//    g2d.fillRect(r.x, r.y, r.width, r.height); 
//   } 
} 
+0

感谢的是帮助了很多:)使得它看起来那么顺利得多 – KrazyKat89

+1

@mad的的paintComponent是不是最好的,因为我是刚开始工作的例子:http://stackoverflow.com/a/14052118/1133011。但加1的百分比增量:)。 –

+0

@DavidKroukamp尼斯点! – MadProgrammer

1

我想其中一个问题是你没有正确地停止你的计时器,但是会不小心继续运行。

例如,在ProgressBar你总是创建的StartTimer每次调用一个新的计时器。您尝试通过调用((Timer) ae.getSource()).stop();停止它,如果getValue()返回0。我认为这是行不通的,因为你有一个竞争条件和值实际上可以成为负值。所以停止不会被触发。

我会建议progressBarCountDownTimer存储为类的属性,并确保你开始一个新的计时器前,它是正确停止。恕我直言,这是更强大。

+0

我不知道你将如何得到一个'javax.swing.Timer'竞争条件,因为每个“嘀”的EDT(单线程)被执行,观察者和生产者实际上是相同的方法,根据一个不同的分支采取的条件 - 但我一直在整天画墙,所以我的大脑可能简单糊涂 - 我同意计时器作为班级的一个属性none-less-less – MadProgrammer

+0

@ Philipp我会怎么去做你的建议? – KrazyKat89

+0

确定,所以它似乎是现在的工作非常好,通过第一次运行时,当倒计时栏得到0,计时器停止和播放按钮再次作品和Guess按钮犯规。那我想:)然后去按第二次播放按钮,它不再工作:(任何想法???? – KrazyKat89

相关问题