成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 90 行 Haskell 代碼實現 2048 游戲

開發 開發工具
鑒于其設計中的根本性缺陷,我并不認為2048特別的有趣. 首先,你并不能在某個地方取得游戲的勝利. 其次,最有希望的游戲策略使得其玩起來相當的繁瑣,而且最大的樂趣并不是自己的游戲技能而是隨機數生成器制造的幸運連勝.

上個星期賴斯大學的MOOC 計算的規則 公開課在 Coursera 上開講啦. 從***周的材料來看,看起來它有了他們之前的課程 Python中的交互式編程介紹 所有優良的東西: 演示文稿做的很不錯,也有大量的支持可用, 而布置的作業也很有趣. ***個作業就是編寫 2048 游戲的邏輯. 

鑒于其設計中的根本性缺陷,我并不認為2048特別的有趣. 首先,你并不能在某個地方取得游戲的勝利. 其次,最有希望的游戲策略使得其玩起來相當的繁瑣,而且***的樂趣并不是自己的游戲技能而是隨機數生成器制造的幸運連勝. 就我個人而言,更愿意選擇那種有時被稱為“理論***”的游戲, 比如,游戲的一個屬性使得玩它的人能夠取得一個確定的勝利. 而2048的游戲結果卻沒有吸引到我,不過我也明白為什么會有人喜歡讓瓷磚四處滑動起來.

為游戲的邏輯編寫代碼是相當直接的。歸因于使用Python作為教學語言的計算原則課程, 對于在我的最初版本中的一個錯誤是由于python發生了改變,我不會感到奇怪. 我想著用Haskell寫這個東西可能會更有趣, 隨后就著手開始用這個語言編寫了2048的一個完整實現, 包括 I/O 處理. 整個代碼可以在 我的git賬號 上找到. 最終結果證明,更加完整的Haskell方案所需要的代碼比使用Python的程序邏輯要少幾行.

作為說明,如果你到這個頁面來只是為了找尋計算規則這門課程的Python作業的解決方案,那你就是在浪費時間. Haskell的實現和Python的實現很不同,使用的編程語言構造也不能在Python上用. 換言之,如果你正糾結這個作業,Haskell的源代碼將不會對你有所幫助.

在這篇文章中,我僅想著重強調游戲邏輯的核心部分,因為它很好地顯示了函數式編程的力量。首先,我定義一個數據類型,用于展示網格中的數字移動的方向,還有一個用于存放整數列表的列表的類型同義詞,用來提高類型特征的可讀性。從函數‘move’的命名可以明顯看出函數的作用;再下一步,將輸入作為一個網格的數字和移動方向,并產生新的網格。

  1. data Move = Up | Down | Left | Right  
  2. type Grid = [[Int]] 

2048這個游戲是在一個4x4的棋盤上進行的。開始位置在我的實現中是固定的:

  1. start :: Grid  
  2. start = [[0000],  
  3.          [0000],  
  4.          [0002],  
  5.          [0002]]  

棋盤上可以在4個方向上對數字進行移動,意味著所有的數字的移動都會向著一個指定的方向,如果是2個數字,移動相同的方向,以彼此相臨而告終,則他們合并到一起。舉例來說,在如下所示的起始位置,移動方向為‘Up’,結果棋盤變成了下面所示:

  1. [[0004],  
  2.  [0000],  
  3.  [0000],  
  4.  [0000]]  

如果網格中的起始位置移動方向為向右,則不會有任何變化。如果網格變化了,則一個新的數字會在任何空的格子中產生,這個數字可能是2或者4.

我們看這種方法,問題在于其如何更有效的建模。在網格中的任何行列,都可被理解為一個列表。行和列表之間的關系是簡單明了的。列將不得不提取、 修改,或雖然再,插入?;蛘咚麄儾恍枰?/p>

我寫了一個函數來合并一行或一列,表示為一個列表。首先,所有的0要被移動,然后該列表將被處理,合并相鄰元素,如果它們包含相同的數字,接著如果必要的話,為結果中填充0.

  1. merge :: [Int] -> [Int]  
  2. merge xs = merged ++ padding  
  3.     where padding          = replicate (length xs - length merged) 0 
  4.           merged           = combine $ filter (/= 0) xs  
  5.           combine (x:y:xs) | x == y    = x * 2 : combine xs  
  6.                            | otherwise = x     : combine (y:xs)   
  7.           combine x        = x  

