2009-01-25

JVD04FLEX 河洛之數

題目敘述 : 

河洛之數

請設計一程式,運用陣列,迴圈及亂數來排列出數字範圍 1 ~ 9
且為 3 X 3 的數字矩陣,其縱向 橫向 對角線之 3 個數字總和皆
為 15 ,每次執行之矩陣排列皆不相同,並於命令列中列出該矩陣
之數字排列

1.矩陣內之數字皆不能重複出現
2.程式每次執行矩陣數字排列皆不相同
3.矩陣中之縱向橫向對角線數字之總和皆為 15

評分:

1.矩陣內之數字皆不能重複出現 - 2 分
2.程式每次執行矩陣數字排列皆不相同 - 3 分
3.矩陣中之縱向橫向對角線數字之總和皆為 15 - 10 分

總分 15 分

Author: 山羊
URL: http://gjo4rul4.blogspot.com

by Author :

題目原本是利用亂數取 然後比對三個數字相家是否為 15 的迴圈
但是這樣就只能比出 9 個的河洛之數
所以我就改成可以讓使用者輸入維度 自動產生河洛之數
至於每次執行都會換 就只要將整個方塊旋轉 90 度就可以了
這個部份我就沒寫了

河洛之數的填入方式很有多種
我選了以下的方式
1.將數字 1 填入第一行的中間隔
2.下一個數字填入 上一個數字的上 (N-1)/2 右 (N-1)/2 的格子內
3.如果要填入的格子已經有數字了 就把數字填上一個數字的正下方的格子

幾個特別的地方
AS:
1.動態產生 DataGrid 的欄位內容
FLEX:
1.NumericStepper 的使用方法

