import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
public class BoardComponent extends JComponent implements MouseListener, MouseMotionListener
{
private ArrayList<Player> players;
private ArrayList<Wall> walls;
private Line2D.Double wall;
private SidePanel side;
//private JFrame frame;
private boolean drawing;
private final int SIZE_CONST = 50;
public BoardComponent(ArrayList<Player> p)//, SidePanel s)//, JFrame j)
{
this.addMouseListener(this);
this.addMouseMotionListener(this);
drawing = false;
players = new ArrayList<Player>();
walls = new ArrayList<Wall>();
wall = new Line2D.Double(0,0,0,0);
//frame = j;
for(Player i : p)
{
players.add(i);
}
}
public void add(SidePanel s)
{
side = s;
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.fill(new Rectangle(0, 0, SIZE_CONST * 9 + 15, SIZE_CONST * 9 + 15));
g2.setColor(new Color(212, 125, 27));
g2.fill(new Rectangle(0, 0, SIZE_CONST * 9, SIZE_CONST * 9));
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
for(int k = 0; k < players.size(); k++)
{
if(players.get(k).getX() == j && players.get(k).getY() == i)
{
g2.setColor(players.get(k).getColor());
g2.fill(new Ellipse2D.Double(SIZE_CONST * j + (SIZE_CONST / 4),
SIZE_CONST * i + (SIZE_CONST / 4),
SIZE_CONST / 2,
SIZE_CONST / 2));
g2.setColor(Color.BLACK);
g2.draw(new Ellipse2D.Double(SIZE_CONST * j + (SIZE_CONST / 4),
SIZE_CONST * i + (SIZE_CONST / 4),
SIZE_CONST / 2,
SIZE_CONST / 2));
}
}
g2.setColor(Color.BLACK);
g2.draw(new Rectangle(SIZE_CONST * j, SIZE_CONST * i, SIZE_CONST, SIZE_CONST));
}
}
g2.setColor(Color.WHITE);
for(int i = 0; i < walls.size(); i++)
{
g2.draw(new Line2D.Double(walls.get(i).getX1() * SIZE_CONST,
walls.get(i).getY1() * SIZE_CONST,
walls.get(i).getX2() * SIZE_CONST,
walls.get(i).getY2() * SIZE_CONST));
}
for(int i = 0; i < 10; i++)
g2.drawString(Integer.toString(i), SIZE_CONST * i, SIZE_CONST * 9 + 10);
for(int i = 0; i < 9; i++)
g2.drawString(Integer.toString(i), SIZE_CONST * 9, SIZE_CONST * i + 10);
g2.draw(wall);
if(drawing)
{
//System.out.println("Drawing");
g2.draw(new Wall(side.getX1(), side.getY1(),
side.getX2(),side.getY2()));
}
side.setVals(this);
//this is how I figured out what size was optimal for the frame:
//System.out.println("Height: " + frame.getHeight() + "\nWidth: " + frame.getWidth());
}
//GET AND SET METHODS
public void addWall(Wall w)
{
walls.add(w);
}
public void addWall(int i, Wall w)
{
walls.add(i, w);
}
public Wall getWall(int i)
{
return walls.get(i);
}
public int getNumWalls()
{
return walls.size();
}
public Player getPlayer(int i)
{
return players.get(i);
}
public int getNumPlayers()
{
return players.size();
}
public String getWalls()
{
String w = new String();
for(int i = 0; i < walls.size(); i++)
w += walls.get(i) + "; ";
if(w.equals(null))
w = "<null>";
return w;
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e)
{
wall.setLine(0,0,0,0);
}
public void mousePressed(MouseEvent e)
{
wall.setLine(e.getX(), e.getY(), e.getX(), e.getY());
drawing = true;
this.repaint();
}
public void mouseReleased(MouseEvent e)
{
drawing = false;
boolean placed = players.get(side.getPlayer() - 1).placeWall(new Wall(
side.getX1(), side.getY1(),
side.getX2(),side.getY2()), this);
//System.out.println(placed);
//System.out.println((int)Math.round(wall.getX1() / 50));
//System.out.println((int)Math.round(wall.getY1() / 50));
//System.out.println((int)Math.round(wall.getX2() / 50));
//System.out.println((int)Math.round(wall.getY2() / 50));
if(placed)
{
side.incPlayer();
if (side.getPlayer() > players.size())
side.setPlayer(1);
side.refresh();
}
this.repaint();
wall.setLine(0,0,0,0);
}
public void mouseDragged(MouseEvent e)
{
double x = wall.getX1();
double y = wall.getY1();
wall.setLine(x, y, e.getX(), e.getY());
drawing = true;
this.repaint();
}
public void mouseMoved(MouseEvent e) {}
public Line2D.Double getNewWall()
{
return wall;
}
}