技術探索: 再次在 Windows 8 創作六合彩程式 (包括源碼)

兩年前曾經介紹過在 Windows 8 創作六合彩程式的感覺,當時 Win8 還是測試版,今日已經是Windows 8.1 的 Update 1 了,新版比較舊版速度更快、所需記憶更少、滑鼠與鍵盤支援更多,而最大改良的還是開發工具,微軟在四月的開發者發佈會 (MS Build 2014) 即場正式啟動 WinJS 為開源碼 (Open Source),此舉今我有興趣在 WinJS 再次創作六合彩程式,目的是比較兩年前 (HTML5 + Javascript) 及今次 (WinJS) 的創作分別。

(附註:WinJS 是由微軟為程式創作人提供的免費開發框架,用來開發 Win8 Apps,可以放到 Windows Store 售賣,現在還可以在其它瀏覽器、 iOS 或 Android 執行)

微軟也提供了免費的程式開發環境工具 Visual Studio Express for Windows,當下載、安裝及註冊 (只需電郵地址便可) 之後,便可執行它:

首先建立一個新 MarkSix 項目 (New Project):

然後出現以下畫面,請跟著次序動作:




Visual Studio 會自動建立整個基本程式,我們可以馬上執行它,來看看一個基本 App 的樣式:


出現以下基本 WinJS 程式畫面:


(按 Alt + F4 離開這基本程式)

留意本程式是 Navigation App,意味著是多頁式,Visual Studio 已為我們建立了首頁,並放在源碼資料夾 pages 內:


我們可以看到當中包括有 CSS、HTML 及 JS 檔案 (這正是網頁設計師見慣見熟的檔案)。跟著續一改變內容,首先是 home.html (目的是加入一個按鈕,按下該按鈕後便會跳到第二頁),步驟如下:

在 Home.html 把原本 <section aria-label="Main Content"> 內的程式碼:


改為:
<section aria-label="Main content" role="main">
  <h2>歡迎使用六合彩號碼產生程式</h2>
  <br />
  <br />

  <!-- 加入按 -->
  <button id="genNumber">開始產生號碼</button>
</section>


跟著是改變 home.js 內容:


Copy & Paste 取代為以下程式碼
ready: function (element, options) {
  // 當按鈕按下時,會
執行 onBtnGenNumber()
  document.getElementById("genNumber").addEventListener("click", this.onBtnGenNumber, false);
},


// 收到按鈕按下動作,並把網頁轉移到 page2.html
onBtnGenNumber: function (eventInfo) {
  eventInfo.preventDefault();
  WinJS.Navigation.navigate("pages/page2/page2.html");
}


接著加入一張新網頁 (第二頁) 到程式,第二頁的工作是產生 6 個隨機數 (Random Number),先建立新資料夾:


新資料夾命名為 page2,並建立3個檔案 (選擇):


新的3個檔案名稱分別是 page2.css、page2.html 及 page3.js,結果如下:


然後把以下內容 Copy & Paste 到 page2.css (為 page2 定義外表如顏色、距離):
.page2 section[role=main] {
  margin-left: 120px;
  margin-right: 120px;
}

.listviewpivotitem.win-pivot-item .win-pivot-item-content {
  /* Stretch across the whole width of the screen so the whole thing is pannable.*/
  padding: 0;
  margin: 0;
  width: 100%;
}

.win-listview {
  height: 100%;
}

#pivotNumbers .win-listview .win-container {
  margin: 0;
  padding: 0 0 20px 0;
}

#pivotNumbers .win-listview .win-item {
  margin: 0 20px 0 0;
  width: calc(100% - 20px);
}

#pivotNumbers .win-listview.win-rtl .win-item {
  margin: 0 0 0 20px;
}

.showItem h2 {
  line-height: 1.3;
  font-size: 48pt;
}

.showItem h5 {
  font-size: 32pt;
}

.numbers {
  white-space: nowrap;
  overflow: hidden;
}


接著 Copy & Pages 以下內容到 page2.html (取代現有內容):
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Show Number</title>

  <!-- WinJS references -->
  <link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
  <script src="//Microsoft.WinJS.2.0/js/base.js"></script>
  <script src="//Microsoft.WinJS.2.0/js/ui.js"></script>

  <link href="page2.css" rel="stylesheet" />
  <script src="page2.js"></script>
  <script src="PageObjects.js"></script>
