2017-05-17 7 views
3

私はOOPのjavascriptでデモゲームチックタックトウを作成します。しかし、私はその後、console.log();console.log()の表に値を表示する方法は?

でテーブルを表示する値を添付したテーブルでGET値に問題がある。これは私のコードです:


/** 
* @constructor 
* @param {Number} width - dimension width for table 
* @param {Number} height - dimension height for table 
*/ 


function Table(width, height) { 
    this.table = new Array(height * width); 
    this.width = width; 
    this.height = height; 
} 

Table.prototype = { 
    /** 
    * Representation for get width of table 
    */ 
    getWidth: function() { 
    return this.width; 
    }, 

    /** 
    * Representation for get height of table 
    */ 
    getHeight: function() { 
    return this.height; 
    }, 

    /** 
    * Representation for get table array 2d 
    */ 
    getTable: function() { 
    var x = new Array(this.getHeight()); 
    for (var i = 0; i < this.getHeight(); i++) { 
     x[i] = new Array(this.getWidth()); 
    }; 
    }, 

    /** 
    * Representation for set position of table 
    */ 
    setPosition: function (x, y, ch) { 
    return this.table[x][y] = ch; 
    }, 
は、私がここで問題にそれを持っています。私はテーブルで値を得ることができず、isEmptyをチェックする。

/** 
    * Representation for get value detail at cell of table 
    */ 
    getValueAt: function (x, y) { 
    return this.table[x][y]; 
    }, 

    /** 
    * Representation for check empty conditional 
    */ 
    isEmptyAt: function (x, y) { 
    if (!this.table[x][y]) 
     return true; 
    }, 
}; 

/** 
* @constructor 
* @param {String} character - X or O 
*/ 
function Player(name, ch) { 
    this.name = name; 
    this.ch = ch; 
} 

var Printer = function() { 
}; 

これはconsole.log関数印刷表示です()。

Printer.prototype = { 
    /** 
    * Representation print table 
    */ 
    printTable: function (table) { 
    var str = ''; 
    for (var i = 0; i < table.width; i++) { 
     var x = i; 
     for (var j = 0; j < table.height; j++) { 
     var y = j; 
     str += '' + table.getValueAt(x, y) + '|'; 
     } 

     str += '\n------------\n'; 
    } 

    console.log(str); 
    }, 

    /** 
    * Representation check winner conditional 
    */ 
    printWinner: function (player) { 

    }, 
}; 
Math.floor(Math.random() * 2); 

/** 
* @param newTable [array] : The array two-direction table 
* @param player [object] : the object contain player X and O 
*/ 
var GamePlay = function (table, playerOne, playerTwo) { 
    this.table = table; 
    this.playerOne = playerOne; 
    this.playerTwo = playerTwo; 
    this.printer = new Printer(); 
}; 

GamePlay.prototype = { 

    run: function (x, y) { 
    console.log('Game start ...!'); 
    x = Math.floor(Math.random() * 2); 
    y = Math.floor(Math.random() * 2); 

    this.putChessman(x, y, this.playerOne.ch); 
    console.log('put', this.putChessman()); 
    this.printer.printTable(this.table); 
    }, 

    /** 
    * @param player [keywork] : the keywork X and O 
    */ 
    checkWin: function (player) { 

    }, 

    putChessman: function (x, y, ch) { 
    console.log('isEmptyAt', table.isEmptyAt(x, y)); 
    if (this.table.isEmptyAt(x, y) === true) { 
     console.log('@ player ' + ch + ' put'); 
     this.table.setPosition(x, y, ch); 
    } else { 
     console.log('@ Other player already put on it'); 
    } 
    }, 

}; 

var table = new Table(3, 3); 
var playerOne = new Player('playerOne', 'O'); 
var playerTwo = new Player('playerTwo', 'X'); 
var game = new GamePlay(table, playerOne, playerTwo); 
game.run(); 

私はあなたが正しくtableを初期化していない

+0

2次元配列のようにテーブルにアクセスしますが、そのように初期化しません。新しい配列(高さ*幅)。これはwidth * heightが評価され、結果の長さを持つ1次元配列が作成されることを意味します。たぶんそれはすでに問題です...そうでなければ:あなたが得るエラーを投稿できますか? – Fuzzzzel

答えて

3

-.-問題を解決してください。

this.table = new Array(height * width); 

を...しかし、後でこのようにそれを使用しようとしている:あなたはこれをやっていることのようにそれを使用するには

this.table[x][y]; 

を、あなただけの配列が、配列の配列をする必要はありません(JavaScriptは2次元配列に相当します)。サブアレイ内のエントリは、(例えば、this.table[0][0])* undefinedなること

this.table = []; 
for (var x = 0; x < width; ++x) { 
    this.table[x] = new Array(y); 
} 

注:配列の配列を初期化するには、これを行います。それがあなたが望むものなら(それはisEmptyAtと一緒に働くでしょう)、それはいいです。あなたがそれらを別の値を持っているしたい場合は、でそれを埋めるために必要があります。

this.table = []; 
for (var x = 0; x < width; ++x) { 
    this.table[x] = []; 
    for (var y = 0; y < height; ++y) { 
     this.table[x][y] = theValueGoesHere; 
    } 
} 

別に:それはtrueを返すときisEmptyAtのみ値を返すためisEmptyAtを呼び出すと、trueまたはundefinedのいずれかになります。それ以外の場合は何も返しません。呼び出した結果はundefinedです。代わりに、私はそれが明示的に両方のケースで何かを返す必要があります:

isEmptyAt: function(x, y) { 
    return !this.table[x][y]; 
} 

を*技術的には、new Array(height)と、エントリがすべてでありされません。 lengthの配列がheightであるにもかかわらず、追加するまでは何も入力されません。しかし、エントリを取得しようとすると、値undefinedが得られるので、説明を簡単にするためにちょっとした説明をしました。

+0

あなたの答えをありがとう。 しかし、私は関数 'isEmptyAt'が動作しないことを試みます。詳細を解決するのを手伝ってください。 ありがとうございました。 –

+0

@TrầnHạnh:コードに他の*問題がある可能性があります。ブラウザに組み込まれているデバッガを使用して、これらの問題を解決してください。徹底的な研究と[検索](/ヘルプ/検索)を行った後で解決できない*具体的な問題が見つかった場合は、必要に応じてその問題に関する別の質問を投稿してください。 –

+0

ありがとうございました。私は問題を見つけてそれを修正する。 :) –

関連する問題