簡體   English   中英

在 C 中編碼蛇游戲時,表示蛇的常規方法是什么?

[英]what is the conventional way to represent snake when coding snake game in C?

一些背景知識:我對其他編程語言有一些經驗,但是當談到 C 時,我的知識並不多。 我還試圖在不依賴動態 memory 分配的情況下制作蛇游戲,這不是標准的一部分,因為它旨在在微控制器上運行。

I previously coded snake game in python, rust, and java and my go to approach was to store pairs of x and y coordinates in some form of dynamic list or vector. 游戲循環的每次迭代我都會 append 根據當前最后一個元素和相應的 dx 和 dy 將元素添加到對的列表/向量中,如果蛇沒有增長,則刪除或彈出向量/列表的第一個元素,使蛇“移動”。

我特別喜歡這種方法,因為這意味着我不需要將整個游戲區域存儲在二維數組中。 在我看來,這也是一個非常干凈的實現。 現在在 C 中,我必須解決主要問題 - 沒有動態大小的列表以及刪除數組的第一個元素並將所有元素移回而不遍歷所有數組的能力。

對於第一個問題,我考慮過使用具有一定限制的固定大小數組,該數組在合理的蛇形長度之上,同時單獨跟蹤蛇形長度,或者使用包含指向自身的可為空指針的結構鏈表。 后一個似乎不必要地復雜,而第一個似乎是一個非常骯臟的修復。

對於第二個問題,我考慮過用指向其第二個元素的指針來覆蓋數組指針,但是雖然那個半有效 - 我關心以下問題:

  • 我是否必須釋放前一個數組指針(也就是前一個第一個元素)
  • 當做這樣的事情時,我假設指向數組的指針會繼續增長,遲早它會出現段錯誤,因為它不會重用它已經滑離的 memory。

所以我想我應該向更有經驗的編碼人員詢問一種更清潔、更傳統的方法來在 C 中實現蛇。 先感謝您,

蛇的長度有一個上限——你的二維板的大小。 如果你的玩家擅長游戲,這個上限是可以很好地實現的。 因此,您可以預先分配該大小的數組並將其用作鏈表節點或循環隊列的池。

您可以通過為您的電路板使用二維數組來進一步簡化,並在每個有蛇的單元格中僅存儲下一個/上一個鏈接。 那么你就不需要存儲每個段的 x/y 了:

enum { TYPE_EMPTY, TYPE_FOOD, TYPE_SNAKE };
struct Cell { int type, next, prev; };
struct Cell board[width*height];
int head, tail;

這種方法很容易推廣到同一個棋盤上的多個玩家、多個項目或項目類型等。

存儲板的顯式 2d 表示沒有任何“錯誤”。 事實上,這是解決問題的一種自然方式。 它允許快速檢查自碰撞等。 我敢打賭,您以前的實現采用了緩慢的 O(n) 檢查來查看蛇是否自相交,這本身並不漂亮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM