这里的第一个问题,为凌乱的格式化道歉。
我希望有几个指针。我试图将棋盘游戏作为OOP的练习。 所以我需要一个8x8'板,类似于棋盘,但游戏玩法,即在棋盘上放置棋子只发生在7x7单元格上。 我通过迭代8个列表的列表来实现它。 这是代码:
class Board(object):
def __init__(self):
self.Board = [[[] for x in range(LENGTH)] for y in range(LENGTH)]
def makeBoard(self, initial_blocked):
for row in range(LENGTH):
for col in range(LENGTH):
self.Board[row][col] = 'e'
self.Board[0][1] = 'A'
self.Board[0][2] = 'B'
self.Board[0][3] = 'C'
self.Board[0][4] = 'D'
self.Board[0][5] = 'E'
self.Board[0][6] = 'F'
self.Board[0][7] = 'G'
self.Board[0][0] = '~'
self.Board[1][0] = '1'
self.Board[2][0] = '2'
self.Board[3][0] = '3'
self.Board[4][0] = '4'
self.Board[5][0] = '5'
self.Board[6][0] = '6'
self.Board[7][0] = '7'
if True:
while initial_blocked > 0:
position_x = rand(0, 7)
position_y = rand(0, 7)
if self.Board[position_x][position_y] == 'e':
self.Board[position_x][position_y] = 'X'
initial_blocked -= 1
for line in range(8):
print(self.Board[line])
输出如下:
['~', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
['1', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['2', 'e', 'e', 'e', 'X', 'X', 'e', 'e']
['3', 'e', 'X', 'e', 'e', 'X', 'e', 'e']
['4', 'e', 'e', 'e', 'X', 'e', 'e', 'e']
['5', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['6', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
['7', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
第一行和第二行将用于用户输入(例如A1,D4)' X'是被阻止的细胞和“细胞”。代表空洞。玩家进入他们想要保留他们作品的地方,例如A1,以及' e'将改为' b'或者' w',黑色或白色。 Haven仍然没弄明白我将如何做到这一点,但首先要做的事情 我希望它类似于 - 至少有点 - 董事会。如果我尝试使用许多print()s打印出一块板,我无法弄清楚如何更改该板上的单元格,它引用与索引相同的单元格。即输入A1改变[1] [1]处的列表和板上的那个单元格。
我希望这是有道理的。谢谢!
答案 0 :(得分:0)
我对您的代码做了一些优化,您可能会发现这些优化很有帮助。我们可以使用循环来完成,而不是使用所有这些单独的语句来初始化列和行标题。此外,在实际情况下,直接迭代列表而不是使用索引是很好的。我已经改变了你的一些名字,使它们符合PEP-0008风格指南;这使得其他人更容易阅读您的代码,特别是如果他们使用颜色编码的语法高亮显示。
from random import seed, randrange
seed(123)
LENGTH = 8
# A dict for converting reference letters to integers
letters = {ch: i for i, ch in enumerate('ABCDEFG', 1)}
def ref_to_index(ref):
''' Convert a ref from A1 form to a tuple of (row, col) integers
Return None if the ref is invalid
'''
if len(ref) != 2:
return None
x, y = ref.upper()
if x not in letters or y not in '1234567':
return None
return int(y), letters[x]
class Board(object):
def __init__(self):
# Initialize the board lists
self.board = [['e'] * LENGTH for y in range(LENGTH)]
# Add the column headers
self.board[0][:] = list('~ABCDEFG')
# Add the row headers
for i, row in enumerate(self.board[1:], 1):
row[0] = str(i)
def add_blocks(self, initial_blocked):
for _ in range(initial_blocked):
while True:
position_x = randrange(1, LENGTH)
position_y = randrange(1, LENGTH)
row = self.board[position_y]
if row[position_x] == 'e':
row[position_x] = 'X'
break
def reset(self):
''' Make all the board cells empty '''
size = LENGTH - 1
for row in self.board[1:]:
row[1:] = ['e'] * size
def show(self):
for row in self.board:
print(' '.join(row))
print()
# test
board = Board()
board.show()
board.add_blocks(7)
board.show()
while True:
ref = input('Select a move: ')
idx = ref_to_index(ref)
if idx is None:
print('Invalid move')
continue
y, x = idx
row = board.board[y]
if row[x] != 'e':
print("That cell isn't empty")
continue
row[x] = 'b'
board.show()