我从一个拥有所有方法和构造函数的类开始,这些方法和构造函数正在完成宾果游戏的所有工作。然后有一个"测试员班"这将打印出来并通过使用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实现为原始的两个并且每次更新卡片。
答案 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
现在,就个人而言,如果模型提供了关于内部状态变化的某种通知,我更喜欢它,但是让我们尝试在开始时保持简单......