</head>
<body>
  <div class="page2 fragment">
    <header aria-label="Header content" role="banner">
      <button data-win-control="WinJS.UI.BackButton"></button>
      <h1 class="titlearea win-type-ellipsis">
        <span class="pagetitle">六合彩號碼為:</span>
      </h1>
    </header>

    <div id="showNumbersTemplate" data-win-control="WinJS.Binding.Template">
      <div class="showItem">
        <h5 class="numbers win-pivot-slide1" data-win-bind="innerHTML: numbers"></h5>
      </div>
    </div>

    <section aria-label="Main content" role="main">
      <div id="pivotNumbers" data-win-control="WinJS.UI.Pivot" data-win-options="{ title: 'Numbers', selectedIndex: 0 }">
        <div class="listviewpivotitem" data-win-control="WinJS.UI.PivotItem" data-win-options="{ 'header': 'all', managedLV: true }">
          <div id="numbersListView"
               data-win-control="WinJS.UI.ListView"
               data-win-options="{ itemDataSource: sixNumbers.itemList.dataSource, layout: { type: WinJS.UI.ListLayout }, itemTemplate: showNumbersTemplate, selectionMode: 'none' }">
          </div>
        </div>
      </div>

      <button id="regen">重新產生號碼</button>
    </section>
  </div>

</body>
</html>


接著 Copy & Pages 以下內容到 page2.js:
(function () {
  "use strict";

  WinJS.UI.Pages.define("/pages/page2/page2.html", {
    ready: function (element, options) {
      // 當按鈕按下時,會執行
onBtnRegenNumber()
      document.getElementById("regen")

        .addEventListener("click", this.onRegenNumber, false)
    },

    unload: function () {
    },

    updateLayout: function (element) {
    },

    // 收到按鈕按下動作,便產生另一組隨機數,並顯示到網頁
    onBtnRegenNumber: function () {
      var obj = new PageObjects.MarkSixObject();
      obj.genNumbers();
      obj.buildDataSource();
      obj.refreshListView();
    }

  });
})();


以上程式碼都只針對網頁顯示部份,並未包括六合彩號碼產生程式碼。以下介紹在 WinJS 之下, 如何建立物件導向 (Object-Oriented) 的標準方法,WinJS.Class 提供了基本架構,以下程式碼就是利用這架構來建立六合彩號碼產生程式。

在 page2 資料夾建立多一個 Javascript 檔案,檔案命名為 PageObjects.js:



然後 Copy & Paste 以下程式碼到 PgeObjects.js:
"use strict";
/*
本檔案是定立借=不同 Javascript Objects 來處理不同功能
*/
WinJS.Namespace.define("PageObjects", {
  // 物件1:六合彩號碼產生物件
  MarkSixObject: WinJS.Class.define(
    function () { // 物件構造預設功能
      this.numbers = [];
    }, {
      // 製作隨機數功能
      genNumbers: function() {
        // 製作6個隨機數
        var MAX_NUMBERS = 49;
        this.numbers = [];
        for (var i = 0; i < 6; ++i) {
          var num;
          do {
            num = 1 + parseInt(Math.random() * MAX_NUMBERS);
          } while (this.numbers.indexOf(num) >= 0); // 防止重複
          this.numbers.push(num);
        }

        // 把6個隨機數由細至大排列
        this.numbers.sort(function(a, b) {
          return a - b;
        });
      },
      buildDataSource: function() {
        // 建立數據源
        var dataArray = [
          { numbers: this.numbers.join(', ') }
        ];
        var dataList = new WinJS.Binding.List(dataArray);
        WinJS.Namespace.define("sixNumbers", { itemList: dataList });
      },
      refreshListView: function() {
        // 把數據源放到 ListView 以顯示6個隨機號碼
        var lView = document.getElementById("numbersListView").winControl;
        lView.itemDataSource = sixNumbers.itemList.dataSource;
      }
    },
    null
  )
});

// 網頁即時執行功能
(function () {
  var obj = new PageObjects.MarkSixObject();
  obj.genNumbers();
  obj.buildDataSource();
})();


整個程式完成了,可以看看結果如何,按 F5 執行它,出現以下結果:

(附註:整個程式源碼,可按此下載,17KB)

總結:

WinJS 提供程式的基本樣式及動感效果,程式寫法與普通網頁相似,但不同的地方是以 Natvie Speed 執行 (比其它 WebApp 在瀏覽器內執行較快),考慮到程式不單只在 Windows 8 電腦中執行,還有平板電腦 Microsoft Surface (最平港幣 $2,000),還可在 Windows Phone 8.1 中執行,(例如 Nokia Lumia 525 只不過 $1,080),開放源碼後更可製作成 WebApp,如懂得使用 CordovaPhoneGap 的話,便可以變成 iOS 或 Android App,橫跨所有平台,值得推薦。

-------------------
各位如果對本網誌有興趣的話,請在畫面右邊成為追蹤者,日後有新網誌時 Blogger.com 會自動通知,多謝支持(聲明:電郵由系統發出,電郵地址不會給予及不經作者)

留言