簡體   English   中英

如何在 Python 上為游戲構建 20x20 板?

[英]How to build a 20x20 board for a game on Python?

我是一個初學者,正在嘗試創建一個類似於 Checkers 的棋盤游戲。 我需要構建一個 20x20 的板,其中行名為 1-20,列名為 AT。 我已經在下面構建了電路板,但它看起來非常違反直覺,並且它們沒有用數字和字母初始化。 我想采用諸如“A5”之類的參數來定義玩家移動功能。

class Game:
def __init__(self):
    self._board = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
                   [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]]

您可以定義一個具有正常數字索引(從 0 到 19)的二維列表,然后編寫將諸如“A5”之類的字符串轉換為這些索引的函數。 如果將此邏輯放在實現__getitem____setitem__之類的魔術方法的 class 中,則可以將這些標識符用作下標(例如board["A5"] ),而不必按名稱調用函數。

例如:

from typing import List, Optional, Tuple


class Board:
    def __init__(self, size: int = 20):
        self._board: List[List[Optional[str]]] = [
            [None for _ in range(size)] for _ in range(size)
        ]

    def _get_coords(self, space: str) -> Tuple[int, int]:
        assert (
            space[1:].isdecimal()
            and space[0].isalpha()
            and space[0].isupper()
        ), "Specify spaces as uppercase letter and number, eg 'A5'"
        coords = int(space[1:]) - 1, ord(space[0]) - ord("A")
        assert all(
            i in range(len(self._board)) for i in coords
        ), f"{space} is outside of the board"
        return coords

    def __getitem__(self, space: str) -> Optional[str]:
        x, y = self._get_coords(space)
        return self._board[x][y]

    def __setitem__(self, space: str, piece: str) -> None:
        x, y = self._get_coords(space)
        self._board[x][y] = piece

    def __str__(self) -> str:
        return (
            "\n".join(str(i+1).ljust(3) + " ".join(
                c if c else " " for c in row
            ) for i, row in enumerate(self._board))
            + "\n   " + " ".join(
                chr(ord("A") + c) for c in range(len(self._board))
            )
        )


if __name__ == '__main__':
    board = Board()
    board["A5"] = "O"
    board["B20"] = "X"
    print(board)

將內部保持在普通列表中的好處(即使您還不習慣考慮零索引列表)是它可以更容易編寫在板上迭代的邏輯(如__str__ function確實——如果將板存儲為具有命名列的嵌套字典,則編寫此 function 會有點困難)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM