Несколько проблем от новичка - PullRequest
1 голос
/ 09 декабря 2011
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CSE141HW5 implements ActionListener
{

    public static void main (String[] args)
    {
        new CSE141HW5();

    }


    /*  Instance Variables */

    private JFrame gameWindow = new JFrame ("Tic-Tac-Toe");
    private int [][] winningCombinations = new int[][] {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
    private JButton buttons[] = new JButton [9];
    private int count = 0;
    private String mark = "";
    private boolean win = false;

    public CSE141HW5()
    {

        /* Creating gameWindow */

        Container con = gameWindow.getContentPane();
        con.setBackground(Color.WHITE);

        gameWindow.setVisible (true);
        gameWindow.setSize (220,220);
        gameWindow.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        gameWindow.setLayout (new GridLayout (3, 3));
        gameWindow.setLocation (830, 400);
        gameWindow.setBackground(Color.WHITE);



        /* Adding Buttons */

        for (int i = 0; i <= 8; i++)
        {
            buttons[i] = new JButton ();
            gameWindow.add (buttons [i]);
            buttons[i].addActionListener (this);
            buttons[i].setBackground(Color.WHITE);

        }    


    }


    /* When an object clicked... */

    public void actionPerformed (ActionEvent click)
    {
        JButton pressedButton = (JButton)click.getSource();
        /* Whose turn? */

        if ((count % 2) == 0)
        {
            mark = "O";
            pressedButton.setBackground(Color.CYAN);
        }
        else
        {
            mark = "X";
            pressedButton.setBackground(Color.yellow);
        }


        /* Write the letter to the button and deactivate it */


        pressedButton.setText (mark);
        pressedButton.setEnabled (false);


        /* Determining that who won */

        for (int i = 0; i <= 7; i++)
        {
            if (buttons[winningCombinations[i][0]].getText().equals(buttons[winningCombinations[i][1]].getText()) 
                && buttons[winningCombinations[i][1]].getText().equals(buttons[winningCombinations[i][2]].getText()) 
                    && buttons[winningCombinations[i][0]].getText() != "") win = true;
        }


        /* Ending Dialog */

        if (win == true)
        {
            byte response = (byte) (JOptionPane.showConfirmDialog(null, mark + " won!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE));
            if (response == 0) new CSE141HW5();
            else System.exit(0);
        }

        else if (count == 8  &&  win == false)
        {
            byte response = (byte) (JOptionPane.showConfirmDialog(null, "Draw!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE));
            if (response == 0) new CSE141HW5();
            else System.exit(0);
        }

        count++;             
    }

}  

Я новичок в программировании, и я написал игру в крестики-нолики на Java. Я хочу улучшить эту программу, но есть вещи, с которыми я не справился.

  1. Я изменил цвета кнопок с цветами по умолчанию, такими как Color.yellow и т. Д. Как я могу использовать более подробный цвет?

  2. Когда игра заканчивается, программа запрашивает повторную игру. Если пользователь выбирает Да, то появляется новое окно игры, но старое окно все еще остается, что мне не понравилось. Я хочу, чтобы старые окна были закрыты, но не смог найти, как это реализовать.

  3. Если вы обнаружите в моей программе какой-либо код, который, по вашему мнению, не нужен, или если вы считаете, что есть лучший способ, чем я, пожалуйста, сообщите мне. Так что я могу учиться.

Ответы [ 3 ]

1 голос
/ 30 июня 2013

Если вы хотите полностью удалить окно, используйте функцию dispose ().

1 голос
/ 05 июля 2015

Я изменил цвета кнопок с цветами по умолчанию, такими как Color.yellow и т. Д. Как я могу использовать более подробный цвет?

Вы можете использовать свою собственную кнопку, скажем, public class XButton extends JButton. Чтобы лучше настроить ваши кнопки переопределить метод public void paintComponent(Graphics g). Затем вы можете использовать fillRect для заливки прямоугольника кнопки стандартным цветом ИЛИ приведите ваш объект Graphics g к Graphics2D и затем установить объект GradientPaint(), который заполняет форму линейным цветом градиент.

public class XButton extends JButton {

    public XButton() {
        super();
    }

    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D)g;         
        GradientPaint gp = new GradientPaint(0, 0, Color.RED, 30, 30, Color.cyan, true);                
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    }
}

Результат на следующем рисунке:

enter image description here

PS: при добавлении кнопок замените JButton на Xbutton, и все.


Когда игра заканчивается, программа запрашивает повторную игру. Если пользователь выбирает Да, то появляется новое окно игры, но старое окно все еще остается, что мне не понравилось. Я хочу, чтобы старые окна были закрыты, но не смог найти, как это реализовать.

Вы просто используете метод dispose() для объекта JFrame gameWindow, поэтому в вашем коде есть два места, куда вы должны поместить:

           if (response == 0){ 
                gameWindow.dispose();
                new CSE141HW5(); 
            }

Подробнее о Как программно закрыть JFrame .


Если вы обнаружите в моей программе какой-либо код, который, по вашему мнению, не нужен, или если вы считаете, что есть лучший способ, чем то, что я делаю, пожалуйста, сообщите мне. Так что я могу учиться.

Ну, твой код хорош. Если вы хотите улучшить это. StackOverflow не подходящее место для этого. Вам лучше проверить: codereview.stackexchange.com

Надеюсь, я ответил на ваши вопросы.

1 голос
/ 28 декабря 2011
  1. Используйте цвета RGB для раскраски.Это сочетание красного, зеленого и синего.Значения красного, зеленого и синего находятся в диапазоне от 0 до 255. Пример: для красного комбинация составляет (255,0,0).
  2. . Вы можете использовать gameWindow.setVisible (false);
...