Go語言實現1024終端游戲-不到400行代碼
先放源碼地址,喜歡看源碼翻源碼,喜歡看文章的繼續看文章
https://github.com/taadis/go1024 - go1024
使用 go 語言實現的 1024 終端游戲,不到400行代碼,代碼簡潔,以便理解和學習和掌握 go 語言開發.
安裝和運行
要運行這個程序,你需要先安裝依賴:
go mod tidy
然后運行程序即可:
go run main.go
游戲運行如下:
2 0 0 0
4 2 0 0
8 32 4 2
32 16 8 16
Score: 380
請使用方向鍵操作,按快捷鍵 Ctrl+C 可退出游戲.
游戲實現
當前游戲實現了以下內容:
- 基于 go 語言的跨平臺、可移植的終端游戲、包管理
- 1024游戲的核心邏輯
- 基于 ANSI 的終端顏色顯示
- 鍵盤控制
- 得分計算
- 游戲結束檢測
- 跨平臺兼容性
- 基本的錯誤處理
隨機數生成
我們使用 rand 來生成隨機數。在本游戲中隨機數主要有兩個作用:
- 隨機生成新數字的位置:
slot := emptySlots[rand.Intn(len(emptySlots))]
- 隨機決定生成2還是4:
if rand.Float64() > 0.95 {
value = 4 // 5%的概率生成4
} else {
value = 2 // 95%的概率生成2
}
如果不設置隨機數種子,每次運行游戲時隨機數生成器都會使用相同的默認種子,這樣:
- 每次游戲開始時數字出現的位置都會相同
- 新數字的值(2或4)的出現順序也會相同
- 游戲失去了隨機性,變得可預測
使用當前時間的納秒數作為種子,可以確保每次運行游戲時都會得到不同的隨機序列,使游戲更有趣和不可預測性。
顏色表示
根據數字的大小返回不同的顏色代碼.
我們使用的數字是 ANSI 轉義序列中的顏色代碼。在終端中,我們使用 \033[ 開頭的轉義序列來控制文本的顯示效果。
ANSI 轉義序列的顏色代碼是有限的,主要分為這幾組:
- 基本前景色:30-37
- 基本背景色:40-47
- 高亮前景色:90-97
- 高亮背景色:100-107
98、99 和 108 以后的數字并不是標準的 ANSI 顏色代碼,不會產生顏色效果。
具體解釋:
\033[是轉義序列的開始標記(ESC 字符)- 后面的數字是顏色代碼:
- 30-37:基本前景色(文字顏色)
- 31: 紅色
- 32: 綠色
- 33: 黃色
- 34: 藍色
- 35: 紫色
- 36: 青色
- 37: 白色
- 90-97:高亮前景色
- 90: 亮灰色
- 91: 亮紅色
- 92: 亮綠色
等等...
- 30-37:基本前景色(文字顏色)
在代碼中:
fmt.Printf("\033[%dm%6d\033[0m", color, g.Board[i][j])
\033[%dm設置顏色%6d顯示數字(6位寬度)\033[0m重置所有屬性
所以當我們使用 color = 90 時,就會顯示亮灰色文字,這在游戲中用來表示空位(值為0的格子)。
如果需要更豐富的顏色,可以使用:
- 24位真彩色:
\033[38;2;R;G;Bm - 256色:
\033[38;5;Nm(N是0-255之間的數字)
例如:
// 24位真彩色(紅色)
fmt.Printf("\033[38;2;255;0;0m文本\033[0m")
// 256色(第100號顏色)
fmt.Printf("\033[38;5;100m文本\033[0m")
但這些高級顏色特性可能不是所有終端都支持,所以在通用程序中一般還是使用基本的 ANSI 顏色代碼(30-37, 90-97)。
退出游戲
退出游戲主要通過監聽取消信息來實現
- 添加了
os/signal和syscall包 - 使用
signal.Notify來捕獲 SIGINT (Ctrl+C) 和 SIGTERM 信號 - 啟動一個 goroutine 來處理信號,收到信號時:
- 關閉鍵盤監聽
- 退出程序
- 移除了原有的 Ctrl+C 檢查代碼
這樣修改后,無論在程序的任何時刻按下 Ctrl+C,都能正確退出程序。同時也會確保鍵盤資源被正確釋放。
后面改為使用 github.com/eiannone/keyboard 包了,簡化邏輯處理.
[支持/訂閱](https://afdian.com/a/taadis)作者,以獲得更多服務.

浙公網安備 33010602011771號