2011-02-10 117 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