2010-05-22 58 views
0

我仍然在努力創造這個遊戲:Choosing design method for ladder-like word game。我已經使它幾乎工作,但有一個問題,雖然。當我插入一個單詞並且它是正確的時,整個窗口應該重新加載,並且包含字母的JButtons應該以不同的樣式重新繪製。但不知何故遊戲面板的repaint()方法(在Main方法中)完全不會影響它。我究竟做錯了什麼 ?這裏是我的代碼:使用repaint()方法

主營:

import java.util.Scanner; 
import javax.swing.*; 
import java.awt.*; 

public class Main { 
    public static void main(String[] args){ 
     final JFrame f = new JFrame("Ladder Game"); 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Creating game data..."); 
     System.out.println("Height: "); 

//setting height of the grid 
     while (!sc.hasNextInt()) { 
      System.out.println("int, please!"); 
      sc.next(); 
     } 
     final int height = sc.nextInt(); 
/* 
* I'm creating Grid[]game. Each row of game contains Grid of Element[]line. 
* Each row of line contains Elements, which are single letters in the game. 
*/ 
     Grid[]game = new Grid[height]; 
     for(int L = 0; L < height; L++){ 
      Grid row = null; 
      int i = L+1; 
      String s; 

      do { 
       System.out.println("Length "+i+", please!"); 
       s = sc.next(); 
      } while (s.length() != i); 

      Element[] line = new Element[s.length()]; 
      Element single = null; 
      String[] temp = null; 
      String[] temp2 = new String[s.length()]; 

      temp = s.split(""); 
      for(int j = temp2.length; j>0; j--){ 
       temp2[j-1] = temp[j]; 
      } 

      for (int k = 0 ; k < temp2.length ; k++) { 
       if(k == 0){ 
        single = new Element(temp2[k], 2); 
       } 
       else{ 
        single = new Element(temp2[k], 1); 
       } 
       line[k] = single; 
      } 

      row = new Grid(line); 
      game[L] = row; 
     } 

//############################################ 
//THE GAME STARTS HERE 
//############################################ 

//create new game panel with box layout 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     panel.setBackground(Color.ORANGE); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

//for each row of the game array add panel containing letters Single panel 
//is drawn with Grid's paint() method and then returned here to be added 
     for(int i = 0; i < game.length; i++){ 
      panel.add(game[i].paint()); 
     } 

     f.setContentPane(panel); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 

     boolean end = false; 
     boolean word = false; 
     String text; 
/* 
* Game continues until solved() returns true. First check if given word matches the length, 
* and then the value of any row. If yes - change state of each letter from EMPTY 
* to OTHER_LETTER. Then repaint the window. 
*/ 
     while(!end){ 
      while(!word){ 
       text = JOptionPane.showInputDialog("Input word: "); 
       for(int i = 1; i< game.length; i++){ 
        if(game[i].equalLength(text)){ 
         if(game[i].equalValue(text)){ 
          game[i].changeState(3); 
          f.repaint(); 

          //simple debug - I'm checking if letter, and 
          //state values for each Element are proper 
          for(int k=0; k<=i; k++){ 
           System.out.print(game[k].e[k].letter()); 
          } 
          System.out.println(); 
          for(int k=0; k<=i; k++){ 
           System.out.print(game[k].e[k].getState()); 
          } 
          System.out.println(); 
          //set word to true and ask for another word 
          word = true; 
         } 
        } 
       } 
      } 
      word = false; 
      //check if the game has ended 
      for(int i = 0; i < game.length; i++){ 
       if(game[i].solved()){ 
        end = true; 
       } 
       else { 
        end = false; 
       } 
      } 
     } 
    } 
} 

元素:

import javax.swing.*; 
import java.awt.*; 

public class Element { 
    final int INVISIBLE = 0; 
    final int EMPTY = 1; 
    final int FIRST_LETTER = 2; 
    final int OTHER_LETTER = 3; 
    private int state; 
    private String letter; 

    public Element(){  
    } 
//empty block  
    public Element(int state){ 
     this("", 0); 
    } 
//filled block 
    public Element(String s, int state){ 
     this.state = state; 
     this.letter = s; 
    } 

    public JButton paint(){ 
     JButton button = null; 

     if(state == EMPTY){ 
      button = new JButton(" "); 
      button.setBackground(Color.WHITE); 
     } 
     else if (state == FIRST_LETTER){ 
      button = new JButton(letter); 
      button.setBackground(Color.red); 
     } 
     else { 
      button = new JButton(letter); 
      button.setBackground(Color.yellow); 
     } 
     return button; 
    } 

