四子棋游戏程序设计
女鬼剑士加点-电影建国大业观后感
武汉理工大学《微机原理与接口技术》课程设计
四子棋游戏程序设计
1设计任务及要求
1.1设计任务
设计一个四子棋游戏程序,棋盘为8X8(64格),先达到4子成一条线即结束
游戏。
(该程序在DOS下运行)。
1.2任务要求
(1)画出棋盘界面。
(2)定义键盘的功能,可以实现棋子左右移动及落子。
(3)棋子不能悬空,落子后不能再移动。
(4)人、人分别落子。
(5)用不同的颜色区分各方的棋子。
(6)撰写设计说明书及调试心得。
1
武汉理工大学《微机原理与接口技术》课程设计
2程序设计思路
2.1 主程序及模块链接
四子棋的程序中包含许多模块,其中有
棋盘的绘制,棋子的绘制以及棋子坐
标位置的计算,棋子胜负的算法等等,在主程序中需要将这些模块链
接起来。
程序主流程图:
流程图
开始
画棋盘
控制游戏开始,并且玩家落
子
写棋子并计算棋子的位子
判断棋盘中是否有横,竖,
斜线上是否有四子练成直
线。
是
否
继续落子,直到下完
结束
2
武汉理工大学《微机原理与接口技术》课程设计
程序运行界面图
图2-1 程序运行界面截图
3
武汉理工大学《微机原理与接口技术》课程设计
2.2棋盘的绘制
本次课程设计要求是绘制8x8格的棋盘,在绘制过程中,需要调用dos
功
能调用中的int 10h命令,利用该命令中的多项功能可以完成绘制棋盘中所需要
的划线
和填充颜色,从而绘制出8x8格棋盘!
开始划线
划横线
画竖线
完成格子颜色的填充
完成划线
绘制棋盘程序代码:
ro
rcolor,rrow,rcol,endcol 调用划线的命令
local rline1
line horizon
mov
dx,rrow
mov cx,rcol
rline1:
mov al,rcolor 调用int 10h
中的och功能
mov ah,0ch
int 10h
inc cx 累加1的功能
cmp cx,endcol
;比较cx和endcol的大小
jl rline1
;小于就再循环执行一次
4
武汉理工大学《微机原理与接口技术》课程设计
endm
段程序中,
dx的值没有变化,不断的累加cx的值,不断的写像素,从而达到
画横线的功能.
cline macro color,crow,ccol,endrow
;画竖线
local cline1
line vertical
mov dx,crow
mov cx,ccol
cline1:
;和上一段的程序相似
mov al,color
mov
ah,0ch
int 10h
inc dx
cmp dx,endrow
jl cline1
endm
dx的值没有变化,不断的累加cx的值,不断的写像素,从而完成画横线的功能。
mainfrm proc near
;主框架的设计
rline 1,65,1,640
;画横线
rline 1,415,1,640
cline
1,65,480,415 画竖线
blockpos 9,64,640,1,1 for upbackground
;在整个的界面中有8个颜色区,
程序的功能就是在横向-
纵向分别写像素,可以使的整块都有颜色.
linechess proc near
;画棋盘
mov dx,90 init row
hline:
mov cx,90 init column
hdot:
mov al,0fh set color
5
武汉理工大学《微机原理与接口技术》课程设计
;调用的int
10h 的0f功能,使的画出的线可以用颜色.
mov al,0fh
int 10h
inc cx
cmp cx,250
jle hdot
;小于或等于就跳转,
重新执行
add dx,20
;
线
cmp dx,250
jle hline
;
end of 15 hline
mov cx,90
;
vline:
mov dx,90
vdot:
mov al,0fh
mov ah,0ch
int 10h
inc dx
cmp dx,250
jle vdot
add cx,20
cmp cx,250
jle vline
end of 15 vline
ret
linechess endp
6
距离为20再画一条
不断的画,一共9条
和上面的相似
武汉理工大学《微机原理与接口技术》课程设计
2.3绘制棋子
绘制棋子模块的作用是根据鼠标返回的象素坐标写一级棋行表和界面对应
的棋子,以准备进入二
级棋行表进行判断。首先确定一个圆心,定义cx、dx,
确定棋子半径R,将棋子半径R赋值给cx、
dx,cx²+dx²-R²≤0则添加象素,否
则dx减1,继续判断,直至dx为0,dx=R,c
x依次减1,直至为0,如此作出
的是14圆,其余34圆按对称的方法作出。
程序流程图:
结束
Di
DEC Di Si=R
Si=0?
在(X+Si,Y+Di) (X-Si,Y+Di)
(X+Si,Y-Di)
(X—Si,Y—Di)
这四点写象素
(X+Si)*(X+Si)+(Y+Di)*(Y+Di)—R*R<0
开始
Di=R;si=R
DEC Si
7
武汉理工大学《微机原理与接口技术》课程设计
程序源代码:
showbchess proc near show black
chess in pan
push bp
push si
push di
mov chessrad,10
mov ax,si
;calculate x and y
and ax,00ffh
mov bl,20
mul bl
add ax,90
mov x,ax
mov al,ccount
mov bl,20
mul bl
add ax,90
mov y,ax
call mouseshut ;鼠标调用
mov
al,chessrad
cbw
mov di,ax
loopx:
mov al,chessrad
cbw
mov si,ax
loopy:
cal si
;calcuate (x-x0)*(x-x0)
mov tempt1,ax
cal di calcuate (y-y)*(y-y0)
8
武汉理工大学《微机原理与接口技术》课程设计
add
tempt1,ax
mov al,chessrad
cbw
cal ax
sub tempt1,ax
;(x-x0)*(x-x0)+(y-y0)*(y-y0)-R*R
jns nextd
; if > 0 ?
mov dx,y
mov cx,x
call writeb
add dx,di
add cx,si
call writeb
sub
cx,si
sub cx,si
call writeb
mov dx,y
mov cx,x
sub
dx,di
sub cx,si
call writeb
add cx,si
add cx,si
call
writeb
nextd:
dec si
cmp si,0
jl nextdb
jmp loopy
nextdb:
< 0 in circle
;write pit in (x,y)
write pit in (x+si,y+di)
write pit in (x-si,y+di)
write pit in
(x-si,y-di)
write pit in (x+si,y-di)
9
武汉理工大学《微机原理与接口技术》课程设计
dec
di
cmp di,0
jl exitdb
jmp loopx
exitdb:
call mouseshow
pop di
pop si
pop bp
ret
showbchess endp
writeb
proc near
mov al,0
mov ah,0ch
int 10h
exitw:
ret
writeb endp
2.4鼠标功能及界面信息的实现
运用int 21h,int 10h,09h等
BIOS中断及功能调用,通过输出的字符串提
示,使用户比较方便的运行程序。
printwelcome proc near
setcursor
1,20 ;设置光标位置
mov bx,offset m2
;取m2的偏移地址给bx
output:
call
delay1 ;调用delay1延时函数
mov
al,[bx]
10
武汉理工大学《微机原理与接口技术》课程设计
cmp al,'?' ;循环比较,判断输出字符
je
exit0
mov ah,02h
mov dl,[bx]
int 21h
inc bx
jmp
output
exit0:
ret
printwelcome endp
光标,信息块及填充颜色块的宏定义和鼠标的功能调用。
mouseinit
proc near ;鼠标复位
mov ax,0
int
33h
ret
mouseinit endp
mouseshow proc near ;显示鼠标光标
mov ax,1
int 33h
ret
mouseshow
endp
mouseshut proc near ;隐藏鼠标光标
mov ax,2
int 33h
ret
mouseshut endp
mousestau proc near ;读鼠标光标
mov ax,3 return button status in bx
int 33h horizion in cx
11
武汉理工大学《微机原理与接口技术》课程设计
;vertical in dx
ret
mousestau
endp
mousepressed proc near ; 按鼠标光标
mov bx,0 check for left button
mov
ax,5 return statu in ax
int 33h
;num in bx
horizion in
cx,vertical in dx
ret
mousepressed endp
mouseliberty proc near
; 释放鼠标光标
mov bx,0 check for left
mov ax,6 liberty mouse
int
33h
ret
mouseliberty endp
2.5胜负判断
胜负判断的算法:该算法的作用主要是判断玩家的落子后是否构成
胜负关系,
以及给出胜负的具体一方,该算法主要是在一个长度为64的存储区段来表示一个
8
x8的数组,其中由一级棋行表传入的部分只占据在其中一个位置,周围一圈的
位置的数据用来判断是否
结束一行判断。
12
武汉理工大学《微机原理与接口技术》课程设计
程序流程图:
开始
数据移到
BX
开始列测试,方
法与行测试在个
开始行测
数据在地址距离
试。
游差别外其他一
样
是否构成胜
负
转到下个元
素
一行是否测
完
转到下行
的起始元
素
是否全部测
完
开始斜向方法与
行测试,异同同
上
开始另一个斜方
向的测试,异同同
上
结束
程序源代码:
datarea segment
qixingbiao1
dw 64 dup( ?)
13
武汉理工大学《微机原理与接口技术》课程设计
zancun dw ?
mess1 db 'you
win',0dh,0ah,'$$'
mess2 db 'you loss
',0dh,0ah,'&'
datarea ends
prognam segment
main proc far
assume cs:prognam,ds:datarea
start: push ds
sub ax,ax
push ax
mov ax,datarea
mov
ds,ax
;MIAN PART OF THE PROGNAM IS HERE
mov cx,0
mov di,0
mov
si,36
yici: call hcs
;开始行测试
add si,4
inc di
sub di,7 ;判断是否所有行已测完
jbe yic1
mov cx,0
;开始列测试
mov di,0
mov si,34
yici1: call lcs
add si,4
inc di
sub di,7
;判断是否所有行以测完
jbe yici1
14
武汉理工大学《微机原理与接口技术》课程设计
mov cx,0
mov di,0
; 开始撇测试
mov si,34
yici2: call pcs
add si,4
inc di
sub di,7 ;判断是否所有行已测完
jbe yici2
mov cx,0
mov
di,0
mov si,9
yici3: call ncs
;开始捺测试
add si,4
inc di
sub di,7
;判断是否所有行已测完
jbe yici3
ret
main endp
hcs proc near
hengceshi: mov
bx,qixingbiao1[si] ;测试一个数据
mov ax,bx
cmp x,6
jz exit1
;如在二级棋行表的边界则退出
mov zancun,si
heng:
mov ax,qixingbiao[si] ;是否有棋子
sub ax,8
jz exit
mov ax,qixingbiao1[si]
;是否为同色棋子
sub ax,bx
15
武汉理工大学《微机原理与接口技术》课程设计
jnz next ;不是,转测反向
call bjlj
;是,累加CX判断
add si,2
jmp
heng
next: mov si,zancun
;恢复被判断棋子的位置
;到右侧的数据继续判断
ub cx,1
hengf: mov
ax,qixingbiao1[si]
cmp ax,8
jz exit
mov
ax,qixingbiao1[si]
sub ax,bx
jnz exit
call bjlj
sub si,2
jmp hengf
exit:
mov si,zancun
add si,2
mov cx,0
jmp hengceshi
exit1: ret
hcs endp
lcs proc near
lieceshi: mov bx,qixingbiao1[si]
mov ax,bx
cmp bx,6
jz
exit3
mov zancun,si
lie: mov ax,qixingbiao[si]
sub ax,8
;测反方向,
;是否为有棋子
;判断棋子是否同色
;不是 到下个元素判断
;是 继续累加判断
;转左边继续判断
;恢复棋子在棋行表的位置
;继续下个元素的行测试
;测试一个数据
;如在二级棋行表的边界则退出
;是否有棋子
16
武汉理工大学《微机原理与接口技术》课程设计
jz exit
mov
ax,qixingbiao1[si]
;是否为同色棋子
sub ax,bx
jnz
next ;不是,转测反向
call bjlj
;是,累加CX判断
add si,16
;到上方的数据继续判断
jmp lie
next1: mov
si,zancun
sub cx,1
lief:
mov ax,qixingbiao1[si]
cmp ax,8
jz exi
mov
ax,qixingbiao1[si]
sub ax,bx
jnz exit2
call bjlj
sub si,16
jmp
life
exi2t: mov si,zancun
add si,2
mov cx,0
jmp lieceshi
exit3: ret
lcs
endp
pcs proc near
pieceshi: mov
bx,qixingbiao1[si]
mov ax,bx
cmp bx,6
jz exit4
;
17
;恢复被判断棋子的位置
;测反方向
;是否为有棋子
;判断棋子是否同色
;不是 到下个元素判断
;转下方边继续判断
;恢复棋子在棋行表的位置
;继续下个元素的行测试
如在二级棋行表的边界则退出
武汉理工大学《微机原理与接口技术》课程设计
mov zancun,si;
pie: mov
ax,qixingbiao[si] ;是否有棋子
sub ax,8
jz exit5
mov
ax,qixingbiao1[si] ;是否为同色棋子
sub ax,bx
jnz next3
call bjlj
add si,30
jmp pie
next3: mov si,zancun
sub cx,1
pief: mov ax,qixingbiao1[si]
cmp ax,8
jz
exit
mov ax,qixingbiao1[si]
sub ax,bx
jnz exit5
call bjlj
sub si,30
jmp pief
exit5: mov si,zancun
add si,2
mov cx,0
jmp
piecesi
exit1: ret
hcs endp
ncs proc
near
naceshi: mov bx,qixingbiao1[si]
;不是,转测反向
;是,累加CX判断
;到左上方的数据继续判断
;恢复被判断棋子的位置
;测反方向
;是否为有棋子
;判断棋子是否同色
;不是 到下个元素判断
;是 继续累加判断
;转右下方继续判断
;恢复棋子在棋行表的位置
18
武汉理工大学《微机原理与接口技术》课程设计
mov
ax,bx
cmp bx,6
jz
exit6 ;如在二级棋行表的边界则退出
mov zancun,si
na: mov
ax,qixingbiao[si] ;是否有棋子
sub ax,8
jz exit7
mov
ax,qixingbiao1[si]
sub ax,bx
jnz next4
call bjlj
add si,14
jmp na
next4: mov si,zancun
sub cx,1
naf: mov
ax,qixingbiao1[si]
cmp ax,8
jz exit
mov
ax,qixingbiao1[si]
sub ax,bx
jnz exit7
call bjlj
sub si,2
jmp hengf
exit7:
mov si,zancun
add si,2
mov cx,0
jmp hengceshi
exit16: ret
;是否为同色棋子
;不是,转测反向
;是,累加CX判断
;到右上方的数据继续判断
;恢复被判断棋子的位置
;测反方向
;是否为有棋子
;判断棋子是否同色
;不是 到下个元素判断
;是 继续累加判断
;转左下边继续判断
;恢复棋子在棋行表的位置
;继续下个元素的行测试
19
武汉理工大学《微机原理与接口技术》课程设计
hcs endp
bjlj proc near
inc cx
;累加
sub cx,5d
;是否四子连珠
jz mess
;给出信息
ret
mess: mov
cx,qixingbiao1[si]
sub cx,7
jz winw
mov dx,offset mess1
mov ah,09h
int 21h
ret
winw: mov dx,offset mess2
mov ah,09h
int 21h
ret
bjlj endp
prognam ends
end start
20
;白方胜
;黑方胜
武汉理工大学《微机原理与接口技术》课程设计
3程序设计小结
通过运用MF2KP软件对程序进行测试。对每一个程序模块进行单独的测试,
从中找
出问题,一次次的调试与验证。最后将所有测试完毕后的模块程序链接起
来,再次进行测试和修改,得到
完整的程序。当然,在设计过程中遇到一些不清
楚的环节,比如棋盘绘制中需要调用的int 10h功
能等,最后通过请教同学和查
阅资料找到了答案。还有在绘制棋子的过程想过很多方法绘制棋子,最后选
择通
过绘制圆的方法绘制出棋子。总之,在编写程序的过程中遇到很多问题,最后和
小组成员一
起通过不懈地努力很好的解决了问了,完成课程设计。
4心得与体会
这次课程设计使我使我认识到我在汇编语言学习上的很多严重不足,现在算
法编制不简洁,程序冗长,出
现即使是自己编写的也造成很难读懂的情况,对一
些命令认识有很大的疏漏,对命令的含义和使用方法理
解的不够深刻,造成编写
的垃圾代码过多。通过这次的课程设计,对我的汇编语言的编程方法掌握时有很
大帮助,我发现并解决了平常一些不明显但实际上却很严重的问题,我对模块化
的编程方式也有
了更深的理解,我想我会在以后的课程设计中克服这次课程设计
所暴露的问题,不在烦类似的错误。 <
br>软件的设计依靠团体中的每一个人共同努力,相互协作,才能做到最好。学
习计算机专业需要广泛
的知识,不能仅依靠课本的东西程序设计需要勤练习,多
上机,多调试。
21
武汉理工大学《微机原理与接口技术》课程设计
参考文献
【1】《微机原理与接口技术》 周佩玲 彭虎 电子工业出版社
【2】《汇编语言程序设计》 沈美明 清华大学出版社
【3】《微型计算机原理与接口技术》 吴秀清 中国科学技术大学出版社
【4】《微型计算机系统原理及应用》 周明德 清华大学出版社
【5】《微型计算机技术及应用》 戴梅萼 清华大学出版社
22