2014-01-19 3 views
-1

Я пытаюсь создать GUI Java-код Connect Four, однако ни один из моих игровых кругов Совета не появляется. Я нарисовал их на доске, но они просто не появляются. Я не понимаю, что я делаю неправильно. Пожалуйста, помогите и см. Пересмотренный код:Почему мой совет не появляется при создании соединения четыре?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.*; 
import java.io.*; 
//how do I get the board to actually appear? 


public class JenniferConnectFourJan19 { 

    static int [][] boardArray = new int [6][7]; 
    static String [][] spotOnBoard = new String [6][7]; 
    static int maxRow=6; 
    static int maxCol=7; 
    static boolean endOfGame = false; 
    static boolean gameStart; 

    static JPanel boardPanel; 

    static JButton firstOption = new JButton ("Drop"); 
    static JButton secondOption = new JButton ("Drop"); 
    static JButton thirdOption = new JButton ("Drop"); 
    static JButton fourthOption = new JButton ("Drop"); 
    static JButton fifthOption = new JButton ("Drop"); 
    static JButton sixthOption = new JButton ("Drop"); 
    static JButton seventhOption = new JButton ("Drop"); 

    static JButton playAgain = new JButton ("New"); 
    static JButton reset = new JButton ("Reset"); 
    static JButton exit = new JButton ("Exit"); 

    static int blank =0; 
    static int red=1; 
    static int yellow=2; 
    static int firstColour= red; 

    public static void board() { 
    boardArray = new int [maxRow][maxCol]; 
    for (int row=0; row < maxRow; row++){ 
     for (int col=0; col< maxCol; col++){ 
     boardArray[row][col]= blank; 
     } 
    } 
    } 


    public static class drawBoard extends JPanel { 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
//  drawBoard(g, drawBoard); 
    }//end of paintComponent. 

    void drawConnectFourBoard(Graphics g){  

    g.setColor(Color.BLUE); 
    g.fillRect(110, 50, 100+100*maxCol, 100+100*maxRow); 
    for (int row=0; row<maxRow; row++) 
     for (int col=0; col<maxCol; col++) { 
     if (boardArray[row][col]==blank) g.setColor(Color.white); 
     if (boardArray[row][col]==red) g.setColor(Color.red); 
     if (boardArray[row][col]==yellow) g.setColor(Color.yellow); 
     g.fillOval(160+100*col, 100+100*row, 100, 100); 
    } 
    } 
    public Dimension getPreferredSize() { 
    return new Dimension(300,300); 
    } 
    } 

    public static boolean winCheck(String box) { 
    for(int j = 0; j < 6; j++) { 
     for (int k = 0; k < 7; k++) { 
     if(spotOnBoard[j][k].equals(box)) {   
      if(((j -3) >= 0) && spotOnBoard[j -1][k].equals(box) && spotOnBoard[j -2][k].equals(box) && spotOnBoard[j -3][k].equals(box)) { 
      return true; 
      }   
      else if(((k -3) >= 0) && spotOnBoard[j][k -1].equals(box) && spotOnBoard[j][k -2].equals(box) && spotOnBoard[j][k -3].equals(box)) { 
      return true; 
      }   
      else if(((j+3)<= 5) && spotOnBoard[j+1][k].equals(box) && spotOnBoard[j+2][k].equals(box) && spotOnBoard[j+3][k].equals(box)){ 
      return true; 
      }   
      else if(((k +3) <= 6) && spotOnBoard[j][k +1].equals(box) && spotOnBoard[j][k +2].equals(box) && spotOnBoard[j][k +3].equals(box)) {   
      return true; 
      }   
      else if(((j -3)>= 0) && ((k +3)<=6) && spotOnBoard[j-1][k+1].equals(box) && spotOnBoard[j-2][k+2].equals(box) && spotOnBoard[j-3][k+3].equals(box)){ 
      return true; 
      }   
      else if(((j +3) <=5) && ((k -3) >=0) && spotOnBoard[j +1][k -1].equals(box) && spotOnBoard[j +2][k -2].equals(box) && spotOnBoard[j +3][k -3].equals(box)){ 
      return true; 
      }   
      else if(((j -3)>=0) && ((k -3)>= 0) && spotOnBoard[j -1][k -1].equals(box) && spotOnBoard[j -2][k -2].equals(box) && spotOnBoard[j -3][k -3].equals(box)){ 
      return true; 
      }   
      else if(((j +3) <=5) && ((k +3) <=6) && spotOnBoard[j +1][k +1].equals(box) && spotOnBoard[j +2][k +2].equals(box) && spotOnBoard[j +3][k +3].equals(box)){ 
      return true; 
      } 
      else 
      return false; 
     } 
     } 
    } 
    return false; 
    } 

    public static void displayWinner(Graphics g, int n) { 
    g.setColor(Color.BLACK); 
    g.setFont(new Font("Courier", Font.BOLD, 100)); 
    if (n==red) 
     g.drawString("Red wins!", 100, 400); 
    else 
     g.drawString("Yellow wins!", 100, 400); 
    endOfGame=true; 
    } 

    public static void main (String [] args) { 
    drawBoard drawConnectFourBoard = new drawBoard(); 
    board(); 

    ButtonHandler listen = new ButtonHandler(); 

    firstOption.addActionListener(listen); 
    secondOption.addActionListener(listen); 
    thirdOption.addActionListener(listen); 
    fourthOption.addActionListener(listen); 
    fifthOption.addActionListener(listen); 
    sixthOption.addActionListener(listen); 
    seventhOption.addActionListener(listen); 
    playAgain.addActionListener(listen); 
    reset.addActionListener(listen); 
    exit.addActionListener(listen); 

    // JPanel boardPanel = new JPanel(); 


    JPanel topPanel = new JPanel(); 
    topPanel.setLayout(new GridLayout(1,7)); 
    topPanel.setBackground(new Color(0,0,0)); 
    topPanel.add(firstOption); 
    topPanel.add(secondOption); 
    topPanel.add(thirdOption); 
    topPanel.add(fourthOption); 
    topPanel.add(fifthOption); 
    topPanel.add(sixthOption); 
    topPanel.add(seventhOption); 


    JPanel bottomPanel = new JPanel(); 
    bottomPanel.setLayout(new GridLayout(1,4)); 
    bottomPanel.add(playAgain); 
    bottomPanel.add(reset); 
    bottomPanel.add(exit); 


    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BorderLayout()); 
    mainPanel.setBackground(new Color(0,214,154)); 
    mainPanel.add(topPanel, BorderLayout.NORTH); 
    mainPanel.add(drawConnectFourBoard); 
    board(); 
    mainPanel.add(bottomPanel, BorderLayout.SOUTH); 

    JFrame window = new JFrame ("Connect4"); 
    window.setContentPane(mainPanel); 
    window.setSize(500,500); 
    window.setLocation(500,100); 
    window.setResizable(true); 
    window.setVisible(true); 
    } 

    private static class ButtonHandler implements ActionListener { 
    public void actionPerformed(ActionEvent a) { 
     if (a.getSource()== firstOption) 
     dropCircle(1); 
     else if (a.getSource()== secondOption) 
     dropCircle(2); 
     else if (a.getSource()== thirdOption) 
     dropCircle(3); 
     else if (a.getSource()== fourthOption) 
     dropCircle(4); 
     else if (a.getSource()== fifthOption) 
     dropCircle(5); 
     else if (a.getSource()== sixthOption) 
     dropCircle(6); 
     else if (a.getSource()==seventhOption) 
     dropCircle(7); 

    if (a.getSource() == playAgain) { 
     gameStart=true; 
    } 
    if (a.getSource() == exit) { 
     System.exit(0); 
    } 
    } 
    public void dropCircle(int n) { 
     if (endOfGame) return; 
     gameStart=true; 
     int row; 
     n--; 
     for (row=0; row<maxRow; row++) 
     if (boardArray[row][n]>0) break; 
     if (row>0) { 
     boardArray[--row][n]=firstColour; 
     if (firstColour==red) 
      firstColour=yellow; 
     else 
      firstColour=red; 

     } 
    } 

    } 
} 
+2

