基于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
相关产品推荐
相关产品推荐

