0

我从一个类开始,该类包含为宾果游戏完成所有工作的所有方法和构造函数。然后有一个“测试器类”,它将通过使用 System.out.print 打印和更新宾果卡。现在我需要为宾果游戏添加一些图形。每次有更新时,我应该使用我的第一个类来支持一个新类来抽卡。

我能够使用与原始 2 不同的代码来完成宾果卡图形的第一次迭代:

import java.awt.Rectangle;
import javax.swing.JComponent;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Ellipse2D;

public class BingoComponent extends JComponent {
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;       
        Rectangle box = new Rectangle(28,105,80,80);
    for(int j = 0;j<5;j++){
        g2.draw(box);
        for(int i = 0;i<4;i++){
            box.translate(80,0);
            g2.draw(box);
        }
        box.translate(-320,80);
    }

    g2.setPaint(Color.BLUE);
    g2.setFont(new Font("Arial", Font.BOLD,44));
    g2.drawString("B",50,100);
    g2.drawString("I",140,100);
    g2.drawString("N",215,100);
    g2.drawString("G",290,100);
    g2.drawString("O",370,100);

    g2.setPaint(Color.RED);        
    Ellipse2D.Double ellipse = new Ellipse2D.Double(198,275,60,60);
    g2.draw(ellipse);
    g2.fill(ellipse);

    Bingo_Card test_card = new Bingo_Card();
    g2.setPaint(Color.BLACK);
    g2.setFont(new Font("Times", Font.PLAIN,24));
    int x_location = 60;
    int y_location = 150;
    int number_value;
    for(int j = 0;j<5;j++){
        number_value = test_card.get_number(j);
        g2.drawString(""+number_value,x_location,y_location);
        x_location += 80;
    }
    x_location = 60;
    y_location += 80;
    for(int j = 5;j<10;j++){
        number_value = test_card.get_number(j);
        g2.drawString(""+number_value,x_location,y_location);
        x_location += 80;
    }
    x_location = 60;
    y_location += 80;
    for(int j = 10;j<15;j++){
        number_value = test_card.get_number(j);
        if(number_value!=0){
        g2.drawString(""+number_value,x_location,y_location);
        }
        x_location += 80;
    }
    x_location = 60;
    y_location += 80;
    for(int j = 15;j<20;j++){
        number_value = test_card.get_number(j);
        g2.drawString(""+number_value,x_location,y_location);
        x_location += 80;
    }
    x_location = 60;
    y_location += 80;
    for(int j = 20;j<25;j++){
        number_value = test_card.get_number(j);
        g2.drawString(""+number_value,x_location,y_location);
        x_location += 80;
    }


}
}

我与这段代码一起使用:

public class makecard {
    public static void main(String args[]){          
        JFrame frame = new JFrame();

        frame.setSize(800,800);
        frame.setTitle("BINGO Card");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BingoComponent component = new BingoComponent();
        frame.add(component);

        frame.setVisible(true);

    }
}

但我不明白如何在我原来的两个代码中实现这一点。哪个是:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.awt.Graphics; 
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent; 
import java.awt.Color;
import java.awt.Font; 
import java.awt.geom.Ellipse2D;

