主題

學習記錄➤ C# 堆疊 Stack 與鏈結串列 Linked list 之應用\大失敗/

Azer_ | 2022-04-04 15:27:59 | 巴幣 1004 | 人氣 134



課程目標中,老師讓我們用課程所教到的功能(陣列、堆疊、佇列、鏈結串列、物件導向)來嘗試做一個遊戲。開始發想前,我先對這些功能做個粗估的功能評斷。


功能發想

陣列:相同元素且連續的資料結構
鏈結串列:相同元素且不連續的資料結構
堆疊:相同元素資料的後入先出結構
佇列:相同元素資料的先入先出結構
物件導向:呼叫其他物件的概念

「陣列」就是其他結構的基礎,應用其他功能自然就會使用到陣列,因此拿陣列當作核心主題感覺沒料;「佇列」則讓我聯想到倉儲管理,但暫時對此還沒有什麼想法;「堆疊」讓我聯想到卡牌遊戲;「鏈結串列」的動態資料儲存讓我聯想到檢索;「物件導向」則與「陣列」相同,如果應用這些功能,自然就會使用到物件導向的概念。

乍看之下,讓我比較有聯想空間的就屬「鏈結串列」的檢索功能與「堆疊」的卡牌抽取,兩者比較有概念式連結,所以打算以這兩個功能做為主題,製作「卡牌遊戲的抽牌基礎」與「檢索牌庫功能並抽出卡牌」的功能。

那就大概來解釋一下我所「認知」的這兩個功能,以及我如何切入並試著應用,以及最後為什麼會失敗吧XD。


堆疊 Stuck

醜醜的小畫家,但基本上就是堆疊功能的整個概念。

堆疊。將資料有序的排列集合,並且只能對資料集合的頂端(Top)新增或移除資料。

特色:
1. 先入後出,後入先出。
2. 除頭尾節點之外,每個元素有一個前驅,一個後繼。

堆疊的概念很容易理解,從最頂端放入東西(Push)、又從最頂端拿走東西(Pop),在生活中無處不見,所以也很容易程式中聯想其應用。但由於堆疊的類別就只針對後進先出的資料類型做特化,比較難以跟其他類別做配合。


鏈結串列 Linked list

如果單看鏈結串列的結構,除了節點外,看似與普通的陣列無異。

鏈結串列。是一種存放資料的結構形式,他不需要「連續」的記憶體存放,可以不規則的存放資料。使用鏈結串列結構可以克服陣列鏈結串列需要預先知道資料大小的缺點,也能更有效利用電腦記憶體的空間,實現靈活的記憶體動態管理。

但如果記憶體中夾雜其他類型的資料,鏈結串列仍能利用節點特性搜尋下一筆目標資料。

由於可以不連續的存放資料,代表他必須在每個資料註記下一筆資料的「節點」,也因此每筆資料就會相較厚重。除了要追蹤下一個節點去往何處外,由於節點的特性,導致在撈資料時就必須串列頂端開始搜索,才能知道剩下資料的下落。因此,每筆資料中的節點就相當重要,失去節點即代表失去後續的整串資料。


功能預想

剛開始在規畫的時候先用小畫家拉個預想圖,清點功能與素材的規模。

場上有五個卡牌空位,右邊有一個10張的牌庫(牌號由1~10)

點擊牌庫,如果場上還有空位,就抽一張牌到卡牌空位。

使用卡牌,如果不是檢索卡牌(1~9),就會移除當前卡牌。
使用卡牌,如果是檢索卡牌(4),移除檢索卡牌,檢索一張7到場上;若無則移除檢索卡牌,檢索無效。


撞牆了

雖然陣列資料可以與兩者互通,但兩個功能之間卻不能互相轉換。

雖然陣列資料能夠在堆疊與鏈結串列的資料型態中互相轉換,但堆疊與鏈結串列兩者的資料結構卻不能互通。

這意味著如果我要存取一筆牌庫卡牌編號的資料,就要在「抽取卡牌」功能與「檢索牌庫」功能加入一筆原「陣列」的中間者,協助兩種資料結構的互相轉換。

理論上仍然可行,但是在建構過程中相當麻煩。

如果要實現功能,就必須讓陣列在兩種系列功能不斷轉換資料型態,非常麻煩。

希望可以避免這麼麻煩的流程,詢問他人有沒有更快得轉換方法,由於我是以製作卡牌遊戲功能的角度去發問,而不是兩者功能之應用的角度發問,回覆皆是幹嘛搞得這麼麻煩XDD。

乍看之下,應該可以兼容的功能,在程式邏輯上卻沒辦法很好的做搭配,甚至有其他功能也能夠更方便的達到效果,如:List 或是 Array 本身就可以完成卡牌抽取與檢索。但這又與結合並應用功能的初衷相互違背,所以後來就刪除檢索功能,變成只剩下抽牌的單調功能,以失敗收場。


\結合大失敗/

實際畫面,素材也是用小畫家弄得。

結合應用成果會以失敗告終,其實在製作過程中就有隱約預知了,邊做邊查資料的時候就覺得轉換層面相當麻煩。

所以最後就只剩下抽牌功能了,後來與朋友討論鏈結串列的核心概念到底何在時,提出了「極端的節省空間」的概念,確實鏈結串列的存在便是為了動態管理記憶體之空閒空間,迴避了創建陣列就必須立刻規劃一整區空間供給使用的缺點。

或許以更大規模等級的伺服器機房或是工業等級的大量資料存取可能需要節省記憶體空間(許多零碎的閒置空間加總起來還能存放許多資料。)但是在遊戲上來說,好像沒有必要這麼極端的節省記憶體,這也能解釋為什麼我在聽課起來,完全沒有實現成遊戲系統的概念影子。


那大概就這樣了,這只是一段學習紀錄,不是真正應用的例子,如果我的觀念有啥錯誤再麻煩指出,不然我這輩子應該沒機會再複習這些功能了ㄏㄏ。

送禮物贊助創作者 !
0
留言

創作回應

岩王帝君的 %%鼠
加油[e19]
感覺鏈結串列也不是為了省空間啦,因為每筆資料開頭都要多一個紀錄上一筆位置的,還有一種雙頭鏈結串列是要花兩個空間紀錄頭尾位置。 相較之下一開始就固定大小的array只要記錄一筆長度就好。
2022-05-23 00:27:33
追蹤 創作集

作者相關創作

相關創作

更多創作