|
|
以下使用 pygame 库讲解,适合初学者,代码简洁直观。
---
### 1. 绘制棋盘网格
用循环画横线和竖线,分割矩形格子。假设棋盘左上角留边距,每个格子宽度固定。
- import pygame
- import sys
- # 初始化
- pygame.init()
- WINDOW_WIDTH = 550
- WINDOW_HEIGHT = 610
- screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
- pygame.display.set_caption("中国象棋棋盘")
- # 颜色定义
- WHITE = (255,255,255)
- BLACK = (0,0,0)
- BROWN = (205,133,63) # 棋盘底色
- # 格子参数
- CELL_SIZE = 55 # 每个格子边长
- MARGIN_X = 35 # 左边距
- MARGIN_Y = 35 # 上边距
- ROWS = 9 # 行数(纵向)
- COLS = 10 # 列数(横向)注意:传统棋盘是9×10
- def draw_board():
- screen.fill(BROWN) # 背景
- # 画横线
- for row in range(ROWS):
- y = MARGIN_Y + row * CELL_SIZE
- pygame.draw.line(screen, BLACK,
- (MARGIN_X, y),
- (MARGIN_X + (COLS-1)*CELL_SIZE, y), 2)
- # 画竖线
- for col in range(COLS):
- x = MARGIN_X + col * CELL_SIZE
- pygame.draw.line(screen, BLACK,
- (x, MARGIN_Y),
- (x, MARGIN_Y + (ROWS-1)*CELL_SIZE), 2)
- # 画河界(中间空白区域可以画虚线或文字,此处省略)
- pygame.display.flip()
- # 主循环
- running = True
- while running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- draw_board()
- pygame.quit()
- sys.exit()
复制代码
---
### 2. 绘制棋子(用圆形代替图片)
每个棋子用一个圆表示,可以设定不同颜色(红、黑)。棋子位置对应网格交点坐标。
- # 棋子参数
- RADIUS = 22
- RED = (200,0,0)
- BLACK_PIECE = (50,50,50)
- def draw_piece(screen, row, col, color, text):
- """在(row, col)位置画一个棋子,row:0~8, col:0~9"""
- x = MARGIN_X + col * CELL_SIZE
- y = MARGIN_Y + row * CELL_SIZE
- pygame.draw.circle(screen, color, (x, y), RADIUS)
- # 绘制文字(如"车""马")
- font = pygame.font.SysFont("simsun", 24) # 宋体
- img = font.render(text, True, WHITE)
- screen.blit(img, (x-img.get_width()//2, y-img.get_height()//2))
复制代码
在 draw_board() 内部调用 draw_piece 即可显示棋子。例如棋盘初始化:
- # 在draw_board()中画一个红"车"
- draw_piece(screen, 0, 0, RED, "车")
- draw_piece(screen, 8, 4, BLACK_PIECE, "将")
复制代码
---
### 3. 完整示例(单窗口+网格+棋子)
将以上代码整合,再添加一个棋子列表来自定义布局。下面是最简版本:
- import pygame
- import sys
- pygame.init()
- screen = pygame.display.set_mode((550, 610))
- clock = pygame.time.Clock()
- # 常量
- CELL = 55
- MX, MY = 35, 35
- ROWS, COLS = 9, 10
- BROWN = (205,133,63)
- BLACK = (0,0,0)
- RED = (200,0,0)
- BLACK_PIECE = (50,50,50)
- font = pygame.font.SysFont("simsun", 24)
- def draw_board():
- screen.fill(BROWN)
- # 画线
- for row in range(ROWS):
- y = MY + row * CELL
- pygame.draw.line(screen, BLACK, (MX, y), (MX + (COLS-1)*CELL, y), 2)
- for col in range(COLS):
- x = MX + col * CELL
- pygame.draw.line(screen, BLACK, (x, MY), (x, MY + (ROWS-1)*CELL), 2)
- # 画棋子示例(红车在(0,0),黑将在(8,4))
- draw_piece(0, 0, RED, "车")
- draw_piece(8, 4, BLACK_PIECE, "将")
- pygame.display.flip()
- def draw_piece(row, col, color, text):
- x = MX + col * CELL
- y = MY + row * CELL
- pygame.draw.circle(screen, color, (x, y), 22)
- img = font.render(text, True, (255,255,255))
- screen.blit(img, (x-14, y-12))
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit(); sys.exit()
- draw_board()
- clock.tick(30)
复制代码
---
### 4. 使用turtle库的简单方法(选读)
turtle也可以画网格和画圆,但交互性不如pygame。核心思路是用 turtle.penup() 和 turtle.goto() 定位,用 turtle.pendown() 画线段和圆。代码略长,建议初学者优先尝试pygame。
---
### 如何学
1. 先安装 pygame(命令行: pip install pygame)。
2. 运行上面的代码,理解窗口、事件、绘图函数。
3. 修改颜色、尺寸,加入更多棋子(用列表存储每颗棋子的位置和类型)。
4. 下一步:实现鼠标点击选中棋子、拖动或点选目标位置移动(监听 MOUSEBUTTONDOWN 事件,计算点击的网格坐标)。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|