📄 board.java
字号:
package org.bubblebreaker.model;
import java.util.Random;
import java.util.Vector;
public class Board{
public Cell currentCell=new Cell(0,0);
public Cell [] selectedCells=null;
public Ball data[][]= null;
public Score score=new Score();
public Board(int rows, int cols)
{
data=new Ball[rows][];
for(int i=0;i<rows;i++)
{
data[i]=new Ball[cols];
}
}
public void copy( Board board)
{
if(null==board)
{
System.out.println("Null board to copy????");
(new Exception()).printStackTrace();
return;
}
for(int row=0;row<data.length;row++)
for(int col=0;col<data[0].length;col++)
{
data[row][col]=board.data[row][col];
}
currentCell.copy(board.currentCell);
if(null != board.selectedCells)
{
selectedCells=new Cell[board.selectedCells.length];
for(int i=0;i<selectedCells.length;i++)
{
selectedCells[i]=new Cell(0,0);
selectedCells[i].copy(board.selectedCells[i]);
}
}
score.copy(board.score);
System.out.println("copied board "+board+"->"+this);
}
public String toString()
{
return ""+data+","+selectedCells+","+currentCell;
}
}
interface BoardBuilder{
public void buildBoard(Board board);
public void addNewColumn(int col, Board board);
public int getAdverseSelection();
public void setAdverseSelection(int adverseSelection);
}
class RandomBoardBuilder implements BoardBuilder{
public static Random m_random =new Random();
int adverseSelection=0;
public int getAdverseSelection()
{
return adverseSelection;
}
public void setAdverseSelection(int adverseSelection)
{
this.adverseSelection=adverseSelection;
}
public void buildBoard(Board board)
{
System.out.println("build random board");
for(int col=0;col<board.data[0].length;col++)
addNewColumn(col,board);
}
public void addNewColumn(int col, Board board)
{
int nBalls=Ball.balls.length;
for(int row=0;row<board.data.length;row++)
{
int ballIndex=Math.abs((Math.abs(m_random.nextInt())%nBalls)-1);
System.out.println(""+row+","+col+","+nBalls+","+ballIndex);
board.data[row][col]=Ball.balls[ballIndex];
}
//remove some colors to make it harder
if(adverseSelection >0)
{
int col1=-1;
if(col+1 < board.data[0].length)
{
col1=col + 1;
}
if(col1 == -1 && col-1 >=0)
{
col1=col-1;
}
Vector v=new Vector();
for(int row=0;row<board.data.length;row++)
{
if(!v.contains(board.data[row][col1]))
{
v.addElement(board.data[row][col1]);
}
}
while(v.size()>=adverseSelection){
v.removeElement(v.firstElement());
}
for(int row=0;row<board.data.length;row++)
{
if(v.contains(board.data[row][col]))
{
System.out.println("replaced balls : "+row+","+col);
for(int k=0;k<Ball.balls.length;k++)
{
if(!v.contains(Ball.balls[k]))
{
board.data[row][col]=Ball.balls[k];
break;
}
}
}
}
}
}
}
class SquareBoardBuilder extends RandomBoardBuilder{
public void buildBoard(Board board)
{
System.out.println("build square board");
int squareSize=(Math.abs(m_random.nextInt())%7);
int squareRowPosition=(Math.abs(m_random.nextInt())% (board.data.length-squareSize) );
int squareColPosition=(Math.abs(m_random.nextInt())% (board.data[0].length-squareSize) );
int nBalls=Ball.balls.length;
int ballIndex=Math.abs((Math.abs(m_random.nextInt())%nBalls)-1);
Ball ball=Ball.balls[ballIndex];
System.out.println("Square board : "+squareSize+","+squareRowPosition+","+squareColPosition+","+ball.color.getCode());
for(int i=0;i<squareSize;i++)
for(int j=0;j<squareSize;j++)
{
board.data[squareRowPosition+i][squareColPosition+j]=ball;
}
for(int row=0;row<board.data.length;row++)
for(int col=0;col<board.data[0].length;col++)
{
//don't do anything if this cell is filled
if(null !=board.data[row][col] && Ball.WHITEBALL != board.data[row][col])
{
continue;
}
//chose a random color
ballIndex=Math.abs((Math.abs(m_random.nextInt())%nBalls)-1);
ball=Ball.balls[ballIndex];
//set the cell
board.data[row][col]=ball;
//now try to insert another pair into
boolean vertical=(Math.abs(m_random.nextInt())%4) == 1;
if(vertical)
{
if(makePlaceInColumn(row,col,board)){
//set the cell
board.data[row][col]=ball;
}
else if(makePlaceInRow(row,col,board)){
//set the cell
board.data[row][col]=ball;
}
}
else
{
if(makePlaceInRow(row,col,board)){
//set the cell
board.data[row][col]=ball;
}
else if(makePlaceInColumn(row,col,board)){
//set the cell
board.data[row][col]=ball;
}
}
}
}
boolean makePlaceInColumn(int startRow, int startCol, Board board)
{
for(int row=0;row<board.data.length;row++)
for(int col=0;col<board.data[0].length;col++)
{
int col1=(startCol+col)%board.data[0].length;
if(board.data[row][col] == Ball.WHITEBALL)
{
//we got a place
for(col1=col;col1>=0;col1--)
{
int col2=(startCol+col1)%board.data[0].length;
int col3=(startCol+col1-1)%board.data[0].length;
board.data[row][col2]=board.data[row][col3];
}
return true;
}
}
return false;
}
boolean makePlaceInRow(int startRow, int startCol, Board board)
{
for(int row=0;row<board.data.length;row++)
for(int col=0;col<board.data[0].length;col++)
{
int row1=(startRow+row)%board.data.length;
if(board.data[row][col] == Ball.WHITEBALL)
{
//we got a place
for(row1=row;row1>=0;row1--)
{
int row2=(startRow+row1)%board.data.length;
int row3=(startRow+row1-1)%board.data.length;
board.data[row2][col]=board.data[row3][col];
}
return true;
}
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -