2011-02-10 3 views
3

私はPythonでボードゲームを作成しようと考えています.1つは空白のグリッドを持ち、それぞれは異なるプロパティを持ち、残りの部分はそれらの上に置かれているかもしれません。これらの部分は、さまざまなルールの対象となりますが、スペース間を移動できる必要があります。 (私のゲームには違った複雑なルールがありますが、スペースがあってもグリッドは正方形ではないかもしれませんが、チェスやチェッカーは私が考えているものの良い例になります)。Pythonでボードゲームのような格子を作成する

リンクリストの変更されたバージョンを使用して、データ構造クラスと同様のものをJava実装しました。しかし、これはPythonですから、もっと良い方法があると思います(おそらくそこのライブラリでさえ)?

+1

Pythonのリストは、Javaのリンクリストに似ています。それのどこが悪いんだい? –

答えて

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. リスト - L1 = [1,2,3]、[4,5,6]、[7,8,9]
  2. dictのリストなどの値= D1 = {Aと:[1,2,3]、b:[4,5,6]、c:[7,8,9]}
  3. キー付きのDictは、ユーザーが割り当てることができる座標と値です。ここでGraph

として

  • は、空のチェス盤のデザインです。

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

    これらのいずれかを使用して、ゲームのロジックを設計できます。より高いレベルの要素については、これらのオブジェクトや要素を繋ぎ合わせることができますpygame

  • +0

    ランク/ファイルポジションのチェスボードのように見えるように例を改善できますか? –

    +0

    @ S.Lott - おそらく空のチェス盤が最初のステップですか? –

    +1

    ありがとうございます。リストのリスト(およびその他のネストされたデータ構造)を使って作業していたので、カスタムビルド構造を使用することをお勧めします(特にフィーチャを追加する予定です)。しかしGraphやPygameは開始;私はそれをチェックします。 – chimeracoder

    関連する問題