[英]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.