五子棋实验报告
班 级:00090B4
组 长:黄柒光(41)
小组成员: 赵全乐(32)
武江波(26)
祝 将(12)
洪春金(17)
2003-01-16
五子棋程序设计报告
组 长:黄柒光(41)
小组成员: 赵全乐(32)
武江波(26)
祝 将(12)
洪春金(17)
模块划分:
黄柒光:主程序算法的实现及各模块之间的连接
赵全乐:棋子的制作及调用
武江波:文件的保存及打开
祝 将:图形界面及边框
洪春金:鼠标的响应及文字信息的显示
一、总程序设计的流程图:
开始
图形界面 submain
colorset mainfrm subfrm printmess printwelcome
colorblock blockpos setframe showmessage
setframe lineframe delay1 showmessage
submain
inkey inmouse
play pause replay save open sound about
mainframe2 chesssave1 chessopen1 chessabout1
countmemchess showbchess bjudgechess showwchess wjudgechess
二、游戏总界面
三、各模块的设计及算法
模块一:主程序算法的实现及各模块的连接
1:程序思想:
每按下鼠标,调用鼠标的 5 号功能,找到鼠标所点击的位置,再计算出所点击棋子所在的行和
列,同时利用相对基址变址寻址方式,BP 计算所在的行,SI 计算所在的列,如不是在棋盘的交叉
点,则利用整形思想,把它放在离它最近的棋盘交叉点,再进行对棋盘的位置判断是否有棋子,如
有则取消操作,否则显示棋子,棋子落定以后再进行对四个方向进行判断是否有五个同色的棋子,
如发现有,则程序结束,否则继续下棋。
2:程序算法:
用到的主要子程序有:Countmemchess ,Bjudgechess,Wjudgechess
countmemchess 用于计算棋子的位置
countmemchess proc near ;for search chess in mem pos
sub cx,90
mov bl,20
mov ax,cx
div bl
cmp ah,10
jb little1
inc al
little1:
mov a1,al
mov b1,ah
and ax,00ffh
mov si,ax ;for horizion pos
sub dx,90
mov bl,20
mov ax,dx
div bl
cmp ah,10 ; < 10 ?
jb little2
inc al
little2:
mov a2,al
mov b2,ah
and ax,00ffh
mov ccount,al
mov bl,16
mul bl
mov bp,ax
ret
countmemchess endp
bjudgechess 用于判断黑棋输赢的算法:Bp 是棋子所在的棋盘的行×16,Si 是棋子所在棋盘的列。
以下是判断黑棋水平方向赢的流程图:
遇到的问题:
起初,我把计算出的行放在 bp,列放在 si,后来,经过调程序发现在一些位置不能放棋子,这
是返回程序发现【mchess+bp+si】所指的位置和【mchess+si+bp】所指的位置是同一个内存单元。
如:第二行三列和第三行二列的棋子放在同一个内存单元,因此,我就把 bp*16 这样就避免了存放
在一个单元。还有一个问题就是判断棋子的输赢;起初我考虑了八个方向,以所下棋子为中心进行
判断,后来经过调程序发现这样不行,因为如果所下的棋子处在 5 个同色棋子中间,而不是开头或
末尾,这样即使有五个同色棋子连在一起也不能判断为赢;后来我经过修改,变成 4 个方向而不是
以它为中心算,离它 4 个棋子位置的算起,这样终于实现了判断输赢。
其实,在程序设计中还遇到很多问题,只不过在调试中及时修改了。
心得体会:
这次课程设计给我最大的体会就是调试程序的难度和时间并不亚于编程序,有一次,一上午写
Bp 不变,Si=Si—4
Bx=Bp,Di=Si,Ch=
5,Cl=0
(Bp,Si)
是黑棋
Cl=Cl+1
Si=Si+1
Cl=5
退出,黑棋赢
Di—1,Si=Di
Dh=Dh—1
DH=0
判断其他方向
Y
Y
Y
N
N
N