본문 바로가기
Tech/Java

[Java] AWT를 이용한 GUI빙고게임

by 소라소라잉 2019. 8. 27.

문제 

아래의 실행결과처럼 가로, 세로 크기가 5인 빙고판을 만드시오. 그리고 버튼을 누르면, 버튼의 배경색이 밝은 회색(Color.LIGHT_GRAY)으로 바뀌고 누른 버튼의 글자가 콘솔에 출력되게 하시오.

 

 

나의풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package sorasNewPackage;
 
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class Test190826_1 {
 
    public static void main(String args[]) {
        Frame f = new Frame("GridLayoutTest");
        f.setSize(600600);
        f.setLayout(new GridLayout(55));
        int a = 1;
 
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                Button bt = new Button("새" + a++);
                f.add(bt);
                Actions ac = new Actions(i, j);
                ac.bt = bt;
                ac.name = "새" + a++;
                bt.addActionListener(ac);
            }
        }
        f.setVisible(true);
    }
}
 
class Actions implements ActionListener {
    Button bt;
    String name;
    int x, y;
    static boolean bingo[][] = new boolean[5][5];
 
    Actions(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public void actionPerformed(ActionEvent e) {
        setButton(this.bt);
    }
 
    void setButton(Button bt) {
        bt.setBackground(Color.LIGHT_GRAY);
        bingo[this.x][this.y] = true;
        System.out.println(name + " ");
        bingoCheck();
    }
 
    void bingoCheck() {
        int bingoCount = 0;
        int diagonal_1 = 0;
        int diagonal_2 = 0;
        for (int i = 0; i < bingo.length; i++) {
            int horizontal = 0;
            int vertical = 0;
 
            for (int j = 0; j < bingo[i].length; j++) {
                // 가로체크
                if (bingo[i][j])
                    horizontal += j;
 
                // 세로체크
                if (bingo[j][i])
                    vertical += j;
            }
 
            // 대각선체크_1
            if (bingo[i][i])
                diagonal_1 += i;
 
            // 대각선체크_2
            if (bingo[i][4 - i])
                diagonal_2 += i;
 
            if (horizontal == 10) {
                bingoCount++;
            }
            if (vertical == 10) {
                bingoCount++;
            }
 
        }
 
        if (diagonal_1 == 10) {
            bingoCount++;
        }
        if (diagonal_2 == 10) {
            bingoCount++;
        }
        if (bingoCount > 0)
            System.out.println("●현재 " + bingoCount + "빙고");
    }
 
}
 
cs

main메서드에 프레임을 정의하고 반복문을 통해 버튼을 생성했다.  

실제 2차원 빙고 배열은 이벤트를 처리하는 Actions메서드에 정의했고 메인메서드에서는 그 인덱스만을 매개변수로 넘겨주었다. 버튼의 색을 변경하고, 콘솔에 버튼의 이름을 출력할때 매개변수를 넘겨주는 방법 말고 

이벤트 처리 메서드에

Button btn = (Button)ae.getSource();를 추가하여 이벤트가 발생한 Button의 Source를 가져온 후 

 

System.out.println(btn.getLabel()); 

이런식으로 라벨(버튼라벨)을 출력해주면 더 간단해진다. 

 

실행결과 

댓글