面向对象编程,走迷宫

建立maze.js, mazespace.js, robot.js

界面逻辑写在robotmazeinterface.js

 

"use strict";//maze.js

function Maze(width,height){
    this.width=width;
    this.height=height;

    this.startX           = null;
    this.startY           = null;
    this.startOrientation = null;
    this.endX             = null;
    this.endY             = null;

    this.directions=["north","east","south","west"];
    this.spaces=[];
    for(var x=1;x<=width;x++){
        this.spaces[x]=[];
        for(var y=1;y<=height;y++){
            this.spaces[x][y]=new MazeSpace(this.directions);
        }
    }
}

Maze.prototype.setStart=function(x,y,orientation){
    if(this.isInBounds(x,y)&&this.isValidDirection(orientation)){
        this.startX=x;
        this.startY=y;
        this.startOrientation=orientation;
        return true;
    }
    
}

Maze.prototype.setEnd=function(x,y){
    this.endX=x;
    this.endY=y;
}
Maze.prototype.setWall=function(x,y,direction){
    if(this.isInBounds(x,y)&&this.isValidDirection(direction)){
        this.spaces[x][y].setWall(direction);
        return true;
    }
    return false;
    
}
Maze.prototype.isValidDirection=function(direction){
  return  this.directions.indexOf(direction)!==-1;
}
Maze.prototype.isInBounds=function(x,y){
  return  x>0&&x<=this.width&&y>0&&y<=this.height;
}
Maze.prototype.canMove=function(x,y,direction){
    if(!this.isValidDirection(direction)){
        return false;
    }
    if(!this.isInBounds(x,y)){
        return false;
    }
    var forwardX,forwardY;
    switch(direction){
        case "north":
            forwardX=x;
            forwardY=y+1;
            break;
        case "east":
            forwardX=x+1;
            forwardY=y;
            break;
        case "south":
            forwardX=x;
            forwardY=y-1;
            break;
        case "west":
            forwardX=x-1;
            forwardY=y;
            break;
    }
    if(!this.isInBounds(forwardX,forwardY)){
        return false;
    }

    if(this.spaces[x][y][direction]){
        return false;
    }

    var opposites={
        north:"south",
        east:"west",
        south:"north",
        west:"east"
    };
    if(this.spaces[forwardX][forwardY][opposites[direction]]){
        return false;
    }

    return true;
}
// "use strict";

// function Maze(width,height) {
//     this.width = width;
//     this.height = height;

//     this.startX           = null;
//     this.startY           = null;
//     this.startOrientation = null;
//     this.endX             = null;
//     this.endY             = null;

//     this.directions = ["north","east","south","west"];
//     this.spaces = [];

//     var x, y;
//     for (x=1; x <= width; x += 1) {
//         this.spaces[x] = [];
//         for (y=1; y <= height; y += 1) {
//             this.spaces[x][y] = new MazeSpace(this.directions);
//         }
//     }
// }

// Maze.prototype.setStart = function(x, y, orientation) {
//     if (this.isInBounds(x, y) && this.isValidDirection(orientation)) {
//         this.startX = x;
//         this.startY = y;
//         this.startOrientation = orientation;
//         return true;
//     }
//     return false;
// }

// Maze.prototype.setEnd = function (x, y) {
//     if (!this.isInBounds(x, y)) {
//         return false;
//     }
//     this.endX = x;
//     this.endY = y;
//     return true;
// }

// Maze.prototype.setWall = function (x, y, direction) {
//     if (this.isInBounds(x, y) && this.isValidDirection(direction)) {
//         this.spaces[x][y].setWall(direction);
//         return true;
//     }
//     return false;
// }

// Maze.prototype.isValidDirection = function(direction) {
//     return this.directions.indexOf(direction) !== -1;
// }

// Maze.prototype.isInBounds = function (x, y) {
//     return x > 0 && x <= this.width && y > 0 && y <= this.height;
// }

  

"use strict";
function MazeSpace(directions){
	for(var i=0;i<directions.length;i++){
		this[directions[i]]=false;
	}
}

MazeSpace.prototype.setWall=function(direction){
	this[direction]=true;
}

  

"use strict";
function Robot(){
    this.x=null;
    this.y=null;
    this.orientation=null;
    this.maze=null;
}

Robot.prototype.setMaze=function(maze){
    this.maze=maze;
    this.x=maze.startX;
    this.y=maze.startY;
    this.orientation=maze.startOrientation;
}
Robot.prototype.turnRight=function(){
    if(!this.maze||!this.maze.isValidDirection(this.orientation)){
        return false;
    }
    var rights={
        north:"east",
        east:"south",
        south:"west",
        west:"north"
    }
    this.orientation=rights[this.orientation];
    return true;
}

Robot.prototype.turnLeft=function(){
    if(!this.maze||!this.maze.isValidDirection(this.orientation)){
        return false;
    }
    var lefts={
        north:"west",
        east:"north",
        south:"east",
        west:"south"
    }
    this.orientation=lefts[this.orientation];
    return true;
}

Robot.prototype.moveForward=function(){
    if(!this.canMoveForward()){
        return false;
    }
    switch(this.orientation){
        case "north":
            this.y++;
            break;
        case "east":
            this.x++;
            break;
        case "south":
            this.y--;
            break;
        case "west":
            this.x--;
            break;
    }
    return true;
}

Robot.prototype.canMoveForward=function(){
    if(!this.maze){
        return false;
    }
    return this.maze.canMove(this.x,this.y,this.orientation);
}

  

posted @ 2015-07-09 14:52  bjsunhe  阅读(278)  评论(0编辑  收藏  举报