LoginSignup
0
0

More than 1 year has passed since last update.

めちゃくちゃ簡易のビンゴゲームを作る #2

Last updated at Posted at 2022-09-06

初めに

まず前回やったことの確認。

  • ランダムな数字を並べてビンゴカードを作る機能を作成。
  • 「ゲーム開始」ボタンでゲーム画面に移動するようにした。

の2つ。
前回の記事のコメントでビンゴカードはただランダムな数字を並べているのではなく、列ごとに並ぶ数字の範囲が決まっている、ということを教えていただいたので、この機能を追加する。
よって、今回作った機能は以下の2つ。

  • ビンゴカード作成機能の改良版(列ごとに範囲限定)
  • 抽選ボタンで出た数字がカード上にあれば、そのマスの背景色を変える。

ひとつずつ紹介する。

ビンゴカード作成機能改良版

コード(レイアウト)

    JPanel BingoCardPanel;
	JPanel p1;
	JPanel p2;
	JPanel p3;
	JPanel p4;
	JPanel p5;
	JLabel bingoNumLabel1[] = new JLabel[5];
	JLabel bingoNumLabel2[] = new JLabel[5];
	JLabel bingoNumLabel3[] = new JLabel[5];
	JLabel bingoNumLabel4[] = new JLabel[5];
	JLabel bingoNumLabel5[] = new JLabel[5];
	LineBorder border = new LineBorder(Color.LIGHT_GRAY,2,true);
	GridLayout gl = new GridLayout(5,1);

    public BingoGame() {
		setBounds(10,10,600,400);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		mkCardBtn = new JButton("ビンゴカード作成");
		mkCardBtn.addActionListener(this);
		
		BingoCardPanel = new JPanel();
		BingoCardPanel.setLayout(new GridLayout(1,5));
		
		mkCard(p1,bingoNumLabel1,1);
		mkCard(p2,bingoNumLabel2,6);
		mkCard(p3,bingoNumLabel3,11);
		mkCard(p4,bingoNumLabel4,16);
		mkCard(p5,bingoNumLabel5,21);
		
		
		JPanel p1_1 = new JPanel();
		p1_1.setLayout(new GridLayout(1,2));
		p1_1.add(mkCardBtn);
		p1_1.add(BingoCardPanel);
		
		startBtn  =new JButton("ゲーム開始");
		startBtn.addActionListener(this);
		
		c = getContentPane();
		c.add(p1_1, BorderLayout.CENTER);
		c.add(startBtn, BorderLayout.SOUTH); 
	}

    public void mkCard(JPanel p, JLabel[] la, int i){ //カードのレイアウト
		p = new JPanel();
		p.setLayout(gl);
		for(int j=0;j<la.length; j++) {
			String testNum = Integer.toString(j + i);
			la[j] = new JLabel(testNum);
			la[j].setBorder(border);
			p.add(la[j]);
		}
		BingoCardPanel.add(p);
	}

ちょっと説明

前回まではBingoCardPanelにGridLayout(5,5)を設定して、JLabelを並べていたが、今回は列ごとのJPanelを作り、それぞれ5枚ずつJLabelを載せるようにした。
載せる操作は前回同様for文でまとめてみた。

コード(「カード作成」ボタンの処理)

public void actionPerformed(ActionEvent e) {
		if(e.getSource() == mkCardBtn) {
			numList1.clear();
			numList2.clear();
			numList3.clear();
			numList4.clear();
			numList5.clear();
			mkRandomNum(numList1, 1, bingoNumLabel1);
			mkRandomNum(numList2, 16, bingoNumLabel2);
			mkRandomNum(numList3, 31, bingoNumLabel3);
			mkRandomNum(numList4, 46, bingoNumLabel4);
			mkRandomNum(numList5, 61, bingoNumLabel5);
        }
}

