Claire Chang

  • ,

    [5 – 遊戲邏輯] 圖形連線消除邏輯發想

    搜尋邏輯思考 在連連看裡面,連線的線條不可超過兩個轉彎處,兩個轉彎處的意思,代表連接的線最多只能由三條直線來組成。 這時候我們來思考該如何找出這兩點間所存在的那條線。先觀察一下棋盤,最多三條直線,代表有可能是一條直線、兩條直線或三條直線來做連接的。 不論如何,兩個點之間的那條線,一定一邊是從第一個點(A)開始,到另一個點(B)結束,因此,可以視為這兩個點之中,有可能存在A點連出的的(C)點與B點連出的(D)點,來形成連線。 由上圖我們可以觀察出,A點連出的的(C)點絕對是和開始的(A)點在同一行或同一列,B點連出的(D)點絕對是和結束的點(B)點在同一行或同一列。 尋找可能的線的模型 首先,我們來畫出所有有可能連出來的線圖形狀,再來思考該如何去撰寫消除邏輯。 判斷是否存在此圖形的連線 從上面的圖型我們先來分析向左、上、下、右的邊消的情況,要如何去搜尋可能存在的路徑。 讓我們先看這張圖 圖中的(A)為起始點,(B)為終點,(C)為(A)點最左能走到的點,(D)為(B)點最左能走到的點。則淡紅色漸層的部份,就是存在著可能的路徑。 這個可能連線的區塊的座標應為: 左上(A.x,D.y)、右上(A.x, B.y)、右下(D.x,D.y)、左下(B.x,B.y)。 我們應該要取A_C與B_D的橫向座標(y)中,有交集的部份。 因此這部份的邏輯程式應為 同樣的模型可以套用在向左、向上、向右、向下。 我們可以發現,左右直連可視為A點與C點相疊、B點與D點相疊的向上/向下消除,上下直連亦同。轉折連接可視為A與C或者B與D其中有兩個相疊,另兩個不相疊。都可以用相同的演算法來找出路徑 無法用相同的方式找出來的圖形有這兩個 先來繪製出有可能可以連線的區域 由上圖可知,我們需要找A、B點之間在左邊的(A)點往右可走最多的那個(C)點,然後找A、B點之間在右邊的(B)點往左走最多的(D)點。 然後取出A_C與B_D中y有交集的地方,為有可能可以連線的區域 這部份的邏輯程式碼為 if (pointA.y…

  • ,

    [4 – 遊戲邏輯] 產生初始盤面

    棋盤設計 用一個陣列來代表盤面,裡面儲存1~N來代表不同的圖形 隨機產生盤面 觀察連連看遊戲裡,同樣的圖形通常會有四個,因此如果盤面是10×10的話,總共會有100的icon,一種icon會有四個,則代表會有25種不同的icon。 一開始為了方便測試,先製作6*6=36的棋盤,這樣會有36/4=9種不同的icon。 var boardContent = [1,2,3,4,5,6,7,8,9]; //產生初始局面 boardContent = boardContent.concat(boardContent).concat(boardContent).concat(boardContent).sort(() => Math.random() > .5); boardContent = [boardContent.slice(0,6), boardContent.slice(6,12), boardContent.slice(12,18), boardContent.slice(18,24), boardContent.slice(24,30), boardContent.slice(30,36)];…

  • ,

    [3 – 環境設定] 開發環境介紹

    VS Code Visual Studio Code(簡稱VS Code)是一個由微軟開發的IDE,它最大的優點就是它是完全免費且Open Source的。它支援偵錯,並內建了Git版本控制功能,同時也具有開發環境功能。我個人覺得他在算是滿方便好用的,自動提示、自動補完和顏色選擇功能都很強大。 這邊是下載連結:Download Visual Studio Code NPM NPM 是 Node Package Manager 的簡稱,它是一個線上套件庫,可以下載各式各樣的 Javascript 套件來使用。 過去如果我們想要使用jQuery,就會需要去下載一個JQuery的Library檔案放進專案目錄裡。但是當這樣的Library庫檔案越來越大,而且越來越多時,就會較難管理,也會造成svn或git等版本管理系統要多去管控一些根本不屬於這個專案的程式碼,Library之間的版本管理也會較為困難。另外很多元件庫或許只需要在開發時期用到,在部署時不需要用到。這些都會讓套件的管理增加複雜度。因此現在大多數的前端工程師都會使用npm來做套件管理的工具,能夠解決上述的那些問題。 安裝npm要先去安裝Node.js。Node.js 在 0.6.3 版本開始內建…

  • ,

    [2 – 演算法] 演算法介紹

    何為演算法 演算法的簡單定義:輸入 + 演算法 = 輸出 這一篇文章有非常詳細的介紹演算法是什麼:初學者學演算法-談什麼是演算法和時間複雜度 一般判斷演算法的好壞是使用『空間複雜度』和『時間複雜度』來評估, 時間複雜度 所謂時間複雜度,指的是執行一段演算法,跑完整個運算邏輯所要花的時間。 雖然這個複雜度名為『時間複雜度』,但實際上,我們要真正衡量某個演算法時,是以步驟次數來看。 如果一個演算法執行的步驟是固定的,無關輸入的值而改變,那我們會記成 O(1),例如: function(int n){ print(n); } 而下面這個演算法: function(int n){ for(i=0;i

  • ,

    [1 – 前言] 連連看遊戲開發

    連連看遊戲起源 遊戲《連連看》顧名思義就是找出相關聯的東西連起來,做關連配對的一種益智遊戲。 最早是使用在幼兒教育的教具上,由於玩法簡單,常用作兒童啟蒙教育遊戲,建立兒童對物品之間的關連性連結。有一種字圖連連看,是專供幼童識字認圖的遊戲,與一般連連看不同的是它並非以一對相同圖案成對,而是以字配圖成對。相關內容連連看則是以兩張內容相關的卡片(可以是字或圖)配成對代替相同圖案。 後來出現了桌面遊戲的連連看,最早期的形式是一副卡片中每種圖案有相同的兩張,先洗牌,然後排好卡片,背面朝上,玩家輪流揭開卡片,每次揭兩張,如兩張圖案不同則回復背面朝上的狀態,如揭到兩張圖案相同則取走卡片,到桌上所有卡片都被取走時即結束遊戲,手上最多卡片者為勝利者。 隨著電腦的普及,連連看遊戲也成為一款經典的電腦小遊戲。在電腦遊戲中的一種規則則是在找到兩幅相同圖案後,若能用三條以內的直線將兩幅圖案連接起來,分別點一下兩幅圖案,即可消除。連連看遊戲後來經歷了桌面遊戲、在線遊戲、社交遊戲三個過程。 連連看電腦版最初是由台灣的陳一進和簡誠志從街機里的四川省(四川麻將)和中國龍改進、移植到PC上的,現在有了各種不同的版本。 台灣的連連看流入大陸以後風靡一時,也吸引眾多程式師開發出多種版本的連連看,其中kawai所開發的《寵物連連看》受到很大的歡迎。隨著Flash應用的流行,網上出現了多種線上Flash版本連連看。如:水晶連連看、果蔬連連看、阿達連連看等,連連看以簡單不無聊的遊戲特色吸引了一大批的女性玩家。2008年,隨著網際網路的普及和開放平台的興起,《連連看》被引入了社交網站,與個人空間相結合,被快速的傳播,成為一款熱門的社交遊戲。 益智遊戲發展介紹 益智遊戲可以是一人玩家,也可以是多人對戰。 連連看是一種益智型遊戲,屬消除型益智遊戲。益智遊戲要求玩家用自己的智慧來解決遊戲中的難題,達到過關的目的。新的商業遊戲通常會加上動作要素,要讓玩家手腦並用,訓練協調性,經典的代表作有俄羅斯方塊、泡泡龍系列、憤怒鳥、Candy Crush以及幾年前很紅的2048。傳統的益智遊戲以動腦為主,如數獨、推箱子等。這類遊戲對玩家而言較難過關,導致大量玩家中途放棄。 後來俄羅斯方塊出現,為落下型遊戲始祖,此遊戲最初是由阿列克謝·帕基特諾夫在蘇聯設計和編寫。此遊戲除了成為一個熱門的家用電腦和街機遊戲外,還成為Game Boy史上最受歡迎的遊戲。《電子遊戲月刊》在2007年將此遊戲列為「最偉大的100個遊戲」中的第1位。直到今日,俄羅斯方塊是有史以來最暢銷的電子遊戲。 最新的許多益智遊戲結合了消除型與落下型遊戲的特色,利用落下隨機元素增加了遊戲的隨機性,並增加遊戲特殊道具,讓遊戲更加有趣。如Candy Crush便為一例,Candy Crush與連連看相同皆為消除遊戲,三個相同顏色的方塊可以互相消除,並會隨機落下新的不同顏色的方塊,特殊的消除模式可以產生特殊道具。這樣的遊戲方式有挑戰性,而且適合打發時間,因此成為Facebook平台上最受歡迎遊戲,擁有4億5千6百萬每月玩家。 後來的神魔之塔、Dragon Puzzle更結合了角色扮演與卡牌遊戲及線上對戰的特色,使得益智型遊戲的樣貌更加的多元化。植物大戰殭屍則添加了即時戰略遊戲及卡牌遊戲的特色,讓益智型遊戲的面向變得更多元化,此作品獲得了相當正面的評價,在GameRankings的評分達到89.5%,Metacritic的評分則是88。 下圖為不同遊戲中所包含的遊戲性元素: 由上圖可知益智型遊戲在現今的手機市場上,因手機版面限制與操作便利性的關係,益智遊戲比起傳統RPG遊戲或動作遊戲在手機市場上占上更多的優勢。也因著益智遊戲的市場越來越大,後期的益智遊戲所包含的遊戲元素的面向越來越廣,不論是卡牌元素、即時戰略遊戲元素、操作手感元素等,都可以讓遊戲的趣味性更加提升,線上多人遊戲的模式更能增加玩家的黏著度。 設計一款有趣的益智遊戲,其中的演算法設計十分重要,例如物理遊戲的物理公式設計、相消遊戲的消除條件、每個關卡的過關條件、道具設計、遊戲競爭性,上述的每一個項目若能夠越符合大自然的法則,會讓玩家玩起來更加的直覺,也是遊戲好玩的必要關鍵。當然開發一款大型的遊戲,美術、音效、程式、企劃缺一不可,對於程式開發者而言,學習適合的語言工具也十分重要。這些與遊戲設計相關的元素,在這次的鐵人賽裡面,我都會在不同的章節裡提到。 連連看開發模式規劃 這一次的鐵人賽主題裡,我主要會分為兩個教學線。 主線為連連看遊戲邏輯的分析與程式碼撰寫,目標為撰寫出正確的邏輯,需能正確判別兩個圖形間是否存在小於兩個轉彎處的連線存在,並且能夠隨機產生隨機的遊戲牌面,以陣列來儲存遊戲現在的資料。 副線則為使用Pixi.js來實際開發一款具有畫面、效果及音效,真正具有遊戲性的網頁H5遊戲。…

  • ,

    單元測試 – 重構測試

    重構test的重要性 好的測試應該要容易維護,容易閱讀, 不應包含程式邏輯在內,因此像是if, while, for迴圈等都不應該出現在測試裡 如果我們驗證的內容會和資料有關,則建議使用Substitute,這樣可以讓我們能夠在每一個測試裡增加不同的資料 而且可以直接在每個測試裡看到資料的內容是什麼 下面是一個範例 private void AmountShouldBe(int expected, DateTime start, DateTime end) { IList data = new List() { new Budget()…

  • ,

    單元測試 – 隔離框架Substitute.For

    STUB的功能 這邊是NSubstitute的說明:http://nsubstitute.github.io/help/getting-started/ Substitute是.NET裡的一個隔離框架,若要使用,需要額外在測試專案用NUGET去安裝NSubstitute 1. 動態產生假物件 2. 模擬回傳值 3. 測試監聽事件 4. 驗證傳入參數是否正確 使用Subsitute(Sub) 使用方法如下 calculator = Substitute.For(); 設定呼叫某個方法應該回傳的值 calculator.Add(1, 2).Returns(3); Assert.That(calculator.Add(1, 2), Is.EqualTo(3)); 下面可以驗證是否Add這個FUNC有被呼叫到 calculator.Add(1, 2);…

  • ,

    單元測試 – Code Coverage的意義

    如何用Code Coverage來衡量單元測試的成果 在build的時候要自動去跑測試(使用CI,CD當作工具)> 大於0% 關心相對趨勢 大於 絕對數字,衡量相對的數字,評估code coverage的數值有沒有比昨天高,每一次針對PROD的程式碼修改都要加上測試,這樣這個數值只會往上不會往下。鼓勵持續的COMMIT > 持續整合,每天都要COMMIT個5~6次或7~8次。 那些測試的投資報酬率高:為什麼要寫測試?目標是要提升產品品質。假設這段PROD CODE沒有BUG,其實不需要為它寫測試。那什麼東西的投資報酬率最高? 1. 要修正的BUG(BUG越晚發現修正成本就更高) 2. 實務上常跑到的scenario 3. 最主要的情境 4.和錢有關的 5.和人命有關的(EX:自動駕駛系統) 6. 最常改到的CODE,可以避免被改錯 那code coverage的意義如下: 觀察沒有被含蓋到的情境:判斷要不要補測試…

  • ,

    單元測試 – 使用Fake Object

    抽取相依的物件並且覆寫 下面是一個範例,這個範例的SUT是Holiday.cs,如果今天是9/1就傳HappyBirthday,否則就傳No 因為單元測試應該要能夠具有隔離的特性,不可因為今天的日期不一樣而有不同的結果 所以”取得今天日期”,就會讓程式碼變得不可測試。 在下面的範例裡,我們可以看見如何使用假物件去測試不可測試的程式碼: Holiday.cs using System; namespace TestProject1 { public class Holiday { public string IsTodayJoeyBirthday() { var date = GetToday(); return (date.Month…

  • ,

    單元測試 – 寫測試的基本原則

    熱鍵 Alt+Enter: Quick+Action Ctrl+R,M 抽方法出來 code snippets / live template constructor: ctor property:prop console.writeLine)():cw ctrl+R,F: Extract Field Alt+Insert 循環剪貼簿:ctrl+shift+V 測試替身有下面三種 stub:不做驗證,單純只做模擬相依物件的行為 mock:一開始就要把所有的都定義清楚,應該要呼叫那個方法,所有的值一定要一模一樣,否則就會報錯(嚴格,敏感,不穩定) spy: 則是把所有的互動先做完,只驗要驗的,剩的沒有測就是都算過,差異是一個從嚴一個從寬。(寬鬆) 因此mock和spy本身含有驗證(Assertion),而stub本身只有在模擬相依的物件而已。…


17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。

如果你認同我或想支持我的努力,歡迎請我喝一杯咖啡!讓我更有動力分享知識!