在python中为桌面游戏生成棋盘

时间:2018-12-01 13:08:44

标签: python python-3.x

我必须在python中生成这样的板子。

这是理想的结果:

  0 1 2 3 4 5 6 7 8 9 0 1 2
0           * * *          
1           * D *          
2           * D *          
3           * D *          
4           * D *          
5 * * * * * * D * * * * * *
6 * D D D D D D D D D D D *
7 * * * * * * D * * * * * *
8           * D *          
9           * D *          
0           * D *          
1           * D *          
2           * * *          

到目前为止,我已完成此操作:

  0 1 2 3 4 5 6 7 8
0 * * * * * * * * *
1 * * * * * * * * *
2 * * * * * * * * *
3 * * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *

到目前为止,这是我的代码:

def makeboard(x):
  board = []
  for r in range(x+1):
     brow = []
     for c in range(x+1):
        if r == c == 0:
             brow.append(' ')
        elif r == 0:
            brow.append(str(c-1))
        elif c == 0:
            brow.append(str(r-1))
        else:
             brow.append('*')
      board.append(brow)
  return board

b =makeboard(9)

for x in b:
print(‘ ‘.join(x))

我的第一个问题是,如果我要制作一个12x12的电路板,那么第一行和9边的数字会使我的电路板不对称。因此,我想让它们重置为9以上,以便它们从0重新开始。我需要帮助。 我的第二个问题是我无法像需要生成的那样制作板。希望有一些提示。

2 个答案:

答案 0 :(得分:0)

要使数字经过0之后再返回9,可以对整数(%)使用取模运算符:

>>> for x in range(15):
...     print(x, x % 10)
... 
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 0
11 1
12 2
13 3
14 4

您还可以使用math.floormath.ceil函数来帮助查找中点,上方的行/列以及中心线下方的行/列。

答案 1 :(得分:0)

奇怪的是,我在尝试编译您的代码时遇到很多错误:缩进错误,并且某种程度上您的代码能够使用`..`个字符而不是通常的".."'..'运行。我调整了代码,使其在我的系统上运行;您可能需要将其改回。

那是说:你走在正确的轨道上,但放弃得太早了。在double循环中需要做的只是检查要在什么位置插入什么字符:

def makeboard(x):
    board = []
    for r in range(x+1):
        brow = []
        for c in range(x+1):
            if r == c == 0:
                brow.append(' ')  # top left corner
            elif r == 0:
                brow.append(str(c-1)[-1]) # top number row, last digit only
            elif c == 0:
                brow.append(str(r-1)[-1]) # left number column, last digit only
            elif (x>>1) <= r <= (x>>1)+2 or (x>>1) <= c <= (x>>1)+2: # center 3 rows and columns (offset by +1 because the first number column throws the count off)
                if r == 1 or c == 1 or r == x or c == x: # the first and last character in each column and row is always '*'
                    brow.append('*')
                else:
                    if r == (x>>1)+1 or c == (x>>1)+1: # the center column and row
                        brow.append('D')
                    else:
                        brow.append('*') # everything except the center
            else:
                brow.append(' ')
        board.append(brow)
    return board

b =makeboard(13)

for x in b:
    print(' '.join(x))

该代码两次添加一个'*',因为这样做恰好更容易。可以将这两个单独的测试合并成一条长行,但这会使过程更难以阅读,因此我将其留在了这里。