python中基于文本棋盘

oknrviil  于 2023-03-20  发布在  Python
关注(0)|答案(2)|浏览(125)

我刚刚开始了一个python项目,在这个项目中我制作了一个基于文本的国际象棋游戏。当我打印出棋盘时,事情看起来不是很好。字符太小了,这让它看起来像是被隔开了。另外,棋盘比它的高度要薄得多。我怎么才能真正制作出一个好看的棋盘呢?
我的代码如下所示:

import os, readchar, time, threading, random
global arrowKey
global speed
newchar = ''
arrowKey = {'\x1b[A': 'up'}
class Array:
    def __init__(self, x=16, y=8, board=None):
        self.pos = ()
        self.x = x
        self.y = y
        grid = [' ' + '_' * self.x]
        for _ in range(y):
            row = ['|']
            for _ in range(x):
                row.append(' ')
            row.append('|')
            grid.append(row)
        grid.append(' ' + '‾' * self.x)
        self.grid = grid
        if board != None:
            self.grid = board
    def reload(self, say=None):
        os.system('clear')
        if say != None:
            print(say)
        p = ''
        for i in self.grid:
            p = p + ''.join([x for x in i]) + '\n'
        print(p)
    def insert(self, char, x, y):
        self.pos = (x, y)
        self.grid[y][x] = char
    def move(self, direction, char):
        poslist = []
        for y, i in enumerate(self.grid):
            for x, j in enumerate(i):
                if j == char:
                    poslist.append((x, y))
        count = 0
        for posx, posy in poslist:
            if direction == 'down':
                if self.grid[posy + 1][posx] != '‾':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx, posy + 1)
                    self.pos = (posx, posy + 1)
            if direction == 'up':
                if self.grid[posy - 1][posx] != '_':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx, posy - 1)
                    self.pos = (posx, posy - 1)
            if direction == 'left':
                if self.grid[posy][posx - 1] != '|':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx - 1, posy)
                    self.pos = (posx - 1, posy)
            if direction == 'right':
                if self.grid[posy][posx + 1] != '|':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx + 1, posy)
                    self.pos = (posx + 1, posy)
            count += 1
    def getpos(self, char):
        poslist = []
        for y, i in enumerate(self.grid):
            for x, j in enumerate(i):
                if j == char:
                    poslist.append((x, y))
        count = 0
        return poslist
class Chess(Array):
    def __init__(self):
        board = [['|' if i % 2 == 0 else ' ' for i in range(17)] if x % 2 == 0 else ['+' if i % 2 == 0 else '—' for i in range(17)] for x in range(16)]
        board.insert(0, ['+' if i % 2 == 0 else '—' for i in range(17)])
        super().__init__(board=board)
        self.array = super()
board = Chess()
board.array.reload()

很抱歉有些代码看起来有点离题,我重用了我以前的chrome恐龙游戏和井字游戏的一些代码,我原本期望棋盘好看,但正如我所说,它看起来真的很奇怪。
输出如下所示:

也许像this这样的东西会很酷。

e5nqia27

e5nqia271#

你可以试验板单元宽度,然后你可以得到一些或多或少类似正方形的东西。你也可以通过剪切粘贴图形在板上转弯。例如:

BOARD = """     A     B     C     D     E     F     G     H
  |—————|—————|—————|—————|—————|—————|—————|—————|
8 |  r  |  n  |  b  |  q  |  k  |  b  |  n  |  r  | 8
  |—————|—————|—————|—————|—————|—————|—————|—————|
7 |  p  |  p  |  p  |  p  |  p  |  p  |  p  |  p  | 7
  |—————|—————|—————|—————|—————|—————|—————|—————|
6 |     |     |     |     |     |     |     |     | 6
  |—————|—————|—————|—————|—————|—————|—————|—————|
5 |     |     |     |     |     |     |     |     | 5
  |—————|—————|—————|—————|—————|—————|—————|—————|
4 |     |     |     |     |     |     |     |     | 4
  |—————|—————|—————|—————|—————|—————|—————|—————|
3 |     |     |     |     |     |     |     |     | 3
  |—————|—————|—————|—————|—————|—————|—————|—————|
2 |  P  |  P  |  P  |  P  |  P  |  P  |  P  |  P  | 2
  |—————|—————|—————|—————|—————|—————|—————|—————|
1 |  R  |  N  |  B  |  Q  |  K  |  B  |  N  |  R  | 1
  |—————|—————|—————|—————|—————|—————|—————|—————|
     A     B     C     D     E     F     G     H"""
