Pythonic方式在控制台中打印棋盘

时间:2013-10-22 12:05:17

标签: python dictionary chess

我想知道使用字典打印控制台棋盘的最佳pythonic方法是什么。

我应该使用清单吗?但是,如果他们在某一行的板上没有任何一块,会发生什么呢?

编辑: Exemple

2 个答案:

答案 0 :(得分:5)

在国际象棋程序(通常用于计算最佳动作,解决谜语等)内部使用10×10板,其中可见和可玩板使用中间8×8场。 (边距有助于保持代码简单。)为了简化内存管理,通常使用线性内存来存储它,即。即100个领域。然后使用board[(y+1) * 10 + (x+1)]计算板的场的位置,其中x,y在0..7的范围内。 (由board = [ 0 ] * 100初始。)

所以你可能想要使用它,以防你的程序稍后应该扩展为计算移动或保持与执行此操作的库兼容。

至于图形,我建议使用这个板:

     A       B       C       D       E       F       G       H
  ------- ------- ------- ------- ------- ------- ------- -------
 | @___@ |  %~b  |  .@.  | \o*o/ | __+__ |  .@.  |  %~b  | @___@ |
8|  @@@  | `'dX  |  @@@  |  @@@  | `@@@' |  @@@  | `'dX  |  @@@  |8
 | d@@@b |  d@@b | ./A\. | d@@@b | d@@@b | ./A\. |  d@@b | d@@@b |
  ------- ------- ------- ------- ------- ------- ------- -------
 |   _   |   _   |   _   |   _   |   _   |   _   |   _   |   _   |
7|  (@)  |  (@)  |  (@)  |  (@)  |  (@)  |  (@)  |  (@)  |  (@)  |7
 |  d@b  |  d@b  |  d@b  |  d@b  |  d@b  |  d@b  |  d@b  |  d@b  |
  ------- ------- ------- ------- ------- ------- ------- -------
 |       | . . . |       | . . . |       | . . . |       | . . . |
6|       | . . . |       | . . . |       | . . . |       | . . . |6
 |       | . . . |       | . . . |       | . . . |       | . . . |
  ------- ------- ------- ------- ------- ------- ------- -------
 | . . . |       | . . . |       | . . . |       | . . . |       |
5| . . . |       | . . . |       | . . . |       | . . . |       |5
 | . . . |       | . . . |       | . . . |       | . . . |       |
  ------- ------- ------- ------- ------- ------- ------- -------
 |       | . . . |       | . . . |       | . . . |       | . . . |
4|       | . . . |       | . . . |       | . . . |       | . . . |4
 |       | . . . |       | . . . |       | . . . |       | . . . |
  ------- ------- ------- ------- ------- ------- ------- -------
 | . . . |       | . . . |       | . . . |       | . . . |       |
3| . . . |       | . . . |       | . . . |       | . . . |       |3
 | . . . |       | . . . |       | . . . |       | . . . |       |
  ------- ------- ------- ------- ------- ------- ------- -------
 |   _   |   _   |   _   |   _   |   _   |   _   |   _   |   _   |
2|  ( )  |  ( )  |  ( )  |  ( )  |  ( )  |  ( )  |  ( )  |  ( )  |2
 |  /_\  |  /_\  |  /_\  |  /_\  |  /_\  |  /_\  |  /_\  |  /_\  |
  ------- ------- ------- ------- ------- ------- ------- -------
 | [___] |  %~\  |  .O.  | \o^o/ | __+__ |  .O.  |  %~\  | [___] |
1|  [ ]  | `')(  |  \ /  |  [ ]  | `. .' |  \ /  | `')(  |  [ ]  |1
 | /___\ |  <__> |  /_\  | /___\ | /___\ |  /_\  |  <__> | /___\ |
  ------- ------- ------- ------- ------- ------- ------- -------
     A       B       C       D       E       F       G       H

我在90年代为Tubmud制作了这些ASCII图形。随意使用它们。

答案 1 :(得分:2)

我会使用嵌套列表来解决该问题。在国际象棋中,你有一个8x8网格,可以通过python list理解魔法轻松构建。

grid = [[“”] * 8表示未使用范围(8)]

您可以通过索引数组来访问和更改元素:

grid[0][0] = 'T'

对于黑色数字,您可以使用小写字母表示白色和大写字母,对于黑色数字,您可以使用它们的第一个字母左右,例如黑色女王的“Q”。

字典看起来对我不好,因为很难做出检查有效移动或者某些操作的操作,因为没有其他方法可以通过迭代所有值来确定数字的位置。网格是最自然的。