SWING gra w kółko i krzyżyk

0

Od paru dni próbuję zrobić grę, może ktoś orientuje się, dlaczego ona mi się zawiesza po narysowaniu tych kółek?
Wiem, że jakiś jest problem z pętlą while... ale nie rozumiem dlaczego...
Z góry dzięki

 package starter;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;

public class MyPanel extends JPanel implements MouseListener {

	int[] list = new int[9];
	ArrayList<Integer> listaZajetych = new ArrayList<Integer>();
	final int x = 80;
	final int y = 80;
	final int a = 20;

	// x,y o ile przesunąć w prawo, lewo, góra dół, a - wyśrodkować w polu pola

	public MyPanel() {
		setLayout(new BorderLayout());
		addMouseListener(this);

		for (int i = 0; i < 9; i++) {
			list[i] = 0;
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		setBackground(Color.WHITE);

		drawLines(g2);

		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);
		randomCircle(g2);

	}

	public void drawCircle(Graphics2D g2, int ktory) {
		g2.setStroke(new BasicStroke(4.0f, BasicStroke.CAP_ROUND,
				BasicStroke.JOIN_MITER));
		g2.setColor(Color.RED);

		if (ktory == 0) {
			g2.draw(new Ellipse2D.Double(0 + x + a, 0 + y + a, 50, 50));
			list[0] = 1;
		} else if (ktory == 1) {
			g2.draw(new Ellipse2D.Double(100 + x + a, 0 + y + a, 50, 50));
			list[1] = 1;
		} else if (ktory == 2) {
			g2.draw(new Ellipse2D.Double(200 + x + a, 0 + y + a, 50, 50));
			list[2] = 1;
		} else if (ktory == 3) {
			g2.draw(new Ellipse2D.Double(0 + x + a, 100 + y + a, 50, 50));
			list[3] = 1;
		} else if (ktory == 4) {
			g2.draw(new Ellipse2D.Double(100 + x + a, 100 + y + a, 50, 50));
			list[4] = 1;
		} else if (ktory == 5) {
			g2.draw(new Ellipse2D.Double(200 + x + a, 100 + y + a, 50, 50));
			list[5] = 1;
		} else if (ktory == 6) {
			g2.draw(new Ellipse2D.Double(0 + x + a, 200 + y + a, 50, 50));
			list[6] = 1;
		} else if (ktory == 7) {
			g2.draw(new Ellipse2D.Double(100 + x + a, 200 + y + a, 50, 50));
			list[7] = 1;
		} else if (ktory == 8) {
			g2.draw(new Ellipse2D.Double(200 + x + a, 200 + y + a, 50, 50));
			list[8] = 1;
		}

		/*
		 * if((zx+x)<(100+x) && (zy+y)<(100+y)){ list[0]=1; } if((zx+x)<(200+x)
		 * && (zy+y)<(100+y) && (zx+x>(100+x)) && (zy+y)>0){ list[1]=1; }
		 * if((zx+x)<(300+x) && (zy+y)<(100+y) && (zx+x>(200+x)) && (zy+y)>0){
		 * list[2]=1; } if((zx+x)<(100+x) && (zy+y)<(100+y) && (zx+x>(200+x)) &&
		 * (zy+y)>0){ list[2]=1; }
		 */

	}

	public void randomCircle(Graphics2D g2) {
		Random r = new Random();
		int wylosowany = 999;

		if (listaZajetych.size() == 0) {			
			wylosowany = r.nextInt(9);
			drawCircle(g2, wylosowany);
			listaZajetych.add(wylosowany);
		} else {
			wylosowany = r.nextInt(9);
			if(czyBylo(wylosowany, listaZajetych)){
				while(czyBylo(wylosowany, listaZajetych)){
					wylosowany = r.nextInt(9);					
				}
			}
		}

		drawCircle(g2, wylosowany);
		listaZajetych.add(wylosowany);

	}

	public boolean czyBylo(int liczba, ArrayList<Integer> lista) {
		boolean b = false;
		for (int i = 0; i < lista.size(); i++) {
			if (lista.get(i).equals(liczba)) {
				b = true;
				break;
			}
		}
		if (b == true) {
			return true;
		} else {
			return false;
		}
	}

	public void drawLines(Graphics2D g2) {

		float dash[] = { 10.10f };
		Stroke lineStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT,
				BasicStroke.JOIN_MITER, 10.0f, dash, 15.0f);
		g2.setStroke(lineStroke);
		g2.setColor(Color.BLACK);
		g2.draw(new Line2D.Double(100 + x, 0 + y, 100 + x, 300 + y));
		g2.draw(new Line2D.Double(200 + x, 0 + y, 200 + x, 300 + y));
		g2.draw(new Line2D.Double(0 + x, 100 + y, 300 + x, 100 + y));
		g2.draw(new Line2D.Double(0 + x, 200 + y, 300 + x, 200 + y));
	}

	public void mouseClicked(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}

}
0

Skasuj ten kod. Napisz od nowa przy takich zalożeniach (trochę jak gomoku):

  • plansza jest dowolnego rozmiaru podawanego przez użytkownika, nie musi być kwadratowa
  • wygrywa zadana przez użytkownika liczba tych samych symboli w danej linii
    Mam nadzieję że to skutecznie wyeliminuje twoje pomysły z ifami.
    Następnie:
  • oddziel ZUPEŁNIE logikę gry od tego jak jest rysowana. Zrób najpierw cała hierarchię klas odpowiedzialnych za prowadzenie rozgrywki. Rysowanie zostaw na sam koniec.

1 użytkowników online, w tym zalogowanych: 0, gości: 1