public void mkRandomNum(ArrayList<Integer> al, int i,JLabel[] la) {
		while(al.size() < 5) {
			int num = random.nextInt(15) + i;
			if(al.indexOf(num) == -1) {
				al.add(num);
			}
		}
		
		for(int j=0; j<al.size(); j++) {
			String number = Integer.toString(al.get(j));
			la[j].setText(number);
    	}
}

ちょっと説明

1列目を例にすると、1列目に並べる用の数を入れるためのArrayList(変数名numList1)を作った。while文で、1~15の数字を出して、indexOfメソッドで数字の被りがないか確認し、なければArrayListに追加という作業。
次のfor文ではintをStringに変えて、JLabelに乗せている。

・このmkRandomNumの第二引数を変えることで、2列目以降の数字の範囲を変えられるようになっている。

実行結果

image.png
左の作成ボタンをおすことで、カードの数字がランダムに変わる。
何度押しても作成し直せるし、列ごとの数字の範囲限定も上手くいっている。いい感じ。

抽選ボタンの処理など

抽選ボタンを押すことで、
・被りのない1~75までの数字をランダムにひとつ生成
・その数字を画面に表示
・その数字がカードにあれば、そのマスを赤くする
の3つが処理されるようにする。

コード

public void actionPerformed(ActionEvent e) {
		if(e.getSource() == spinBtn) {
			do {
				spinNum = random.nextInt(75) + 1;
			}while(spinNumbersList.indexOf(spinNum) != -1); {
				spinNum = random.nextInt(75) + 1;
			}
			spinNumbersList.add(spinNum);
			String spinNumber = Integer.toString(spinNum);
			numLog.append(spinNumber + ",");
		}
		
		punchHole();
	}

public void punchHole() { //カードに穴あける。
		if(spinNum <= 15) {
			changeBackgroundColor(numList1, bingoNumLabel1);
		}else if(spinNum <= 30) {
			changeBackgroundColor(numList2, bingoNumLabel2);
		}else if(spinNum <= 45) {
			changeBackgroundColor(numList3, bingoNumLabel3);
		}else if(spinNum <= 60) {
			changeBackgroundColor(numList4, bingoNumLabel4);
		}else if(spinNum <= 75) {
			changeBackgroundColor(numList5, bingoNumLabel5);
		}
	}
	
	public void changeBackgroundColor(ArrayList<Integer> al, JLabel[] la) { //背景色を変える
		if(al.indexOf(spinNum) != -1) {
			la[al.indexOf(spinNum)].setOpaque(true);
			la[al.indexOf(spinNum)].setBackground(Color.red);
		}
	}

ちょっと説明

・ランダム数字の生成に関しては、ほとんどカード作成時と同じ原理。今回はdo-while文を使って、被ってない数字になるまで繰り返すようにした。
・JTextArea(変数名numLog)にappendメソッドで数字の履歴を表示している。
・puchHole()に関して
生成された数字がどの列に入るかによって処理を分けている。
al.indexOf(spinNum)はArrayList alのどこにspinNumと同じ数字が入っているかを返してくれるので、それをビンゴカードのJLabel[]の添え字としている。
また、setOpaqueメソッドでtrueを設定することで、JLabelの背景を非透明にすることができる。デフォルトではfalseに設定されているので、この記述を書かない状態で、背景色を変えても見た目にあらわれない。

実行結果

image.png
こんな感じ。右のボックスに出た数字の履歴が表示されてて、当たった数字は赤ますになってる。
これでだいぶビンゴゲームに近づいたと思う。

終わりに

見た目的にはかなりビンゴゲームになってきたが、これは一人で遊ぶものなのでやはり虚しさを感じる笑

もう一つ作りたいのはビンゴやリーチの判定機能なんだが、どうやって作ればいいか見当がついていないので、これはじっくり考えてみようと思う。フラグ用の変数でも作ればいいのかな、とも思ったが、縦横斜めに対応できる方法を思いつけていない。2,3日考えてみて分からなかったら、ネットに頼るか、力技でやってみようと思う。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0