INDEXES = {'e2': 766, 'e4': 554}

cell_start, cell_end = input('Your turn: ').split(' ')
index_start = INDEXES[cell_start]
index_end = INDEXES[cell_end]
figure = BOARD[index_start]
BOARD = BOARD[:index_end] + figure + BOARD[index_end+1:]
BOARD = BOARD[:index_start] + ' ' + BOARD[index_start+1:]
print(BOARD)

输出:

Your turn: e2 e4
     A     B     C     D     E     F     G     H
  |—————|—————|—————|—————|—————|—————|—————|—————|
8 |  r  |  n  |  b  |  q  |  k  |  b  |  n  |  r  | 8
  |—————|—————|—————|—————|—————|—————|—————|—————|
7 |  p  |  p  |  p  |  p  |  p  |  p  |  p  |  p  | 7
  |—————|—————|—————|—————|—————|—————|—————|—————|
6 |     |     |     |     |     |     |     |     | 6
  |—————|—————|—————|—————|—————|—————|—————|—————|
5 |     |     |     |     |     |     |     |     | 5
  |—————|—————|—————|—————|—————|—————|—————|—————|
4 |     |     |     |     |  P  |     |     |     | 4
  |—————|—————|—————|—————|—————|—————|—————|—————|
3 |     |     |     |     |     |     |     |     | 3
  |—————|—————|—————|—————|—————|—————|—————|—————|
2 |  P  |  P  |  P  |  P  |     |  P  |  P  |  P  | 2
  |—————|—————|—————|—————|—————|—————|—————|—————|
1 |  R  |  N  |  B  |  Q  |  K  |  B  |  N  |  R  | 1
  |—————|—————|—————|—————|—————|—————|—————|—————|
     A     B     C     D     E     F     G     H
ghg1uchk

ghg1uchk2#

通过更改Array类中使用的字符的大小,可以增加用于表示棋子和棋盘的字符的大小。例如,可以使用以下代码将字符的大小增加2倍:

class Array:
    def __init__(self, x=16, y=8, board=None):
        self.pos = ()
        self.x = x
        self.y = y
        grid = [' ' + '_' * (self.x * 2)]
        for _ in range(y):
            row = ['|']
            for _ in range(x):
                row.append('  ')
            row.append('|')
            grid.append(row)
        grid.append(' ' + '‾' * (self.x * 2))
        self.grid = grid
        if board != None:
            self.grid = board

通过将Chess类中使用的字符替换为Unicode字符,可以将Unicode字符用于国际象棋棋子。例如,可以使用以下代码表示具有Unicode字符的国际象棋棋子:

class Chess(Array):
    def __init__(self):
        board = [['|' if i % 2 == 0 else ' ' for i in range(17)] if x % 2 == 0 else ['+' if i % 2 == 0 else '—' for i in range(17)] for x in range(16)]
        board.insert(0, ['+' if i % 2 == 0 else '—' for i in range(17)])
        super().__init__(board=board)
        self.array = super()
        self.grid[1][1] = '♜'
        self.grid[1][2] = '♞'
        self.grid[1][3] = '♝'
        self.grid[1][4] = '♛'
        self.grid[1][5] = '♚'
        self.grid[1][6] = '♝'
        self.grid[1][7] = '♞'
        self.grid[1][8] = '♜'
        for i in range(1, 9):
            self.grid[2][i] = '♟︎'
        self.grid[8][1] = '♖'
        self.grid[8][2] = '♘'
        self.grid[8][3] = '♗'
        self.grid[8][4] = '♕'
        self.grid[8][5] = '♔'
        self.grid[8][6] = '♗'
        self.grid[8][7] = '♘'
        self.grid[8][8] = '♖'
        for i in range(1, 9):
            self.grid[7][i] = '♙'

相关问题