-------------------------------
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="14">
<mx:Script>
<![CDATA[
import mx.controls.Text;
import mx.containers.VBox;
import mx.controls.Alert;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.DataGrid;
import mx.collections.ArrayCollection;
/*
題目敘述 :

河洛之數

請設計一程式,運用陣列,迴圈及亂數來排列出數字範圍 1 ~ 9
且為 3 X 3 的數字矩陣,其縱向 橫向 對角線之 3 個數字總和皆
為 15 ,每次執行之矩陣排列皆不相同,並於命令列中列出該矩陣
之數字排列

1.矩陣內之數字皆不能重複出現
2.程式每次執行矩陣數字排列皆不相同
3.矩陣中之縱向橫向對角線數字之總和皆為 15

評分:

1.矩陣內之數字皆不能重複出現 - 2 分
2.程式每次執行矩陣數字排列皆不相同 - 3 分
3.矩陣中之縱向橫向對角線數字之總和皆為 15 - 10 分

總分 15 分

Author: 山羊
URL: http://gjo4rul4.blogspot.com

by Author :

題目原本是利用亂數取 然後比對三個數字相家是否為 15 的迴圈
但是這樣就只能比出 9 個的河洛之數
所以我就改成可以讓使用者輸入維度 自動產生河洛之數
至於每次執行都會換 就只要將整個方塊旋轉 90 度就可以了
這個部份我就沒寫了

河洛之數的填入方式很有多種
我選了以下的方式
1.將數字 1 填入第一行的中間隔
2.下一個數字填入 上一個數字的上 (N-1)/2 右 (N-1)/2 的格子內
3.如果要填入的格子已經有數字了 就把數字填上一個數字的正下方的格子

幾個特別的地方
AS:
1.動態產生 DataGrid 的欄位內容
FLEX:
1.NumericStepper 的使用方法

*/
//將河洛之數塞入 ArrayCollection 中傳回
private function hardro(dimensions:int):ArrayCollection{

var numbers:int = dimensions * dimensions ;
var yNumbers:ArrayCollection = new ArrayCollection();

var currentX:int = 0;
var currentY:int = 0;
//先把陣列都填入 0
for(var dimension:int=0;dimension<dimensions;dimension++){
var xNumbers:ArrayCollection = new ArrayCollection();
for(var dimension2:int=0;dimension2<dimensions;dimension2++){
xNumbers.addItem(0);
}
yNumbers.addItem(xNumbers);
}
var flag:Boolean = true;
//開始填入河洛之數
for(var i:int=1;i<=numbers;i++){
if(flag){
//第一個數字 填入 X: 2 Y: 0 的位置
flag = false;
currentX = Math.floor(dimensions / 2);
currentY = 0;
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}else{
var oldX:int = currentX;
var oldY:int = currentY;
//如果下一格的 X 座標已經超過陣列索引 修改索引值
if(currentX + (dimensions-1)/2 > dimensions -1 ){
currentX = (currentX + (dimensions-1)/2) - dimensions;
}else{
currentX = currentX + (dimensions-1)/2
}
//如果下一格的Y 座標已經超過陣列 修改索引值
if(currentY - (dimensions-1)/2 < 0){
currentY = dimensions + (currentY - (dimensions-1)/2);
}else{
currentY = currentY - (dimensions-1)/2;
}

if((yNumbers.getItemAt(currentY)).getItemAt(currentX) == 0){
//如果這個格子還沒有被填入資料過 就塞入新的數字
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}else{
//格子已經被填過發生衝突

//把X索引值改回來
currentX = oldX ;
//但是Y索引值必須要 +1
currentY = oldY+1 ;
//如果Y索引超過範圍 修改索引值
if(currentY > dimensions-1){
currentY = oldY+1 - dimensions ;
}
//塞入數值
yNumbers.getItemAt(currentY).setItemAt(i,currentX);
}
}
}
//傳回陣列
return yNumbers;


}
private function clickHandler():void{
var userDimensions:int = this.userDimensions.value;

if(userDimensions %2 == 0){
//雙數的河洛不適合用這個公式 必須再寫另一個種喔 ~~
Alert.show("只可以輸入奇數 3 5 7 9 等等喔! ","錯誤!");
}else{
//開始計算河洛之數
//建立一個 DataGrid 準備塞入資料
var dg:DataGrid = new DataGrid();
//所有的欄位定義必須要先放入 Array 陣列中
var columns:Array = new Array();
//計算河洛之數的結果
var arg:ArrayCollection = hardro(userDimensions);
//建立所需的欄位資料
for(var i:int=0;i<userDimensions;i++){
var dataGridColumn:DataGridColumn = new DataGridColumn();
//欄位的資料是 dataProvider 的哪個欄位
dataGridColumn.dataField = i.toString();
//欄位寬度
dataGridColumn.width = 40;
//放入陣列中
columns.push(dataGridColumn);
}
//設定 dataGrid 的欄位內容
dg.columns = columns ;
//設定高度
dg.height = 27 * userDimensions ;
//關閉垂直捲軸
dg.verticalScrollPolicy = "off" ;
//不顯示欄位名稱
dg.showHeaders = false;
//加入資料提供者
dg.dataProvider = arg;
//這段是先建立個 VBOX 然後把 TEXT 與 dataprovider 放在一起
var vbox:VBox = new VBox();
var text:Text = new Text();
text.text = "此河洛之數不管直線橫線的總和皆為\n";
var tmp:int = 0;
for(var j:int=0;j<(arg.getItemAt(0)).length;j++){
tmp += (arg.getItemAt(0)).getItemAt(j);
}
text.text += tmp;
//把 DataGrid 與 text 加入 vbox 內
vbox.addChild(dg);
vbox.addChild(text);
//最後把他家在場景上
this.addChild(vbox);
}
}
]]>
</mx:Script>
<mx:Label text="河洛之數 FLEX 版"/>
<mx:HBox>
<!--數字選擇器 minimum:最小值 maximum:最大值 value:目前值 stepSize:遞增量-->
<mx:NumericStepper id="userDimensions" minimum="3" maximum="200" stepSize="1" value="3" />
<mx:Label text="欲建立的河洛之數 維度"/>
</mx:HBox>
<mx:Button label="執行" click="clickHandler()"/>
</mx:Application>

沒有留言: