8皇后问题

时间:2011-01-12 13:52:53

标签: actionscript-3

我正在尝试解决8皇后问题(你选择一个空间,它会放下8个皇后,这样它们就不会互相撞击)但是我在制作国际象棋棋盘时遇到了麻烦。

现在我有了这个

var chessBoard:Array = new Array(); 

chessBoard["row1"] = [1,0,1,0,1,0,1,0]; 
chessBoard["row2"] = [0,1,0,1,0,1,0,1]; 
chessBoard["row3"] = [1,0,1,0,1,0,1,0]; 
chessBoard["row4"] = [0,1,0,1,0,1,0,1]; 
chessBoard["row5"] = [1,0,1,0,1,0,1,0]; 
chessBoard["row6"] = [0,1,0,1,0,1,0,1]; 
chessBoard["row7"] = [1,0,1,0,1,0,1,0];
chessBoard["row8"] = [0,1,0,1,0,1,0,1];

我需要知道两件事

a)我是否可以将此问题用于解决问题(我是否可以检查任何皇后是否会因阵列坐标而碰撞)

b)我如何在国际象棋棋盘上画出正方形以对应数字

3 个答案:

答案 0 :(得分:2)

var chessBoard:Array = new Array(); 
// Setup the array
for(var i:int = 0; i < 4; i++)
{
    chessBoard.push(new Array(1,0,1,0,1,0,1,0));
    chessBoard.push(new Array(0,1,0,1,0,1,0,1));
}

// Size of the tile
var tileSize:int = 20;

function createChessBoard():void
{
    // Itterate through the "chessBoard"-array
    for(var i:int = 0; i < chessBoard.length; i++)
    {
        // Itterate through the arrays in the "chessBoard"-array
        for(var j:int = 0; j < chessBoard[i].length; j++)
        {
            // Create new tile
            var tile:Sprite = new Sprite();
            // Create the color variable and check to see what value to put  
            // in it dependingin the value of the current itteration - 1 or 0
            var tileColor:int = chessBoard[i][j] * 0xffffff;

            // Tile-coloring-setup-thingie-routine
            tile.graphics.beginFill(tileColor);
            tile.graphics.drawRect(0, 0, tileSize, tileSize);
            tile.graphics.endFill();

            // Tile positioning
            tile.x = j * tileSize;
            tile.y = i * tileSize;

            // Adding tile to the displaylist
            addChild(tile);
        }
    }
}

// Run function
createChessBoard();

答案 1 :(得分:1)

当坐标的总和为奇数时,您可以假设该单元格是黑色的,如果是偶数,则可以假设为白色:

function getColor(x, y) {
  return (x + y) % 2 == 0 ? 0 : 1;
}
// or even
function getColor(x, y) {
  return (x + y) % 2;
}

答案 2 :(得分:1)

您可以从创建Square类开始,这样您就可以为每个Square提供特定的属性。你想避免在一个正方形上放两块,你想设置颜色,你也需要知道坐标,如a1,c4等...

要绘制棋盘,您可以创建一排方块。

    private function squares:Array = [];

    private function addRow( black:Boolean , _y:int , rowName:String ):void
    {
        for( var i:int ; i < 8 ; ++i )
        {
             var sq:Square = new Square();

            //alternate colors
            if( black )
                sq.color = 0;
            else
                sq.color = 0xffffff;
            black = !black;

            sq.x = i* sq.width;
            sq.y = _y;

            //save square Chess coordinates
            sq.coord = {letter: rowName , number: i + 1}

            addChild(sq);
            //add the Square instance to an Array for further reference
            squares.push( sq );
        }
    }

然后只需添加行

     private function createBoard():void
     {
          var black:Boolean;
          var letters:Array = [ a , b , c , d , e , f , g , h ]

          for( var i:int ; i < 8 ; ++i )
          {
               addRow( black , i * squareSize , letters[i] );
               black = !black;
          }
     }

要将Queen添加到特定的Square实例,请使用square array。