You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于8086汇编开发象棋游戏:如何绘制棋盘网格与棋子?

8086汇编实现象棋棋盘与棋子绘制

一、棋盘网格绘制(以VGA 320x200 256色模式为例)

首先通过BIOS中断切换到图形模式:

; 设置VGA 320x200 256色显示模式
MOV AH, 00H
MOV AL, 13H
INT 10H

1. 批量绘制横竖网格线

中国象棋棋盘为9竖10横,用循环批量绘制替代逐行手动编写,大幅降低复杂度:

  • 竖线:起始X设为20,每条间隔30像素,共9条,Y范围20~200(总高度180)
  • 横线:起始Y设为20,每条间隔18像素,共10条,X范围20~290(总宽度270)

使用INT 10H的AH=0CH功能(画点)实现画线:

; 绘制竖线
MOV CX, 20          ; 起始X坐标
MOV DX, 20          ; 起始Y坐标
MOV AL, 0           ; 线条颜色(黑色)
MOV AH, 0CH
VERT_LOOP:
    INT 10H
    INC DX
    CMP DX, 200
    JLE VERT_LOOP
    ADD CX, 30       ; 偏移到下一条竖线
    MOV DX, 20
    CMP CX, 20+30*8  ; 循环9次后退出
    JLE VERT_LOOP

; 绘制横线
MOV CX, 20
MOV DX, 20
HORZ_LOOP:
    INT 10H
    INC CX
    CMP CX, 290
    JLE HORZ_LOOP
    ADD DX, 18       ; 偏移到下一条横线
    MOV CX, 20
    CMP DX, 20+18*9  ; 循环10次后退出
    JLE HORZ_LOOP

2. 绘制楚河汉界

中间横线需断开,可通过填充浅灰色区域实现:

; 设置填充颜色为浅灰色
MOV AH, 0BH
MOV BH, 0
MOV BL, 192
INT 10H

; 填充楚河汉界区域(X:100~210,Y:100~118)
MOV CX, 100
MOV DX, 100
MOV AH, 0CH
FILL_LOOP:
    INT 10H
    INC CX
    CMP CX, 210
    JLE FILL_LOOP
    MOV CX, 100
    INC DX
    CMP DX, 118
    JLE FILL_LOOP

二、棋子绘制

1. 绘制圆形棋子轮廓

用Bresenham圆算法高效生成圆形,避免逐点手动绘制:

; 子程序:画圆
; 输入:CX=圆心X,DX=圆心Y,BX=半径,AL=颜色
DRAW_CIRCLE:
    MOV SI, 0
    MOV DI, BX
    MOV AX, -BX
    MOV BP, 1
CIRCLE_LOOP:
    ; 绘制8个对称点
    MOV AH, 0CH
    INT 10H         ; (CX+SI, DX+DI)
    MOV CX, CX+SI
    MOV DX, DX-DI
    INT 10H         ; (CX+SI, DX-DI)
    MOV CX, CX-SI
    MOV DX, DX-DI
    INT 10H         ; (CX-SI, DX-DI)
    MOV CX, CX-SI
    MOV DX, DX+DI
    INT 10H         ; (CX-SI, DX+DI)
    MOV CX, CX+DI
    MOV DX, DX+SI
    INT 10H         ; (CX+DI, DX+SI)
    MOV CX, CX+DI
    MOV DX, DX-SI
    INT 10H         ; (CX+DI, DX-SI)
    MOV CX, CX-DI
    MOV DX, DX-SI
    INT 10H         ; (CX-DI, DX-SI)
    MOV CX, CX-DI
    MOV DX, DX+SI
    INT 10H         ; (CX-DI, DX+SI)
    ; 更新圆参数
    ADD AX, BP
    ADD BP, 2
    ADD SI, 1
    CMP AX, 0
    JLE CIRCLE_SKIP
    SUB DI, 1
    SUB AX, DI*2
CIRCLE_SKIP:
    CMP SI, DI
    JLE CIRCLE_LOOP
    RET

2. 绘制棋子上的汉字

8086无直接汉字输出功能,需提前准备16x16点阵字模(用字模工具生成),逐点绘制:

; 子程序:绘制汉字
; 输入:CX=起始X,DX=起始Y,SI=字模地址,AL=颜色
DRAW_CHAR:
    MOV BP, 16       ; 汉字点阵高度
CHAR_ROW_LOOP:
    MOV BX, 16       ; 每行像素数
    MOV AH, 0CH
CHAR_COL_LOOP:
    ROL BYTE PTR [SI], 1
    JC DRAW_POINT
    JMP NEXT_POINT
DRAW_POINT:
    INT 10H
NEXT_POINT:
    INC CX
    DEC BX
    JNZ CHAR_COL_LOOP
    INC SI
    MOV CX, CX-16
    INC DX
    DEC BP
    JNZ CHAR_ROW_LOOP
    RET

将“帅”“车”等汉字的点阵字模存入数据段,调用该子程序即可绘制。

三、实用建议

  • 可根据屏幕分辨率调整坐标、间隔,保证棋盘比例协调
  • 将绘制逻辑封装为子程序,便于重复调用
  • 用数组存储所有棋子的坐标、类型,绘制时遍历数组批量生成

内容的提问来源于stack exchange,提问作者M1N2l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:55:26