    public void changeState(int s){ 
     state = s; 
    } 
    public void setLetter(String s){ 
     letter = s; 
    } 
    public String letter(){ 
     return letter; 
    } 
    public int getState(){ 
     return state; 
    } 
} 

網:

import javax.swing.*; 
import java.awt.*; 

public class Grid extends JPanel{ 
    public Element[]e; 
    private Grid[]g; 

    public Grid(){} 

    public Grid(Element[]elements){ 
     e = new Element[elements.length]; 

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

    public Grid(Grid[]grid){ 

     g = new Grid[grid.length]; 
     for(int i=0; i<g.length; i++){ 
      g[i] = grid[i]; 
     } 

     Dimension d = new Dimension(600, 600); 
     setMinimumSize(d); 
     setPreferredSize(new Dimension(d)); 
     setMaximumSize(d); 
    } 

//for Each element in line - change state to i 
    public void changeState(int i){ 
     for(int j=0; j< e.length; j++){ 
      e[j].changeState(3); 
     } 
    } 

//create panel which will be single row of the game. Add elements to the panel. 
// return JPanel to be added to grid. 
    public JPanel paint(){ 
     JPanel panel = new JPanel(); 

     panel.setLayout(new GridLayout(1, e.length)); 
     panel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 

     for(int j = 0; j < e.length; j++){ 
      panel.add(e[j].paint()); 
     } 
     return panel; 
    } 

//check if the length of given string is equal to length of row 
    public boolean equalLength(String s){ 
     int len = s.length(); 
     boolean equal = false; 

     for(int j = 0; j < e.length; j++){ 
      if(e.length == len){ 
       equal = true; 
      }   
     } 
     return equal; 
    } 

//check if the value of given string is equal to values of elements in row 
    public boolean equalValue(String s){ 
     int len = s.length(); 
     boolean equal = false; 
     String[] temp = null; 
     String[] temp2 = new String[len]; 

     temp = s.split(""); 
     for(int j = len; j>0; j--){ 
      temp2[j-1] = temp[j]; 
     } 
      for(int j = 0; j < e.length; j++){ 
       if(e[j].letter().equals(temp2[j])){ 
        equal = true; 
       } 
       else { 
        equal = false; 
       } 
      } 
      if(equal){ 
       for(int i = 0; i < e.length; i++){ 
        e[i].changeState(3); 
       } 
      } 
     return equal; 
    } 

//check if the game has finished 
    public boolean solved(){ 
     boolean solved = false; 

     for(int j = 0; j < e.length; j++){ 
      if(e[j].getState() == 3){ 
       solved = true; 
      } 
      else { 
       solved = false; 
      } 
     } 
     return solved; 
    } 
} 

回答

0

由我自己難道它:

import java.util.Scanner; 
import javax.swing.*; 
import java.awt.*; 
import javax.swing.border.Border; 

public class Main { 
    public static void main(String[] args){ 

     final JFrame f = new JFrame("Ladder Game"); 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Creating game data..."); 
     System.out.println("Height: "); 

     while (!sc.hasNextInt()) { 
      System.out.println("int, please!"); 
      sc.next(); 
     } 
     final int height = sc.nextInt(); 

     Grid[]game = new Grid[height]; 
     for(int L = 0; L < height; L++){ 
      Grid row = null; 
      int i = L+1; 
      String s; 

      do { 
       System.out.println("Length "+i+", please!"); 
       s = sc.next(); 
      } while (s.length() != i); 

      Element[] line = new Element[s.length()]; 
      Element single = null; 
      String[] temp = null; 
      String[] temp2 = new String[s.length()]; 

      temp = s.split(""); 
      for(int j = temp2.length; j>0; j--){ 
       temp2[j-1] = temp[j]; 
      } 

      for (int k = 0 ; k < temp2.length ; k++) { 
       if(k == 0){ 
        single = new Element(temp2[k], 2); 
       } 
       else{ 
        single = new Element(temp2[k], 1); 
       } 
       line[k] = single; 
      } 

      row = new Grid(line); 
      game[L] = row; 
     } 

//############################################ 
//THE GAME STARTS HERE 
//############################################ 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     panel.setBackground(Color.ORANGE); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

     for(int i = 0; i < game.length; i++){ 
      panel.add(game[i].create(height)); 
     } 

     f.setContentPane(panel); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 

     boolean end = false; 
     boolean word = false; 
     String text; 

     while(!end){ 
      while(!word){ 
       text = JOptionPane.showInputDialog("Input word: "); 
       for(int i = 1; i< game.length; i++){ 
        if(game[i].equalLength(text)){ 
         if(game[i].equalValue(text)){ 
          word = true; 
          game[i].changeState(3); 
          f.repaint(); 
          System.out.println("Word correct !"); 
         } 
        } 
       } 
      } 
      word = false; 

      for(int i = 0; i < game.length; i++){ 
       if(game[i].solved()){ 
        end = true; 
       } 
       else { 
        end = false; 
        break; 
       } 
      } 
     } 
    } 
} 


class Grid extends JPanel{ 
    private Element[]e; 
    private Grid[]g; 

