2009-11-26 30 views
3

您將在Python中使用哪些數據結構來表示MineSweeper網格的內部狀態?您如何在Python中表示MineSweeper網格?

每個x,y位置都會保存一個表示其當前細胞狀態的數值(未開發,我的,標誌,?)。

我應該使用嵌套列表嗎?這看起來像是最接近二維數組的數組,這是我可能在其他任何語言中使用的(2d數組)。

我對Python沒有經驗,所以有人可以給我一個建議嗎?

回答

6

你可以使用一個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() 
8

使用嵌套列表。這很容易設置:

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 
+0

由於您使用的是類,爲什麼不用'__getitem__'將一個元組作爲參數。 'def __getitem __(self,(x,y)):return self._field [x] [y]'。然後你可以使用'm [4,9]' – 2009-11-26 21:46:00

+0

@gnibbler:不知道,不知何故,我認爲它會使它更復雜......(儘管我前段時間已經實現了這種'__getitem__'方法)謝謝。 – 2009-11-26 22:27:04

1

如果您使用的Board實例類可以隨時更改內部表示。

​​

哪裏FieldState類似於從@zlack's answer之一。

3

只是拋出另一種選擇的組合,你可以使用由元組索引類型的字典

board = {} 
board[1, 2] = 9 
1

我認爲大致有兩個數據層:1)地圖數據:確實廣場有炸彈(如代表通過-1)或其周圍有多少枚炸彈,2)顯示數據,廣場上顯示的是:炸彈計數,炸彈,旗幟,問號,空的,未打開的。

因此,兩個嵌套列表(或一個元組的嵌套列表)可能就足夠了。

0

您可以使用一個int標記位置,以準確顯示座標位置,從而大大簡化編碼。你不需要兩個數據層。

00 nothing, noflag 
10 bomb, noflag 
01 nothing,flagged 
11 bomb, flagged 

現在由於該int的第一位顯示是否存在炸彈,我們實際上可以給它多幾位並指出鄰居數。

000 no-neighbor 
001 one neighbor 
010 two... 

等等。存儲這隻需要一個字節,甚至留出擴展空間。

0

「瓦片」或「單元格」對象的地圖,以座標作爲一對鍵。

current = (1,1) 
if grid[current].isFlagged(): 
    do_whatever; 

。當然,地圖需要比陣列多一點空間,瓷磚類將有更多一點點足跡比原始的位圖或數字,但我相信你的主板不是1024x1024的,你是不在高度限制的RAM情況下。

如果您不僅僅是在網格中查看貼圖,還會考慮JF的Board對象來包裝陣列。

Python是一種OO語言,通常最簡單和最清晰的工作就是明智地使用類和對象。

注意:您也可以查看named_tuple類,瞭解對於正確的類看起來過於簡單的情況。