您將在Python中使用哪些數據結構來表示MineSweeper網格的內部狀態?您如何在Python中表示MineSweeper網格?
每個x,y位置都會保存一個表示其當前細胞狀態的數值(未開發,我的,標誌,?)。
我應該使用嵌套列表嗎?這看起來像是最接近二維數組的數組,這是我可能在其他任何語言中使用的(2d數組)。
我對Python沒有經驗,所以有人可以給我一個建議嗎?
您將在Python中使用哪些數據結構來表示MineSweeper網格的內部狀態?您如何在Python中表示MineSweeper網格?
每個x,y位置都會保存一個表示其當前細胞狀態的數值(未開發,我的,標誌,?)。
我應該使用嵌套列表嗎?這看起來像是最接近二維數組的數組,這是我可能在其他任何語言中使用的(2d數組)。
我對Python沒有經驗,所以有人可以給我一個建議嗎?
你可以使用一個2維數組,持物的每個字段的狀態:
class FieldState(object):
def __init__(self):
self.unexplored = True
self.mine = Random()
self.flag = Random()
...
for x in range(12):
for y in range(24):
list[x][y] = FieldState()
使用嵌套列表。這很容易設置:
field = [([None] * height) for x in range(width)]
field[x][y] = "*"
最明顯的事情很可能是一個新的類:
class MineField(object):
class _SingleField(object):
mine = False
flagged = False
covered = True
width = None
height = None
def __init__(self, width, height):
super(MineField, self).__init__()
self.width = width
self.height = height
self._field = [[self._SingleField() for y in range(height)]
for x in range(width)]
self.init_field(10)
def init_field(self, minecount):
pass
def __getitem__(self, index):
x, y = index
return self._field[x][y]
要這樣來使用:
> m = MineField(10,10) > m[4,9].mine False
如果您使用的Board
實例類可以隨時更改內部表示。
哪裏FieldState
類似於從@zlack's answer之一。
只是拋出另一種選擇的組合,你可以使用由元組索引類型的字典
board = {}
board[1, 2] = 9
我認爲大致有兩個數據層:1)地圖數據:確實廣場有炸彈(如代表通過-1)或其周圍有多少枚炸彈,2)顯示數據,廣場上顯示的是:炸彈計數,炸彈,旗幟,問號,空的,未打開的。
因此,兩個嵌套列表(或一個元組的嵌套列表)可能就足夠了。
您可以使用一個int標記位置,以準確顯示座標位置,從而大大簡化編碼。你不需要兩個數據層。
00 nothing, noflag
10 bomb, noflag
01 nothing,flagged
11 bomb, flagged
現在由於該int的第一位顯示是否存在炸彈,我們實際上可以給它多幾位並指出鄰居數。
000 no-neighbor
001 one neighbor
010 two...
等等。存儲這隻需要一個字節,甚至留出擴展空間。
「瓦片」或「單元格」對象的地圖,以座標作爲一對鍵。
current = (1,1)
if grid[current].isFlagged():
do_whatever;
。當然,地圖需要比陣列多一點空間,瓷磚類將有更多一點點足跡比原始的位圖或數字,但我相信你的主板不是1024x1024的,你是不在高度限制的RAM情況下。
如果您不僅僅是在網格中查看貼圖,還會考慮JF的Board對象來包裝陣列。
Python是一種OO語言,通常最簡單和最清晰的工作就是明智地使用類和對象。
注意:您也可以查看named_tuple類,瞭解對於正確的類看起來過於簡單的情況。
由於您使用的是類,爲什麼不用'__getitem__'將一個元組作爲參數。 'def __getitem __(self,(x,y)):return self._field [x] [y]'。然後你可以使用'm [4,9]' – 2009-11-26 21:46:00
@gnibbler:不知道,不知何故,我認爲它會使它更復雜......(儘管我前段時間已經實現了這種'__getitem__'方法)謝謝。 – 2009-11-26 22:27:04