Java Hangman游戏

时间:2010-12-29 14:52:09

标签: java swing

嗨我在假期里一直用Java制作一个刽子手游戏。我几乎完成了,但我在重新绘制/更新窗口时遇到了一些问题。

所以,当生命失去时,我正在移除面板然后添加另一个面板,但由于某种原因,它会一直向左移动或有时向右移动,这意味着我的一些线条不在重绘。

编辑:我仍然遇到麻烦,我想我现在就离开它,除非其他人有其他建议。

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

/** class to display a JFrame object using border layout */

public class HangmanJFrame extends JFrame implements ActionListener {

 private JPanel centerPanel;
 private JPanel southPanel;
 private JTextField textField;
 private LinePanel line;
 private String [] wordList = {"computer","java","activity","alaska","appearance","article",
   "automobile","basket","birthday","canada","central","character","chicken","chosen",
   "cutting","daily","darkness","diagram","disappear","driving","effort","establish","exact",
   "establishment","fifteen","football","foreign","frequently","frighten","function","gradually",
   "hurried","identity","importance","impossible","invented","italian","journey","lincoln",
   "london","massage","minerals","outer","paint","particles","personal","physical","progress",
   "quarter","recognise","replace","rhythm","situation","slightly","steady","stepped",
   "strike","successful","sudden","terrible","traffic","unusual","volume","yesterday" };

 public ArrayList<String> usedLetters = new ArrayList(); // list of used letter by user
 public ArrayList<String> correctLetters = new ArrayList();
 public String userInput = "";

 private int numLives = 6; // number of lives
 public String theWord; // the wrong which is chosen
 JButton exitButton;
 JButton playAgain;

 // no-argument constructor
 public HangmanJFrame() { 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  theWord = pickWord();
  correctLetters = new ArrayList(theWord.length());

  setSize(600,500);
  setLocation(100, 100);
  setTitle("Hangman Game");
  setLayout(new BorderLayout());

  centerPanel = new JPanel();
  line = new LinePanel(15,theWord,usedLetters);
  centerPanel.setSize(500,500);
  centerPanel.setBackground(Color.WHITE);
  centerPanel.add(line);
  add(centerPanel, BorderLayout.CENTER);

  textField = new JTextField(20);
  textField.addActionListener(this);

  playAgain = new JButton("Play Again");
  exitButton = new JButton("Exit");
  exitButton.addActionListener(this);
  playAgain.addActionListener(this);

  southPanel = new JPanel();
  southPanel.setBackground(Color.BLACK);
  southPanel.setLayout(new  GridLayout(0,3));
  southPanel.add(playAgain);
  southPanel.add(textField);
  southPanel.add(exitButton);
  add(southPanel, BorderLayout.SOUTH);

 }

 // Picks a word, latter it will be picked randomly.
 private String pickWord(){
  return wordList[0];
 }

 // This method check wither the input is valid
 // i.e. its in the alphabet.
 private boolean checkInput(String s){
  String [] alphabet = {"a","b","c","d","e","f",
    "g","h","i","j","k","l","m","n","o","p",
    "q","r","s","t","u","v","w","x","y","z"};

  for (int i = 0; i < alphabet.length; i++){
   if (s.equals(alphabet[i]) && s.length() <= 1){
    return true;
   }
  }
  return false;
 }

 /**
  * 
  */
 public void Play(){


  if (numLives > 0){

   if (userInput.length() == 1 && usedLetters.contains(userInput) == false &&
     checkInput(userInput) == true){
    usedLetters.add(userInput);

    if (theWord.contains(userInput) == true){
     correctLetters.add(userInput);
     centerPanel.removeAll();

     line = new LinePanel(20,theWord,correctLetters);
     centerPanel.add(line);
     centerPanel.revalidate();
    }

    else{
     numLives = numLives - 1;

     centerPanel.removeAll();
     line = new LinePanel(numLives,theWord,correctLetters);

     centerPanel.add(line);
     centerPanel.revalidate();
    }
   }

   else if (userInput.length() > 1)
    System.out.println("Enter a valid letter");

   else if (userInput.length() == 1 && checkInput(userInput) == true && theWord.contains(userInput)){
    correctLetters.add(userInput);
   }

   centerPanel.removeAll();

   line = new LinePanel(20,theWord,usedLetters);
   centerPanel.add(line);
   centerPanel.revalidate();
  }  
}
 // return true if the word and the correctly used letters list match
 public boolean checkWord(String s, ArrayList<String> t){
  String temp = "";

  for (int i = 0; i < s.length(); i++){
   if ( t.contains(s.substring(i, i+1)) == true){
    temp += s.substring(i, i+1);
   }
  }

  if (s.equals(temp)){
   return true;
  }

  return false;
 }

