user2719804
user2719804

Reputation: 1

Implementing java graphics into bingo card game

I started with a class that has all the methods and constructors which are doing all the work for the bingo game. Then had a "tester class" which would print out and update the bingo card through the use of System.out.print. Now I need to add some graphic for the bingo game. I am supposed to use my first to classes to support a new class to draw the card every time there is an update.

I was able to do the first iteration of the bingo card graphics with a separate code from my original 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;
    }


}
}

which I used with this code:

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);

    }
}

but what i dont understand is how to implement this into my original two codes. Which are:

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);
    }

and the tester:

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!");
    } 

}

i need to implement the BingoComponent into the original two and have the card update each time.

Upvotes: 0

Views: 1974

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347234

The basic idea remains the same.

You need some kind of model which is maintaining the state of the bingo card, you need some kind of view that displays this model and some kind of control/manager which managers the updates to the model...

In you BingoComponent's paintComponent method, you do this ... Bingo_Card test_card = new Bingo_Card();...

I would say this is a bad idea, as you are restting the state of the card/model each time the component is painted, this isn't what you want. Instead, you want to maintain a single reference to the card, which you then use the paintComponent to render...

Instead, I'd be tempted to do something like this instead...

public class BingoComponent extends JComponent {
    private Bingo_Card test_card;

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

    /*...*/

}    

This means that that instance doesn't change, but each time we change it's state, we can re-render it.

The next part will come down to how you want to implement it. If it was me, I would add ChangeListener support to the Bingo_Card, so that the UI could monitor for changes to the card and update itself accordingly, but this might be a little out of your reach just now.

You are going to need some way for the user enter a value into your UI. For this you could use a JTextField. You can either attach an ActionListener directly to the field, so that each time the user presses Enter you will receive notification about it and/or add a JButton, which the user could click (with an attached ActionListener so you know when the user clicks the button).

At this point, you need to take the value and update the model, just like you have in your BINGOFINAL class, but instead, you would to update the UI...

For example...

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);
    }
}

Now, personally, I'd prefer it if the model provided some kind of notification about changes to it's internal state, but lets try and keep it simpler for the time begin...

Check out Creating a GUI with Swing for more details

Upvotes: 2

Related Questions