2015-12-30 41 views
1

我正在创建一个战舰游戏来学习node.js.在app.js文件中,我创建了两个基于名为Users的模块的玩家,这个模块导入了一个名为Board的模块。在Board模块内部,我有一个名为placeShip的函数。我如何从app.js访问这个placeShip函数?因为它是我得到一个TypeError:Player1.placeShip不是一个函数。在node.js中,如何从另一个模块中的模块中的app.js访问函数?

用户模块:

var User = function() { 
var board = require('./Board'); 
return { 
    Username: "", 
    Gender: "", 
    Player: "", 
    Turn: "", 
    Ships: { 
     Carrier: ['C','C','C','C','C'], 
     Battleship: ['B','B','B','B'], 
     Cruiser: ['Z','Z','Z'], 
     Submarine: ['S','S','S'], 
     Destroyer: ['D','D'] 
    }, 
    Board: new board, 
    Hit: function (ship,position) { 
     var x = this.Ships[ship][position]; 
     if(x != null && x != undefined) { 
      this.Ships[ship][position] = 'X'; 
     } 
    }, 
    OutputAll: function() { 
     for (var item in this) { 
      if (item == "Ships") { 
       console.log("Ships: "); 
       for (var ship in this.Ships) { 
        console.log(" " + ship + ": " + this.Ships[ship]); 
       } 
      } else if(item != "Hit" && item != "OutputAll" && item != "Board") { 
       console.log(item + ": " + this[item]); 
      } 
     } 
    } 
} 
} 

module.exports = User; 

板模块:

var GameBoard = function() { 
return { 
    Yours: createArray(10), 

    Mine: createArray(10), 

    ClearBoards: function() { 
     this.Yours = createArray(10); 
     this.Mine = createArray(10); 
    }, 

    DisplayBoard: function(board){ 
     for(var i in board){ 
      console.log(board[i]); 
     } 
    } 
} 
} 

function createArray(length) { 
var table = new Array(length); 

for (var i = 0; i < length; i++) { 
    table[i] = new Array(length); 
    // Make each space a 0 
    for (var row = 0; row < length; row++) { 
     table[i][row] = 0; 
    } 
} 
return table; 
} 

function placeShip(ship,rowStart,rowEnd,colStart,colEnd) { 
var letter; 

//=====Get Ship Letter====== 
for (x = 0; x < ship.length; x++) { 
    if (ship[x] != 'X') { 
     letter = ship[x]; 
     break; 
    } 
} 

//=====Get Orientation======= 
// Ship is horizontal 
if (rowStart === rowEnd) { 
    // Put the ship letter where it lies 
    for (x = colStart; x <= colEnd; x++) { 
     this.Board.Mine[rowStart][x] = letter; 
    } 
} 
// Or Ship is vertical 
else if (colStart === colEnd) { 
    // Put the ship letter where it lies 
    for (x = rowStart; x <= rowEnd; x++) { 
     this.Board.Mine[x][colStart] = letter; 
    } 
} 
// Or Ship is diagonal 
else { 
    // Put the ship letter where it lies 
    this.Board.Mine[rowStart][colStart] = letter; 
    for (x = 0; x < ship.length; x++) { 
     this.Board.Mine[rowStart + 1][colStart + 1] = letter; 
    } 
} 
} 

module.exports = GameBoard; 
module.exports.placeShip = placeShip; 

app.js:

var http = require('http'); 
var fs = require('fs'); 
var Users = require('./public/Scripts/Users'); 

var Player1 = new Users; 
var Player2 = new Users; 

// When a user navigates to the site 
function onRequest(request, response){ 
console.log("User made a " + request.method + " request from " + request.url); 

Player1.Username = "Jamie"; 
Player1.Hit("Carrier", 4); 
console.log("Player 1 Board:========"); 
Player1.Board.DisplayBoard(Player1.Board.Mine); 
Player1.placeShip(Player1.Ships.Carrier,0,4,0,0); 
Player1.Board.DisplayBoard(Player1.Board.Mine); 


console.log("Player 2 Board:========"); 
Player2.Username = "Kimyl"; 
Player2.Board.DisplayBoard(Player2.Board.Yours); 
console.log("Player 1: " + Player1.OutputAll()); 
console.log("Player 2: " + Player2.OutputAll()); 

// If user asks for the home page 
if(request.method == 'GET' && request.url == '/') { 
    console.log('Successfully requested Home Page'); 

    // Write a header response 
    response.writeHead(200, {"Content-Type": "text/html"}); 

    fs.createReadStream("./public/index.html").pipe(response); 
} else{ 
    send404Error(response); 
} 
} 

// 404 Error 
function send404Error(response){ 
// Write a header response 
response.writeHead(200, {"Content-Type": "text/plain"}); 
response.write("The page you are looking for could not be found!"); 
response.end(); 
} 

http.createServer(onRequest).listen(3000); 
console.log("Server running..."); 
+0

不知道,但尝试用'board.js'代替'./board' –

+0

我可以访问电路板模块,因为我可以做Player1.Board.DisplayBoard,它给我看板子。一旦我添加了placeShip功能它是一个不行。 – Peavey2787

+0

尝试在主js文件中要求板模块。 –

回答

1

我们需要在用户模块中使用电路板模块,所以最好的方法是将电路板模块作为参数传递给用户,并要求在主文件app.js

app.js:

var board = require("./public/scripts/board"); 
var Users = require("./public/scripts/Users")(board); 

用户模块

var User = function(board){ 
    return{ 
    Board: new board; 
    } 
} 

移动董事会的功能,改变你的this.Board.Mine内placeShip功能this.Mine

+0

欲了解更多详情,请参阅此[问题](http://stackoverflow.com/questions/13039825/how-to-use-one- module-feature-within-another-module-in-nodejs-require) –

+0

我可以像使用Player1.DisplayBoard()一样在用户模块中使用主板模块,它向我展示了主板。我不能做的是访问板子模块中的函数placeShip。 – Peavey2787

+0

我试过移动Board功能里面的一个属性来做功能,但是后来我得到了placeShip没有定义的 – Peavey2787

0

app.js可以创建一个裁判child1,等等的child2此Ref将允许对孩子的功能呼叫...

child1可以通过fireing事件调用它的兄弟姐妹中的一个功能:app.js还可以在child1触发的事件,等的child2

window.addEventListener('child1.event1', function() { $ref.child2.func2(options)} 

的传递调用链是“听” (app.js)

+0

如何在app.js中引用child 2?从我的理解,我需要来电者成为一名球员,以便玩家的董事会得到更新 – Peavey2787

相关问题