    public Grid(){} 

    public Grid(Element[]elements){ 
     e = new Element[elements.length]; 

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

    public Grid(Grid[]grid){ 

     g = new Grid[grid.length]; 
     for(int i=0; i<g.length; i++){ 
      g[i] = grid[i]; 
     } 

     Dimension d = new Dimension(600, 600); 
     setMinimumSize(d); 
     setPreferredSize(new Dimension(d)); 
     setMaximumSize(d); 
    } 
    public void changeState(int i){ 
     for(int j=1; j< e.length; j++){ 
      e[j].changeState(3); 
     } 
    } 

    public JPanel create(int height){ 
     JPanel panel = new JPanel(); 

     panel.setLayout(new GridLayout(1, height)); 
     Border border = BorderFactory.createMatteBorder(2, 2, 2, 2, Color.ORANGE); 
     panel.setBorder(border); 

     for(int j = 0; j < e.length; j++){ 
      panel.add(e[j].paint()); 
     } 
     for (int j=0; j < height - e.length ; j++) 
     { 
      JPanel hiddenPanel = new JPanel(); 
      hiddenPanel.setBackground(Color.ORANGE); 
      panel.add(hiddenPanel); 
     } 
     return panel; 
    } 

    public boolean equalLength(String s){ 
     int len = s.length(); 
     boolean equal = false; 

     for(int j = 0; j < e.length; j++){ 
      if(e.length == len){ 
       equal = true; 
      }   
     } 
     return equal; 
    } 

    public boolean equalValue(String s){ 
     int len = s.length(); 
     boolean equal = false; 
     String[] temp = null; 
     String[] temp2 = new String[len]; 

     temp = s.split(""); 
     for(int j = len; j>0; j--){ 
      temp2[j-1] = temp[j]; 
     } 
      for(int j = 0; j < e.length; j++){ 
       if(e[j].letter().equals(temp2[j])){ 
        equal = true; 
       } 
       else { 
        equal = false; 
        break; 
       } 
      } 
      if(equal){ 
       for(int i = 1; i < e.length; i++){ 
        e[i].changeState(3); 
       } 
      } 
     return equal; 
    } 

    public boolean solved(){ 
     boolean solved = false; 

     if(e.length == 1) 
     { 
      solved = true; 
     } 
     else 
     { 
      for(int j = 0; j < e.length; j++){ 
      if(e[j].getState() == 3){ 
        solved = true; 
      } 
       else { 
        solved = false; 
       } 
      } 
     }   
     return solved; 
    } 
} 

class Element { 

    final int INVISIBLE = 0; 
    final int EMPTY = 1; 
    final int FIRST_LETTER = 2; 
    final int OTHER_LETTER = 3; 

    private int state; 
    private String letter; 
    private JButton button; 

    public Element(){  
    } 

//empty block  
    public Element(int state){ 
     this("", 0); 
    } 

//filled block 
    public Element(String s, int state){ 
     this.state = state; 
     this.letter = s; 
    } 

    public JButton paint(){ 
     this.button = new JButton(); 

     changeState(); 
     button.setSize(20,20); 

     return button; 
    } 

    public void changeState(int s){ 
     state = s; 
     changeState(); 
    } 

    private void changeState() 
    { 
     if(state == EMPTY){ 
      button.setText(" "); 
      button.setBackground(Color.WHITE); 
     } 
     else if (state == FIRST_LETTER){ 
      button.setText(letter); 
      button.setBackground(Color.red); 
     } 
     else { 
      button.setText(letter); 
      button.setBackground(Color.yellow); 
     } 
    } 

    public void setLetter(String s){ 
     letter = s; 
    } 

    public String letter(){ 
     return letter; 
    } 

    public int getState(){ 
     return state; 
    } 
} 
相關問題