當棋盤中的移動方心為左時,這個合并函數可以立刻被應用。其他方向的移動,然而,需要進行一些考慮,如果希望代碼保持簡潔。向右移動網格是通過采取反轉它之前將它提交給函數merge的每一行完成的,然后再次反轉結果:

  1. move :: Grid -> Move -> Grid  
  2. move grid Left  = map merge grid  
  3. move grid Right = map (reverse . merge . reverse) grid  
  4. move grid Up    = transpose $ move (transpose grid) Left  
  5. move grid Down  = transpose $ move (transpose grid) Right  

對于網格向上或者向下移動,如果你想提取出一列,對其應用合并函數,然后產生新的網格進行列的插入,這是極其痛苦的。相反,雖然一點點的線性代數知識,卻導致一個更優雅的解決方案。如果你不能立即明確如何移調導致所期望的結果,請看看下面的插圖。

  1. input       transpose   move        transpose  
  2.  
  3. 0 0         0 2         2 0         2 2 
  4. 2 2         0 2         2 0         0 0 
  5.  
  6.  
  7. 2 2         2 0         0 2         0 0   
  8. 0 0         2 0         0 2         2 2 

我Haskell的實現使用終端作為輸出。它不像Gabriele Cirulli版本的JavaScript前端一樣令人印象深刻,但它是可維護的,如下兩個屏幕截圖展示:

[[114632]]

[[114633]] 

總體來講,我對于這個原型還是很滿意的。當然有幾個可能的改進。一個分數跟蹤器的添加將是微不足道的,雖然一個 GUI 將是一個更加耗時的努力。如果有立即響應鍵盤輸入的程序,我會覺得這個很有趣。當前,每個通過 WASD的輸入 需要點擊回車鍵進行確認。如果只按一個鍵將觸發程序執行的下一步,那么游戲玩法會加快很多。在研究這一問題時,我沒有找到任何快速的解決辦法。盡管Haskell庫NCurses包含鍵盤事件。我可能會深入探究一下,如果我用ASCII 圖形進行編程使之成為一個“獨立”游戲。

如果你覺得這篇文章有趣,請隨意看看我的 2048的 Haskell 實現的源代碼

英文原文:Implementing the game 2048 in less than 90 lines of Haskell

譯文出自:http://www.oschina.net/translate/2048-in-90-lines-haskell

責任編輯:林師授 來源: 中國開源社區 編譯
相關推薦

2021-09-09 05:57:57

JS模塊打包器前端

2014-04-04 09:53:18

2048C++

2019-11-15 15:50:41

JS代碼React前端

2020-11-12 09:44:43

鴻蒙

2023-11-29 08:10:36

javascriptH5游戲

2023-08-07 15:18:29

游戲開發鴻蒙Arkts

2022-02-28 12:07:56

RxJS函數式

2014-04-08 15:16:07

2048算法分析算法

2017-10-29 21:43:25

人臉識別

2014-06-12 11:08:28

游戲開發游戲引擎

2012-07-03 10:25:53

HTML5

2023-07-06 20:40:57

圣誕抽抽樂H5

2023-06-06 14:00:39

代碼模型

2019-12-03 08:29:39

代碼調優網絡

2014-10-13 13:44:00

AngularJS2048

2020-12-17 08:06:33

CSS 日歷界面

2018-01-23 09:17:22

Python人臉識別

2022-03-26 22:28:06

加密通信Python

2022-04-09 09:11:33

Python

2025-03-25 08:15:00

JavaScript開發代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 少妇精品亚洲一区二区成人 | 午夜激情一区 | 久久亚洲天堂 | 9久9久9久女女女九九九一九 | 欧美视频在线一区 | 久久精品国产a三级三级三级 | 亚洲成人久久久 | 九九色综合 | 亚洲情综合五月天 | aaaa日韩 | av大片在线观看 | 成人毛片一区二区三区 | 国产在线一区二区 | 国产高清在线观看 | 精品久久久久国产免费第一页 | 免费观看一级毛片 | 国产一级片精品 | 午夜手机在线视频 | 91免费视频 | 欧美精品在线视频 | 天堂av中文在线 | 亚洲精品乱码久久久久久蜜桃91 | 欧美一区免费 | 亚洲精品1区 | 日韩影院在线观看 | 国内精品久久久久 | 欧美电影网| 欧美激情精品久久久久久 | 在线观看中文字幕 | 精品久久影院 | 中国av在线免费观看 | 一起操网站 | 丁香久久| 久久久美女| av网站在线看 | 国产精品日韩在线 | 夜夜操av | 美女黄视频网站 | 国产粉嫩尤物极品99综合精品 | 欧美乱码精品一区二区三区 | 九九视频在线观看 |