Пожалуйста, не публикуйте всю вашу программу и заставляйте нас прокручивать тонны кода, не относящиеся к вашей проблеме, но вместо этого создайте и опубликуйте небольшую, минимальную, по сути, тестируемую программу, [mcve] (http: // stackoverflow.com/help/mcve). Пожалуйста, нажмите на ссылку, чтобы узнать, что вы хотите опубликовать. –

+0

Я разместил все это, потому что без него ничего не скомпилировалось должным образом. – Jvennifer

+0

Все, что вы пытаетесь сделать, это отображать изображения в графическом интерфейсе, верно? Как только вы выясните, как это сделать, вы можете применить его к своей полной программе. Итак, создайте небольшую программу, которая пытается сделать именно это, скажем, пытается создать ImageIcon и отображать его в JOptionPane **. Эта небольшая программа должна состоять не более чем на 20 строк и должна компилироваться и запускаться. –

ответ

2

У вас есть каскад проблем, которые нелегко решить.

Во-первых, использование вами static не работает в вашу пользу, на самом деле это признак плохой конструкции.

Вы можете исправить это, создав пользовательский компонент, простирающийся от чего-то вроде JPanel и используя это как основу для остальной части вашего приложения, создавая дополнительные пользовательские компоненты по мере необходимости или просто используя простые контейнеры, например JPanel, для создания более сложных пользовательских интерфейсов

Во-вторых, это похоже на проблему с ресурсами. Вообще говоря, у вас есть два типа ресурсов, которые вы можете использовать, внешнее и внутреннее (AKA встроено).

ImageIcon(String) ищет внешний ресурс на вашем диске (то есть File). Основываясь на ваших загадочных комментариях, я бы предположил, что изображения фактически внедрены в контексте вашего приложения, что делает невозможным поиск ImageIcon(String).

Вместо этого, вы должны попробовать использовать ImageIcon(URL), например new ImageIcon(getClass().getResource("/path/to/image/image.png")

Проблема с ImageIcon он не будет бросать Exception, когда он не может найти или загрузить изображение, иногда просто не картина ничего.

Вместо этого вы должны использовать ImageIO.read. Посмотрите на Reading/Loading images для получения более подробной информации

Дополнительные

  • Там нет ничего в paintComponent, что на самом деле рисует что-нибудь
  • Там нет никакого способа для вашего ActionListener уведомить кого-либо, что ваша модель игры обновила

Отделите логику игры и логику пользовательского интерфейса, чтобы «модель» была чисто ответственной за управление виртуальной ст. а также известить заинтересованные стороны о том, что модель изменилась и что часть пользовательского интерфейса просто отвечает за визуализацию модели представления.

Затем позвольте элементам управления изменять состояние модели.

+0

Хорошо, я исправил его, и он все еще не отображается. – Jvennifer

+1

Исправлено что? Вы уверены, что изображения загружаются? – MadProgrammer

Смежные вопросы