public class Bingo_Card {

private ArrayList<Integer> bingo_card;
public boolean bingo = false;

public Bingo_Card(){
    /*ArrayList<Integer>*/ bingo_card = new ArrayList<>();
    ArrayList<Integer> columnBlist = new ArrayList<>();
    for(int i = 1;i<=15;i++){
        columnBlist.add(i);
    }
    Collections.shuffle(columnBlist);
    ArrayList<Integer> columnB = new ArrayList<>();
    for(int j = 0;j<5;j++){
        columnB.add(columnBlist.get(j));
    }

    ArrayList<Integer> columnIlist = new ArrayList<>();
    for(int i = 16;i<=30;i++){
        columnIlist.add(i);
    }
    Collections.shuffle(columnIlist);
    ArrayList<Integer> columnI = new ArrayList<>();
    for(int j = 0;j<5;j++){
        columnI.add(columnIlist.get(j));
    }

    List<Integer> columnNlist = new ArrayList<>();
    for(int i = 31;i<=45;i++){
        columnNlist.add(i);
    }
    Collections.shuffle(columnNlist);
    ArrayList<Integer> columnN = new ArrayList<>();
    for(int j = 0;j<4;j++){
        columnN.add(columnNlist.get(j));
    }
    columnN.add(2,0);



    List<Integer> columnGlist = new ArrayList<>();
    for(int i = 46;i<=60;i++){
        columnGlist.add(i);
    }
    Collections.shuffle(columnGlist);
    ArrayList<Integer> columnG = new ArrayList<>();
    for(int j = 0;j<5;j++){
        columnG.add(columnGlist.get(j));
    }

    List<Integer> columnOlist = new ArrayList<>();
    for(int i = 61;i<=75;i++){
        columnOlist.add(i);
    }
    Collections.shuffle(columnOlist);
    ArrayList<Integer> columnO = new ArrayList<>();
    for(int j = 0;j<5;j++){
        columnO.add(columnOlist.get(j));
    }

    for(int x=0;x<5;x++){
    bingo_card.add(columnB.get(x));
    bingo_card.add(columnI.get(x));
    bingo_card.add(columnN.get(x));
    bingo_card.add(columnG.get(x));
    bingo_card.add(columnO.get(x));
    }
}

public int get_number(int index){
    int number = bingo_card.get(index);
    return(number);
}

public void print_card(){
    System.out.println(" B  I  N  G  O ");
    System.out.println("----------------");
    for(int a = 0;a<5;a++){
        if(bingo_card.get(a)<10){
            System.out.print("|  "+bingo_card.get(a));
        }
        else{
            System.out.print("| "+bingo_card.get(a));
        }
    }
    System.out.println();
    System.out.println("----------------");
    for(int b = 5;b<10;b++){
        if(bingo_card.get(b)<10){
            System.out.print("|  "+bingo_card.get(b));
        }
        else{
            System.out.print("| "+bingo_card.get(b));
        }
    }
    System.out.println();
    System.out.println("----------------");
     for(int c = 10;c<15;c++){
        if(bingo_card.get(c)<10){
            System.out.print("|  "+bingo_card.get(c));
        }
        else{
            System.out.print("| "+bingo_card.get(c));
        }
     }
    System.out.println();
    System.out.println("----------------");
     for(int d = 15;d<20;d++){
        if(bingo_card.get(d)<10){
            System.out.print("|  "+bingo_card.get(d));
        }
        else{
            System.out.print("| "+bingo_card.get(d));
        }
     }
    System.out.println();
    System.out.println("----------------");
     for(int e = 20;e<25;e++){
        if(bingo_card.get(e)<10){
            System.out.print("|  "+bingo_card.get(e));
        }
        else{
            System.out.print("| "+bingo_card.get(e));
        }
     }
    System.out.println();
    System.out.println("----------------");          
    }

    public void check_match(int call_number){
       for(int i = 0; i<(bingo_card.size());i++){
           if(call_number == bingo_card.get(i)){
               bingo_card.set(i,0);
           }
       } 
    }

