2011-02-10 115 views
3

我正在考慮在Python中創建一個棋盤遊戲,其中有一個空格網格,每個空格網格都有不同的屬性,並且可能有也可能沒有殘餘的棋子。這些作品應該能夠在空間之間移動,但要遵守各種規則。 (國際象棋或棋子是我想到的很好的例子,儘管我的遊戲會有不同的/更復雜的規則,並且網格可能不是方形的,即使空間是這樣)。在Python中創建棋盤遊戲狀網格

我使用鏈接列表的修改版本編寫了一個類似於數據結構類的Java實現。但是這是Python,所以我想有更好的方法來做到這一點(甚至可能是一個庫)?

+1

Python列表有點像Java鏈接列表。那有什麼問題? – 2011-02-10 12:47:33

回答

12

用Tkinter繪製一個棋盤是非常微不足道的。這裏有一個非常簡單的例子:

import Tkinter as tk 
class GameBoard(tk.Frame): 
    def __init__(self, parent, rows=8, columns=8, size=32, color1="white", color2="blue"): 
     '''size is the size of a square, in pixels''' 

     self.rows = rows 
     self.columns = columns 
     self.size = size 
     self.color1 = color1 
     self.color2 = color2 
     self.pieces = {} 

     canvas_width = columns * size 
     canvas_height = rows * size 

     tk.Frame.__init__(self, parent) 
     self.canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0, 
           width=canvas_width, height=canvas_height, background="bisque") 
     self.canvas.pack(side="top", fill="both", expand=True, padx=2, pady=2) 

     # this binding will cause a refresh if the user interactively 
     # changes the window size 
     self.canvas.bind("<Configure>", self.refresh) 

    def addpiece(self, name, image, row=0, column=0): 
     '''Add a piece to the playing board''' 
     self.canvas.create_image(0,0, image=image, tags=(name, "piece"), anchor="c") 
     self.placepiece(name, row, column) 

    def placepiece(self, name, row, column): 
     '''Place a piece at the given row/column''' 
     self.pieces[name] = (row, column) 
     x0 = (column * self.size) + int(self.size/2) 
     y0 = (row * self.size) + int(self.size/2) 
     self.canvas.coords(name, x0, y0) 

    def refresh(self, event): 
     '''Redraw the board, possibly in response to window being resized''' 
     xsize = int((event.width-1)/self.columns) 
     ysize = int((event.height-1)/self.rows) 
     self.size = min(xsize, ysize) 
     self.canvas.delete("square") 
     color = self.color2 
     for row in range(self.rows): 
      color = self.color1 if color == self.color2 else self.color2 
      for col in range(self.columns): 
       x1 = (col * self.size) 
       y1 = (row * self.size) 
       x2 = x1 + self.size 
       y2 = y1 + self.size 
       self.canvas.create_rectangle(x1, y1, x2, y2, outline="black", fill=color, tags="square") 
       color = self.color1 if color == self.color2 else self.color2 
     for name in self.pieces: 
      self.placepiece(name, self.pieces[name][0], self.pieces[name][1]) 
     self.canvas.tag_raise("piece") 
     self.canvas.tag_lower("square") 


# image comes from the silk icon set which is under a Creative Commons 
# license. For more information see http://www.famfamfam.com/lab/icons/silk/ 
imagedata = ''' 
    R0lGODlhEAAQAOeSAKx7Fqx8F61/G62CILCJKriIHM+HALKNMNCIANKKANOMALuRK7WOVLWPV9eR 
    ANiSANuXAN2ZAN6aAN+bAOCcAOKeANCjKOShANKnK+imAOyrAN6qSNaxPfCwAOKyJOKyJvKyANW0 
    R/S1APW2APW3APa4APe5APm7APm8APq8AO28Ke29LO2/LO2/L+7BM+7BNO6+Re7CMu7BOe7DNPHA 
    P+/FOO/FO+jGS+/FQO/GO/DHPOjBdfDIPPDJQPDISPDKQPDKRPDIUPHLQ/HLRerMV/HMR/LNSOvH 
    fvLOS/rNP/LPTvLOVe/LdfPRUfPRU/PSU/LPaPPTVPPUVfTUVvLPe/LScPTWWfTXW/TXXPTXX/XY 
    Xu/SkvXZYPfVdfXaY/TYcfXaZPXaZvbWfvTYe/XbbvHWl/bdaPbeavvadffea/bebvffbfbdfPvb 
    e/fgb/Pam/fgcvfgePTbnfbcl/bfivfjdvfjePbemfjelPXeoPjkePbfmvffnvbfofjlgffjkvfh 
    nvjio/nnhvfjovjmlvzlmvrmpvrrmfzpp/zqq/vqr/zssvvvp/vvqfvvuPvvuvvwvfzzwP////// 
    //////////////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////////////////////////////////////////// 
    /////////////////////////////////////////////////////yH+FUNyZWF0ZWQgd2l0aCBU 
    aGUgR0lNUAAh+QQBCgD/ACwAAAAAEAAQAAAIzAD/CRxIsKDBfydMlBhxcGAKNIkgPTLUpcPBJIUa 
    +VEThswfPDQKokB0yE4aMFiiOPnCJ8PAE20Y6VnTQMsUBkWAjKFyQaCJRYLcmOFipYmRHzV89Kkg 
    kESkOme8XHmCREiOGC/2TBAowhGcAyGkKBnCwwKAFnciCAShKA4RAhyK9MAQwIMMOQ8EdhBDKMuN 
    BQMEFPigAsoRBQM1BGLjRIiOGSxWBCmToCCMOXSW2HCBo8qWDQcvMMkzCNCbHQga/qMgAYIDBQZU 
    yxYYEAA7 
''' 



if __name__ == "__main__": 
    root = tk.Tk() 
    board = GameBoard(root) 
    board.pack(side="top", fill="both", expand="true", padx=4, pady=4) 
    player1 = tk.PhotoImage(data=imagedata) 
    board.addpiece("player1", player1, 0,0) 
    root.mainloop() 
3

你可以考慮你的底層板實現作爲不同類型的數據結構。列表的

  1. 列表 - L 1 = [[1,2,3],[4,5,6],[7,8,9]]
  2. 字典用的值作爲列表= D1 = {一:[1,2,3],b:[4,5,6],c:[7,8,9]}
  3. 帶鍵的字典是可以分配的座標和值。
  4. 作爲Graph

下面是一個空的棋盤的設計。

>>> chessboard = {} 
>>> for row in range(8): 
...  for col in range(8): 
...    chessboard[(row,col)] = 0 
... 
>>> 

您可以使用其中的任何一種設計您的遊戲邏輯。對於更高級別的元素,您可以將這些對象或元素綁在一起pygame

+0

你可以改進你的例子看起來更像是具有排名/文件位置的棋盤嗎? – 2011-02-10 12:47:13