0
我有用於生成完美迷宮的遞歸除法算法的java代碼,但問題是我想實現它,並且無法找到一種方法在android中打印生成的迷宮...因爲它會爲垂直線生成一個字符數組「|」另一個用於水平線「 - 」。 我試圖循環兩個數組,並繪製垂直線,如果「|」和一個水平線,如果「 - 」但顯然沒有工作,因爲我不能在android活動上設置行的正確位置。 那麼我如何設置完全按照生成的方式繪製迷宮呢? 或者是他們在android上的算法的另一個實現?在android中用於迷宮生成的遞歸除法算法
這是我使用的實現:
package com.jforeach.mazegame;
import java.util.*;
import android.util.Log;
class RecursiveDivision
{
static final char VWALL = '|';
static final char HWALL = '-';
static final char MAZE_PATH = ' ';
int rows;
int cols;
int act_rows;
int act_cols;
char[][] board;
public RecursiveDivision(int row, int col)
{
//initialize instance variables
rows = row*2+1;
cols = col*2+1;
act_rows = row;
act_cols = col;
board = new char[rows][cols];
//set the maze to empty
/* for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
board[i][j] = MAZE_PATH;
}
}*/
//make the outter walls
for(int i=0; i<rows; i++){
board[i][0] = VWALL;
board[i][cols-1] = VWALL;
}
for(int i=0; i<cols; i++){
board[0][i] = HWALL;
board[rows-1][i] = HWALL;
}
}
//storefront method to make the maze
public void makeMaze()
{
makeMaze(0,cols-1,0,rows-1);
makeOpenings();
}
//behind the scences actual mazemaking
private void makeMaze(int left, int right, int top, int bottom)
{
int width = right-left;
int height = bottom-top;
//makes sure there is still room to divide, then picks the best
//direction to divide into
if(width > 2 && height > 2){
if(width > height)
divideVertical(left, right, top, bottom);
else if(height > width)
divideHorizontal(left, right, top, bottom);
else if(height == width){
Random rand = new Random();
boolean pickOne = rand.nextBoolean();
if(pickOne)
divideVertical(left, right, top, bottom);
else
divideHorizontal(left, right, top, bottom);
}
}else if(width > 2 && height <=2){
divideVertical(left, right, top, bottom);
}else if(width <=2 && height > 2){
divideHorizontal(left, right, top, bottom);
}
}
private void divideVertical(int left, int right, int top, int bottom)
{
Random rand = new Random();
//find a random point to divide at
//must be even to draw a wall there
int divide = left + 2 + rand.nextInt((right-left-1)/2)*2;
//draw a line at the halfway point
for(int i=top; i<bottom; i++){
board[i][divide] = VWALL;
}
//get a random odd integer between top and bottom and clear it
int clearSpace = top + rand.nextInt((bottom-top)/2) * 2 + 1;
board[clearSpace][divide] = MAZE_PATH;
makeMaze(left, divide, top, bottom);
makeMaze(divide, right, top, bottom);
}
private void divideHorizontal(int left, int right, int top, int bottom)
{
Random rand = new Random();
//find a random point to divide at
//must be even to draw a wall there
int divide = top + 2 + rand.nextInt((bottom-top-1)/2)*2;
if(divide%2 == 1)
divide++;
//draw a line at the halfway point
for(int i=left; i<right; i++){
board[divide][i] = HWALL;
}
//get a random odd integer between left and right and clear it
int clearSpace = left + rand.nextInt((right-left)/2) * 2 + 1;
board[divide][clearSpace] = MAZE_PATH;
//recur for both parts of the newly split section
makeMaze(left, right, top, divide);
makeMaze(left, right, divide, bottom);
}
public void makeOpenings(){
Random rand = new Random(); //two different random number generators
Random rand2 = new Random();//just in case
//a random location for the entrance and exit
int entrance_row = rand.nextInt(act_rows-1) * 2 +1;
int exit_row = rand2.nextInt(act_rows-1) * 2 +1;
//clear the location
board[entrance_row][0] = MAZE_PATH;
board[exit_row][cols-1] = MAZE_PATH;
}
public void printMaze()
{
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
Log.d("MAZE", i +" "+ j+" "+ String.valueOf(board[i][j]));
}
}
}
public Maze getMaze()
{
Maze maze = convert();
return maze;
}
}
在此先感謝。
非常感謝您的回答,但在控制檯打印迷宮是沒有問題的,我的問題是我要畫它在android系統的活動。 我試着使用drawLine函數,但是這種方法失敗了,我認爲是因爲postions沒有很好地爲android活動設置。 – Rami 2014-09-29 08:29:37
Rami,您是否嘗試繪製矩形而不是線條。就像這樣:for(int i = 0; i
rostok
2014-09-29 09:17:02
OHH工作得很好非常感謝..它的印刷完全像現在產生的一樣,但不知怎麼的小,但我最不用擔心!非常感謝:d – Rami 2014-09-29 09:50:28