    public boolean check_bingo(){
        if(bingo_card.get(0)==0&bingo_card.get(1)==0&bingo_card.get(2)==0&bingo_card.get(3)==0&bingo_card.get(4)==0){
            bingo = true;
        }
        else if(bingo_card.get(5)==0&bingo_card.get(6)==0&bingo_card.get(7)==0&bingo_card.get(8)==0&bingo_card.get(9)==0){
            bingo = true;
        }
        else if(bingo_card.get(10)==0&bingo_card.get(11)==0&bingo_card.get(12)==0&bingo_card.get(13)==0&bingo_card.get(14)==0){
            bingo = true;
        }
        else if(bingo_card.get(15)==0&bingo_card.get(16)==0&bingo_card.get(17)==0&bingo_card.get(18)==0&bingo_card.get(19)==0){
            bingo = true;
        }
        else if(bingo_card.get(20)==0&bingo_card.get(21)==0&bingo_card.get(22)==0&bingo_card.get(23)==0&bingo_card.get(24)==0){
            bingo = true;
        }
        else if(bingo_card.get(0)==0&bingo_card.get(5)==0&bingo_card.get(10)==0&bingo_card.get(15)==0&bingo_card.get(20)==0){
            bingo = true;
        }
        else if(bingo_card.get(1)==0&bingo_card.get(6)==0&bingo_card.get(11)==0&bingo_card.get(16)==0&bingo_card.get(21)==0){
            bingo = true;
        }
        else if(bingo_card.get(2)==0&bingo_card.get(7)==0&bingo_card.get(12)==0&bingo_card.get(17)==0&bingo_card.get(22)==0){
            bingo = true;
        }
        else if(bingo_card.get(3)==0&bingo_card.get(8)==0&bingo_card.get(13)==0&bingo_card.get(18)==0&bingo_card.get(23)==0){
            bingo = true;
        }
        else if(bingo_card.get(4)==0&bingo_card.get(9)==0&bingo_card.get(14)==0&bingo_card.get(19)==0&bingo_card.get(24)==0){
            bingo = true;
        }
        else if(bingo_card.get(0)==0&bingo_card.get(6)==0&bingo_card.get(12)==0&bingo_card.get(18)==0&bingo_card.get(24)==0){
            bingo = true;
        }
        else if(bingo_card.get(4)==0&bingo_card.get(8)==0&bingo_card.get(12)==0&bingo_card.get(16)==0&bingo_card.get(20)==0){
            bingo = true;
        }
        else{
        bingo = false;
        }
        return(bingo);
    }

和测试仪:

public class BINGOFINAL {
public static void main(String args[]){
    Bingo_Card test_card = new Bingo_Card();
    test_card.print_card();

    while(test_card.check_bingo() == false){
    System.out.println("Please input the called out number: ");
    Scanner input = new Scanner(System.in);
    int call_out = input.nextInt();
    test_card.check_match(call_out);
    test_card.check_bingo();
    test_card.print_card();
    }
    System.out.println("BINGO!");
    } 

}

我需要将 BingoComponent 实现到原来的两个中,并且每次都更新卡片。

4

1 回答 1

2

基本思想保持不变。

您需要某种模型来维护宾果卡的状态,您需要某种显示此模型的视图以及某种管理模型更新的控件/管理器...

在你BingoComponentpaintComponent方法中,你这样做Bingo_Card test_card = new Bingo_Card();......

我会说这是一个坏主意,因为每次绘制组件时您都在休息卡/模型的状态,这不是您想要的。相反,您希望保持对卡片的单一引用,然后使用它paintComponent来渲染...

相反,我很想做这样的事情......

public class BingoComponent extends JComponent {
    private Bingo_Card test_card;

    public BingoComponent(Bingo_Card card) {
        test_card = card;
    }

    /*...*/

}    

这意味着该实例不会改变,但每次我们改变它的状态时,我们都可以重新渲染它。

下一部分将归结为您希望如何实现它。如果是我,我会添加ChangeListener对 的支持Bingo_Card,以便 UI 可以监控卡片的更改并相应地更新自身,但这可能有点超出您的能力范围。

您将需要某种方式让用户在您的 UI 中输入值。为此,您可以使用JTextField. 您可以将一个ActionListener直接附加到该字段,以便每次用户按下Enter您都会收到有关它的通知和/或添加一个JButton用户可以单击的 (附加一个ActionListener以便您知道用户何时单击该按钮)。

此时,您需要获取值并更新模型,就像您在BINGOFINAL课堂上一样,但是您需要更新 UI...

例如...

public void actionPerformed(ActionEvent evt) {
    try {
        // inputField is a JTextField
        // testCard is an instance of Bingo_Card which you
        // need to create.  It is also the same instance
        // you passed to your BingoComponent
        int callOut = Integer.parseInt(inputField.getText());
        test_card.check_match(call_out);
        test_card.check_bingo();
        test_card.print_card();
        // bingoComponent is an instance of BingoComponent
        // which is begin displayed on the screen...
        bingoComponent.repaint();
    } catch (NumberFormatException exp) {
        JOptionPane.showMessageDialog(this, inputField.getText() + 
            " is not a valid number", "Error", JOptionPane.ERROR_MESSAGE);
    }
}

现在,就个人而言,如果模型提供某种关于其内部状态更改的通知,我会更喜欢它,但让我们试着让它在开始时保持简单......

查看使用 Swing 创建 GUI 以获取更多详细信息

于 2013-08-27T01:30:25.000 回答