 public void actionPerformed(ActionEvent evt) {
  String temp = textField.getText();
  if (temp.length() == 1){
   userInput = temp;
  }
  textField.selectAll();
  if (checkWord(theWord, correctLetters) != true){
   Play();
  }

  if (evt.getSource() == exitButton){
   System.exit(0);
  }

//  if (evt.getSource() == playAgain){
//   removeAll();
//   repaint();
//   
//  }

 }


}

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class LinePanel extends JPanel {

 int x = 5;
 String theWord = "";
 ArrayList<String> letterList;

 public LinePanel(int num, String t, ArrayList<String> s) {
  super(); // 300,350
  setPreferredSize(new Dimension(400,400));
  setBackground(Color.RED);
  this.x = num;
  this.theWord = t;
  letterList = cloneList(s);
 }

 private ArrayList<String> cloneList(ArrayList<String> aList) {
  ArrayList<String> clonedList = new ArrayList<String>(aList.size());
  for (String letter : aList) 
   clonedList.add(letter);
  return clonedList;
 }



 public int getX() {
  return x;
 }

 public void setX(int x) {
  this.x = x;
 }

 public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  if (x == 15 || x != 15){
   Line2D line = new Line2D.Double(0, 250, 80, 250); // Creates base
   Line2D line2 = new Line2D.Double(40, 50, 40, 250); // Creates vertical line
   Line2D line3 = new Line2D.Double(40, 50, 150, 50); // Creates horizontal line
   Line2D line4 = new Line2D.Double(150, 50, 150, 80); // Creates small line to hang the man
   g2.setStroke(new BasicStroke(5.0f)); // Line thickness
   g2.setColor(Color.BLACK); // Line colour

   //draw shape of line
   g2.draw(line);
   g2.draw(line2);
   g2.draw(line3);
   g2.draw(line4);

   int x1 = 0; int y = 320;
   for (int i = 0; i < theWord.length();i++){
    g2.drawLine(x1, y, x1 + 20, y);
    x1 += 50;
   }
  }

  // head
  if (x == 5 || x < 5){
   System.out.println("uheuheuha");
   g2.setStroke(new BasicStroke(5.0f));
   g2.drawOval(135, 85, 35, 35);
  }

  // body
  if (x == 4 || x < 4){
   g2.drawLine(150, 120, 150, 190);
  }

  // left arm
  if (x == 3 || x < 3){
   g2.drawLine(150, 140, 125, 155); 
  }

  // right arm
  if (x == 2 || x < 2){
   g2.drawLine(150, 140, 175, 155); 
  }

  // left leg and foot
  if (x == 1 || x < 1){
   g2.drawLine(150, 190, 125, 200); // leg
   g2.drawLine(125, 200, 120, 190); // foot
  }

  // right leg and foot
  if (x == 0){
   g2.drawLine(150, 190, 175, 200); // leg
   g2.drawLine(175, 200, 180, 190); // foot
  }

  // Show whole word on screen
  if (x == 20){

   int x1 = 3; int y = 317;

   String temp = "";

   for (int i = 0; i < theWord.length(); i++){
    if ( letterList.contains(theWord.substring(i, i+1)) == true){
     temp += theWord.substring(i, i+1);
    }
    else{
     temp += " ";
    }
   }

   for (int i = 0; i < temp.length() ;i++){
    g2.setColor(Color.BLACK);
    Font font = new Font("Arial", Font.PLAIN, 25);
    g2.setFont(font);
    g2.drawString(temp.substring(i, i+1), x1, y);
    x1 += 50;
   }


   x1 = 3;  y = 370;
   for (int i = 0; i < letterList.size() ;i++){

    if (theWord.contains(letterList.get(i)) == false){
     g2.drawString(letterList.get(i), x1, y );
     x1 += 50;
    }

   }


  }
 }
}

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class LinePanel extends JPanel {

 int x = 5;
 String theWord = "";
 ArrayList<String> letterList;

 public LinePanel(int num, String t, ArrayList<String> s) {
  super(); // 300,350
  setPreferredSize(new Dimension(400,400));
  setBackground(Color.RED);
  this.x = num;
  this.theWord = t;
  letterList = cloneList(s);
 }

 private ArrayList<String> cloneList(ArrayList<String> aList) {
  ArrayList<String> clonedList = new ArrayList<String>(aList.size());
  for (String letter : aList) 
   clonedList.add(letter);
  return clonedList;
 }



 public int getX() {
  return x;
 }

 public void setX(int x) {
  this.x = x;
 }

 public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  if (x == 15 || x != 15){
   Line2D line = new Line2D.Double(0, 250, 80, 250); // Creates base
   Line2D line2 = new Line2D.Double(40, 50, 40, 250); // Creates vertical line
   Line2D line3 = new Line2D.Double(40, 50, 150, 50); // Creates horizontal line
   Line2D line4 = new Line2D.Double(150, 50, 150, 80); // Creates small line to hang the man
   g2.setStroke(new BasicStroke(5.0f)); // Line thickness
   g2.setColor(Color.BLACK); // Line colour

   //draw shape of line
   g2.draw(line);
   g2.draw(line2);
   g2.draw(line3);
   g2.draw(line4);

   int x1 = 0; int y = 320;
   for (int i = 0; i < theWord.length();i++){
    g2.drawLine(x1, y, x1 + 20, y);
    x1 += 50;
   }
  }

  // head
  if (x == 5 || x < 5){
   g2.setStroke(new BasicStroke(5.0f));
   g2.drawOval(135, 85, 35, 35);
  }

  // body
  if (x == 4 || x < 4){
   g2.drawLine(150, 120, 150, 190);
  }

  // left arm
  if (x == 3 || x < 3){
   g2.drawLine(150, 140, 125, 155); 
  }

  // right arm
  if (x == 2 || x < 2){
   g2.drawLine(150, 140, 175, 155); 
  }

  // left leg and foot
  if (x == 1 || x < 1){
   g2.drawLine(150, 190, 125, 200); // leg
   g2.drawLine(125, 200, 120, 190); // foot
  }

  // right leg and foot
  if (x == 0){
   g2.drawLine(150, 190, 175, 200); // leg
   g2.drawLine(175, 200, 180, 190); // foot
  }

  // Show whole word on screen
  if (x == 20){

   int x1 = 3; int y = 317;

   String temp = "";

   for (int i = 0; i < theWord.length(); i++){
    if ( letterList.contains(theWord.substring(i, i+1)) == true){
     temp += theWord.substring(i, i+1);
    }
    else{
     temp += " ";
    }
   }

   for (int i = 0; i < temp.length() ;i++){
    g2.setColor(Color.BLACK);
    Font font = new Font("Arial", Font.PLAIN, 25);
    g2.setFont(font);
    g2.drawString(temp.substring(i, i+1), x1, y);
    x1 += 50;
   }


   x1 = 3;  y = 370;
   for (int i = 0; i < letterList.size() ;i++){

    if (theWord.contains(letterList.get(i)) == false){
     g2.drawString(letterList.get(i), x1, y );
     x1 += 50;
    }

   }


  }
 }
}

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

import javax.swing.JButton;


public class PlayHangman {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  HangmanJFrame window = new HangmanJFrame();
  window.setVisible(true);

 }
}

2 个答案:

答案 0 :(得分:4)

请勿移除并添加面板。只需更改存储生命的变量并强制重新绘制。

答案 1 :(得分:1)

虽然我无法使用您的代码进行测试,但我有两个模糊的想法:

  1. 请记住,swing和/或awt组件的更新应始终在正确的线程中执行。考虑使用invokeLater进行一些测试:

    SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // do your display modifications here
                }
    });
    
  2. 您可以尝试在面板上使用invalidate / validate,这可能有助于Java意识到某些事情发生了变化。

  3. 我希望这有助于解决您的问题 - 祝您好运!