将java图形实现到宾果卡游戏中

时间:2013-08-27 01:11:51

标签: java swing graphics java-2d

我从一个拥有所有方法和构造函数的类开始,这些方法和构造函数正在完成宾果游戏的所有工作。然后有一个"测试员班"这将打印出来并通过使用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实现为原始的两个并且每次更新卡片。

1 个答案:

答案 0 :(得分:2)

基本理念保持不变。

你需要某种维持宾果卡状态的模型,你需要某种显示这个模型的视图和某种控制/管理器来管理模型的更新......

在您BingoComponent的{​​{1}}方法中,您执行此操作... paintComponent ...

我想说这是一个坏主意,因为每次绘制组件时都要重置卡片/模型的状态,这不是你想要的。相反,您希望保持对卡片的单个引用,然后使用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支持,以便用户界面可以监控卡的更改并相应地更新自己,但这可能有点超出您的需求

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

此时,您需要获取值并更新模型,就像您在ActionListener课程中一样,但您需要更新UI ...

例如......

BINGOFINAL

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

查看Creating a GUI with Swing了解详情