0

我在 ecipe 上的 java 小程序不起作用,它写入“小程序初始化”,但没有处理为“小程序启动”,小程序没有启动(只是空白屏幕),控制台窗口中也没有错误。

图片:http: //i.stack.imgur.com/pvalc.png

我的代码是关于深度优先迷宫的,问题出在 genrate() 函数中,因为当我评论它时,程序运行良好

迷宫.java:

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class Maze {

// Direction Variables
public static final int Direction_Up=1;
public static final int Direction_Down=2;
public static final int Direction_Right=3;
public static final int Direction_Left=4;
//
//
int width, height;
int SizeX,SizeY;
public int[] start={0,0},end={3,3};
int offset=2;

boolean[][] WallsVer = { { false,true, false ,false},
        { false,false, false ,false}, { false,false, false ,true}};
boolean[][] WallsHor ={ { true,false, false },
        { true,false, true }, { true,true, true }, { false,true, false}};



public Maze(int width, int height,int sizeX,int sizeY) {
    // TODO Auto-generated constructor stub
    this.width = width;
    this.height = height;
    SizeX = sizeX;
    SizeY = sizeY;
}

//
public boolean CollisionCheck(int x,int y,int Direction){
    switch(Direction){
    case Direction_Up:
        if(y == 0){
            return false;
        }else if(!WallsVer[y-1][x]){
            return true;
        }else{
            return false;
        }
    case Direction_Down:
        if(y==SizeY-1){
            return false;
        }else if(!WallsVer[y][x]){
            return true;
        }else{
            return false;
        }
    case Direction_Right:
        if(x==SizeX-1){
            return false;
        }else if(!WallsHor[y][x]){
            return true;
        }else{
            return false;
        }
    case Direction_Left:
        if(x == 0){
            return false;
        }else if(!WallsHor[y][x-1]){
            return true;
        }else{
            return false;
        }
    }
    return false;
}

public void update() {

}

public void paint(Graphics g) {
    //draw border
    g.setColor(Color.RED);
    g.drawLine(0, 0, width, 0);
    g.drawLine(0, height, width, height);
    g.drawLine(0, 0, 0, height);
    g.drawLine(width, 0, width, height);


    //draw maze
    g.setColor(Color.RED);
    for(int j=0;j<SizeX;j++){
        for(int i=0;i<(SizeY-1);i++){
            if(WallsVer[i][j])
                g.drawLine(j*100,(i+1)*100 , (j*100)+100,(i+1)*100 );
        }
    }
    for(int j=0;j<(SizeX-1);j++){
        for(int i=0;i<SizeY;i++){
            if(WallsHor[i][j])
                g.drawLine((j+1)*100, i*100,(j+1)*100, (i*100)+100);
        }
    }
}

public void generate(){
    // horX = sizeX -1
    // horY = sizeY
    // verX = sizeX
    // verY = sizeY -1

    //set and initialize variables
    int TotalCells=SizeX*SizeY, VistedCells=0;
    int[] CurrentCell = start;
    int[] AvaliableCells = new int[4];
    int AvaliableCellsNum = 0;
    int[][] stack= new int[TotalCells][2];
    int stackPointer = 0;
    boolean[][] map = new boolean[SizeX][SizeY];


    //initialize walls
    for(int j=0;j<SizeX;j++){
        for(int i=0;i<(SizeY-1);i++){
            WallsVer[i][j]= true;
        }
    }
    for(int j=0;j<(SizeX-1);j++){
        for(int i=0;i<SizeY;i++){
            WallsHor[i][j] = true;
        }
    }
    //initialize map
    for(int j=0;j<(SizeX-1);j++){
        for(int i=0;i<(SizeY-1);i++){
            map[0][0]= false;
        }
    }
    map[CurrentCell[0]][CurrentCell[1]] = true;
    stack[stackPointer] = start;
    VistedCells=1;


    while(VistedCells < TotalCells){
        // test all the walls and enter them in AvaliableCells
        if(CurrentCell[0]!=0 && !map[CurrentCell[0]-1][CurrentCell[1]]){
            AvaliableCells[AvaliableCellsNum] = Direction_Right;
            AvaliableCellsNum++;
        }
        if(CurrentCell[0]!=3 && !map[CurrentCell[0]+1][CurrentCell[1]]){
            AvaliableCells[AvaliableCellsNum] = Direction_Left;
            AvaliableCellsNum++;
        }
        if(CurrentCell[1]!=0 && !map[CurrentCell[0]][CurrentCell[1]-1]){
            AvaliableCells[AvaliableCellsNum] = Direction_Up;
            AvaliableCellsNum++;
        }
        if(CurrentCell[1]!=3 && !map[CurrentCell[0]][CurrentCell[1]+1]){
            AvaliableCells[AvaliableCellsNum] = Direction_Down;
            AvaliableCellsNum++;
        }

        // randomization process
        if(AvaliableCellsNum > 0){
            Random RndGen = new Random(); 
            int RndValue = RndGen.nextInt(AvaliableCellsNum);
            AvaliableCellsNum = 0;
            switch(AvaliableCells[RndValue]){
                case Direction_Up:
                    WallsVer[CurrentCell[1]-1][CurrentCell[0]] = false;
                    CurrentCell[1]--;
                    map[CurrentCell[0]][CurrentCell[1]] = true;
                    stackPointer++;
                    stack[stackPointer] = CurrentCell;
                    VistedCells++;
                    break;
                case Direction_Down:
                    WallsVer[CurrentCell[1]][CurrentCell[0]] = false;
                    CurrentCell[1]++;
                    map[CurrentCell[0]][CurrentCell[1]] = true;
                    stackPointer++;
                    stack[stackPointer] = CurrentCell;
                    VistedCells++;
                    break;
                case Direction_Right:
                    WallsHor[CurrentCell[1]][CurrentCell[0]-1] = false;
                    CurrentCell[0]--;
                    map[CurrentCell[0]][CurrentCell[1]] = true;
                    stackPointer++;
                    stack[stackPointer] = CurrentCell;
                    VistedCells++;
                    break;
                case Direction_Left:
                    WallsHor[CurrentCell[1]][CurrentCell[0]] = false;
                    CurrentCell[0]++;
                    map[CurrentCell[0]][CurrentCell[1]] = true;
                    stackPointer++;
                    stack[stackPointer] = CurrentCell;
                    VistedCells++;
                    break;
            }

        }else{
            stack = popStack(stack,stackPointer);
            CurrentCell = stack[stack.length-1];
        }


    }
    end = CurrentCell;

}

private int[][] popStack(int[][] stack,int newlength){
    int[][] temp = new int[newlength][2];
    for(int i=0;i<newlength;i++){
        temp[i] = stack[i];
     }
    return temp;
}

 //getters and setters
public int getHeight() {
     return height;
}
public int getWidth() {
    return width;
 }
public int getSizeX() {
     return SizeX;
}
public int getSizeY() {
    return SizeY;
} 
public int getStartX() {
    return (start[0]*(width/SizeX))+offset;
}
 public int getStartY() {
    return (start[1]*(height/SizeY))+offset;
 }
public int getEndX() {
    return (end[0]*(width/SizeX))+offset;
}
public int getEndY() {
    return (end[1]*(height/SizeY))+offset;
}
public int getBlockW() {
    return (width/SizeX)-(2*offset);
}
public int getBlockH() {
    return (height/SizeY)-(2*offset);
}
 }
4

0 回答 0