汇编语言五子棋课程设计_第1页
汇编语言五子棋课程设计_第2页
汇编语言五子棋课程设计_第3页
汇编语言五子棋课程设计_第4页
汇编语言五子棋课程设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国古代汉族人发明,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。已在各个游戏平台有应用。古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(1717)棋盘,至南北朝时即已流行十九路(1919)棋盘,直至1931年出现所谓五子棋专用棋盘。关键字:汇编语言,五子棋,棋盘AbstractGobang is a game of pure strategy type two han Chinese chess puzzle games, chess and go gm, invented by the ancient Chinese han, originated in China ancient times the traditional black white one kind. Mainly in Chinese and Chinese culture as well as Europe and the United States in some areas.Easy to use, for young and old, and fun, fascinating; Can not only enhance thinking ability, improve intelligence, and high in philosophy, helps to cultivate ones morality raises a gender. Has been applied to various game platform have.Ancient renju boards and go board is universal, for when the south-north road 17 (17 * 17) board, to the northern and southern dynasties which have been popular in the 19th road (19 lines) board, until in 1931 the so-called special renju board.Keywords: gobang, the realization of assembly language,chessboard目录1 概述12 总体设计流程图23 各模块的设计及算法33.1 模块一:主程序算法的实现及各模块的连接33.1.1 程序思想33.1.2 程序算法33.2 模块二:棋子的制作及调用43.3 模块三:文件的保存与打开73.4 模块四:界面及框架的设计93.5 模块五:鼠标功能的调用及显示界面信息94.1 程序运行初始界面134.2 程序运行中界面13附录:源代码1731 概述五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜半岛),于1688年至1704年的日本元禄时代传到日本的。到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899年规定,禁止黑白双方走“双三”;1903年规定,只禁止黑方走“双三”;1912年规定,黑方被迫走“双三”亦算输;1916年规定,黑方不许走“长连”;1918年规定,黑方不许走“四、三、三”;1931年规定,黑方不许走“双四”,并规定将1919的围棋盘改为1515的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。2 总体设计流程图submaininkeyinmouseplaypausereplaysaveopensoundaboutMainframe2Chesssave1Chessopen1Chessabout1coutmemchessshowbchessbjudgechessshowwchesswjudgechesscolorbackblockpossetframeshowmessagesetframelineframeDelay1showmessagestartgraphical interfacesSubmaincolorsetMainfrmsubfrmprintmessprintwelcome 3 各模块的设计及算法3.1 模块一:主程序算法的实现及各模块的连接3.1.1 程序思想每按下鼠标,调用鼠标的5号功能,找到鼠标所点击的位置,再计算出所点击棋子所在的行和列,同时利用相对基址变址寻址方式,BP计算所在的行,SI计算所在的列,如不是在棋盘的交叉点,则利用整形思想,把它放在离它最近的棋盘交叉点,再进行对棋盘的位置判断是否有棋子,如有则取消操作,否则显示棋子,棋子落定以后再进行对四个方向进行判断是否有五个同色的棋子,如发现有,则程序结束,否则继续下棋。3.1.2 程序算法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 endpbjudgechess用于判断黑棋输赢的算法:Bp是棋子所在的棋盘的行16,Si是棋子所在棋盘的列。以下是判断黑棋水平方向赢的流程图:Bp不变,SiSi4BxBp,DiSi,Ch5,Cl0(Bp,Si)是黑棋ClCl1SiSi1Cl5退出,黑棋赢Di1,SiDiDh=Dh1DH0判断其他方向YYYNNN3.2 模块二:棋子的制作及调用设计思想:首先确定一个圆心,定义cx、dx,确定棋子半径R,将棋子半径R赋值给cx、dx,cx+dx-R0则添加象素,否则dx减1,继续判断,直至dx为0,dxR,cx依次减1,直至为0,如此作出的是1/4圆,其余3/4圆按对称的方法作出。流 程 图:开始DiR;SiR(X+Si)*(X+Si)+(Y+Di)*(Y+Di)R*R 0 ? mov dx,y ; 0 in circle mov cx,x call writeb ;write pit in (x,y) add dx,di add cx,si call writeb ;write pit in (x+si,y+di) sub cx,si sub cx,si call writeb ;write pit in (x-si,y+di) mov dx,y mov cx,x sub dx,di sub cx,si call writeb ;write pit in (x-si,y-di) add cx,si add cx,si call writeb ;write pit in (x+si,y-di) nextd: dec si cmp si,0 jl nextdb jmp loopy nextdb: 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: retwriteb endp3.3 模块三:文件的保存与打开设计思想:在我们设计的五子棋中,每当开始游戏的时候,棋盘和每一个所下的棋子都在内存的一个连续的存储单元中。因此,保存的时候将只要重新开辟一个新的连续存储单元,再将内存单元中的数据传送至新的内存单元中即可。而打开则是遍历棋盘上的所有可落子的点,根据保存的内存单元中的内容,调用不同的子程序在当前运行的内存单元中进行下不下棋子,或下黑子还是白子等操作。流 程 图:保存流程图有无键盘输入判断是Y或N清除键盘缓冲区传送数据;计数器减1计数寄存器置256清除保存的提示字符串清除键盘缓冲区结束开始显示保存提示字符串计数器0?有无NY是否打开流程图开始打印键盘有无棋子寄存器置0显示黑子显示白子计数器加1计数器256结束是无有白判断黑白子黑是否3.4 模块四:界面及框架的设计设计思想:利用int 10h 的och,ofh和obh的功能,完成写像素的功能,从而可以完成画线,填充颜色等一系列的问题 。 1.我们选择的分辨率为640*480. 2.把它们分割成几个大块,分别为它们填充相应的颜色. 3.画棋盘(16*16). 4.画出控制命令窗口(7个).3.5 模块五:鼠标功能的调用及显示界面信息(一)设计思想:运用int 21h,int 10h,09h等 BIOS中断及功能调用,通过输出的字符串提示,给用户提供和谐,亲切,方便的界面,帮助用户运行程序。 1.制作五子棋的欢迎界面:通过设置光标的位置,利用BIOS 的字符显示输出功能,调用delay1延时函数,逐步输出每个字符。 源程序如下: printwelcome proc near setcursor 1,20 ;设置光标位置 mov bx,offset m2 ;取m2的偏移地址给bx output: call delay1 ;调用delay1延时函数 mov al,bx cmp al,? ;循环比较,判断输出字符 je exit0 mov ah,02h mov dl,bx int 21h inc bx jmp output exit0: ret printwelcome endp 2.显示右边框按钮信息:通过循环设置光标位置及循环调用showmessage宏定义,输出数据段中的play,stop,exit,replay,save,open,sound,about, blacktime,whitetime信息。 源程序见主程序 3.显示所有编辑制作者的名单:通过异或指令xor及比较指令cmp循环判断并调用子程序blockpos和colorblock输出或消除制作者名单。 源程序见主程序 4.光标,信息块及填充颜色块的宏定义和鼠标的功能调用。 源程序见主程序 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 ;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程序调试中遇到的主要问题: 1.界面还没法更完善 2.宏定义还不太熟悉4 调试分析4.1 程序运行初始界面4.2 程序运行中界面5 总结此程序基本上实现了五子棋游戏的基本功能,如:play,pause,replay,save,open。不足之处是游戏的美化做的不好,希望能下一步改进。参考文献1钱晓捷.32位汇编语言程序设计.北京:机械工业出版社,2011.8.2钱晓捷.16/32位微机原理、汇编语言及接口技术教程.北京:机械工业出版2011.11.1 钱晓捷.汇编语言程序设计(第四版) 电子工业出版社2 王爽.汇编语言(第二版) 清华大学出版社3 Windows API函数参考手册 人民邮电出版社,4 罗云彬.Windows环境下32位汇编语言程序设计(第二版) 电子工业出版社5 美Kip R.Irvine著,温玉洁,等译.Intel汇编语言程序设计(第五版) 电子工业出版社6 沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版) 清华大学出版社致谢 在这次课设选题以及进行过程中得到了老师和搭档的细心指导,在这个过程中,老师同学多次帮助我们,是我们在有些不懂得问题上得到了解决,其次,在这次课设中,没有和搭档的共同努力,也不会做出这个游戏,希望在以后的学习和生活中能够继续这种精神。附录:源代码TITLE Gobang (gobang.asm); Program Description:gobang game; Author:xiangwu,gongyunfei; Creation Date:2009.7.10; Revisions:; Date: Modified by:include irvine16.incVIDEO_SEGMENT = 0A000hWINDOW_WIDTH = 320WINDOW_HEIGHT = 200DEFAULT_LINE_LEN = 140BACK_COLOR = 35DESK_COLOR = 68LINE_COLOR = 120CONTROL_COLOR = 100BLACK = 254WHITE = 100TextColor = 2laxisx = 35maxisx = 180laxisy = 30maxisy = 175key_esc = 01hkey_f1 = 3Bhkey_f2 = 3Chkey_enter = 1Chkey_space = 39h.DATAtmp_es WORD 0tmp_bx WORD 0desk BYTE 289 dup(0)lastmousex WORD ?lastmousey WORD ?curmousex WORD ?curmousey WORD ?clickx WORD 0clicky WORD 0x_cl WORD ?y_cl WORD ?cur_bx WORD ?cur_si WORD ?curuser BYTE ?b_sec1 BYTE 0b_sec2 BYTE 0b_min1 BYTE 0b_min2 BYTE 0w_sec1 BYTE 0w_sec2 BYTE 0w_min1 BYTE 0w_min2 BYTE 0count1 BYTE 18count2 BYTE 18 playing BYTE ?saveMode BYTE ?; saved video modemsg byte Welcome to Gobang World! hintexit byte ESC :Exithintstart byte F1 :Starthintpause byte Space:Pausemsgww byte White Wins! msgbw byte Black Wins! msgtime byte 00:00msgtime_fix byte 00:00pausemsg byte Paused playmsg byte whiteplayer byte White sideblackplayer byte Black sideBmpName byte BMP.DAT,0Bmp byte 3E8H dup(?).CODEDraw_Line_Vertical Proto, startx:word, starty:word, len:word,color:byteDraw_Line_Horizontal Proto, startx:word, starty:word, len:word ,color:byteDraw_Circle Proto, centerx:word,centery:word,color:byteDraw_Desk ProtoDraw_Rectangle Proto, left:word ,top:word ,widt:word ,heig:word ,color:byteDraw_Square Proto ,cenx:word,ceny:word,color:byteDraw_Control ProtoPosToOffset Proto, posx:word,posy:word Distence Proto ,px1:word,py1:word,px2:word,py2:word PrintMessage Proto, hintmsg:ptr byte ,len:word , posh:byte,posl:bytePrintHintMessage Protomain PROCmov ax,datamov ds,axcall SetVideoModecall loadbmpinvoke Draw_Rectangle ,25,20,160,160,DESK_COLOR invoke Draw_Rectangle ,200,20,90,160,CONTROL_COLORcall Draw_Controlinvoke Draw_Rectangle ,200,77,91,49,0invoke Draw_Deskinvoke PrintMessage,addr msg,lengthof msg,0,5invoke PrintHintMessagecall initializecall init_countingcall listeningcall exit_gamemain ENDPinit_counting PROCpush esMOV AL,1CH MOV AH,35H INT 21H sti PUSH DS mov tmp_es,ES mov tmp_bx,BX MOV DX,OFFSET COUNTING MOV AX,SEG COUNTING MOV DS,AX MOV AL,1CH MOV AH,25H INT 21H POP DS in al,21h and al,b out 21h,al pop es retinit_counting ENDPCOUNTING PROCPUSH DS PUSH AX PUSH CX PUSH DX MOV AX,DATA MOV DS,AX cmp playing,0 je EXIT_NOW cmp curuser,0 je blackside DEC COUNT1 JNZ EXIT_NOW MOV COUNT1,18 inc w_sec1 cmp w_sec1,10 jnz showtime mov w_sec1,0 inc w_sec2 cmp w_sec2,6 jnz showtime mov w_sec2,0 inc w_min1 cmp w_min1,10 jnz showtime mov w_min1,0 inc w_min2showtime:mov al,w_min2add al,0mov msgtime,almov al,w_min1add al,0mov msgtime+1,almov al,w_sec2add al,0mov msgtime+3,almov al,w_sec1add al,0mov msgtime+4,alinvoke PrintMessage,addr msgtime,lengthof msgtime,21,68jmp EXIT_NOWblackside: DEC COUNT2 JNZ EXIT_NOWMOV COUNT2,18 inc b_sec1 cmp b_sec1,10 jnz showtime2 mov b_sec1,0 inc b_sec2 cmp b_sec2,6 jnz showtime2 mov b_sec2,0 inc b_min1 cmp b_min1,10 jnz showtime2 mov b_min1,0 inc b_min2showtime2:mov al,b_min2add al,0mov msgtime,almov al,b_min1add al,0mov msgtime+1,almov al,b_sec2add al,0mov msgtime+3,almov al,b_sec1add al,0mov msgtime+4,alinvoke PrintMessage,addr msgtime,lengthof msgtime,8,68 EXIT_NOW: POP DX POP CX POP AX POP DS IRET COUNTING ENDPinitialize PROCmov cx,225 ;initalize the arraymov si,offset deskinitarray:mov BYTE ptr ds:si,0inc siloop initarraymov ax,0 int 33hmov ax,7 ;set the x range of mousemov cx,laxisxmov dx,maxisxint 33hmov ax,8 ;set the y range of mousemov cx,laxisymov dx,maxisyint 33hmov ax,4 ;set the position of the mouse mov cx,105mov dx,100int 33hmov lastmousex,14mov lastmousey,14mov ax,5mov bx,0int 33hmov clickx,cxmov clicky,dxmov curuser,0 ;0 represent blackmov playing,0 ;set the statusmov w_sec1,0mov w_sec2,0mov w_min1,0mov w_min2,0mov b_sec1,0mov b_sec2,0mov b_min1,0mov b_min2,0retinitialize ENDPlistening PROC L1: ;listen to the keyboardmov ah,11h ; check keyboard bufferint 16hjz noKey ; no: exit now (ZF=0)mov ah,10h ; yes: remove from bufferint 16hcmp ah,key_esc ; was it the exit key?je quit ; yes: exit now (ZF=1)cmp ah,key_f1je newgamecmp ah,key_spaceje mypausejmp noKeyquit:call exit_game;jmp L1newgame:call new_game;jmp L1mypause:call pause_game;jmp L1noKey: ;listen to the mousecmp playing,0je L1mov ax,3int 33hmov ax,cxsub ax,laxisxmov cx,dxsub cx,laxisymov dx,0mov bx,10div bxmov curmousex,axmov ax,cxmov dx,0mov bx,10div bxmov curmousey,axmov cx,curmousexmov dx,axcmp cx,lastmousexjne newpositioncmp dx,lastmouseyjne newpositionjmp nextnewposition:mov dx,0mov ax,lastmousexmov bx,10mul bxadd ax,laxisxmov cx,axmov dx,0mov ax,lastmouseymov bx,10mul bxadd ax,laxisyinvoke Draw_Square,cx,ax,DESK_COLORmov dx,0mov ax,curmousexmov bx,10mul bxadd ax,laxisxmov cx,axmov dx,0mov ax,curmouseymov bx,10mul bxadd ax,laxisy invoke Draw_Square,cx,ax,BLACKmov ax,curmousexmov lastmousex,axmov ax,curmouseymov lastmousey,axnext:mov ax,5mov bx,0int 33hcmp cx,clickxjne newchesscmp dx,clickyje L1newchess:mov clickx,cxmov clicky,dxcall drawchessjmp L1listening ENDPexit_game PROCmov DX,tmp_bx push ds mov DS,tmp_es MOV AL,1CH MOV AH,25H INT 21H pop dscall RestoreVideoModeexitretexit_game ENDPnew_game PROCinvoke Draw_Rectangle ,25,20,160,160,DESK_COLOR invoke Draw_Rectangle ,200,20,90,160,CONTROL_COLORcall Draw_Controlinvoke Draw_Rectangle ,200,77,91,49,0invoke Draw_Deskinvoke PrintMessage,addr msg,lengthof msg,0,5call initializeinvoke PrintMessage ,addr playmsg,lengthof playmsg ,12,28;invoke PrintMessage ,addr blackplayer,lengthof blackplayer,20,26invoke PrintMessage,addr msgtime_fix,lengthof msgtime_fix,21,68invoke PrintMessage,addr msgtime_fix,lengthof msgtime_fix,8,68 call printupcall resetdownmov playing,1retnew_game ENDPpause_game PROC invoke PrintMessage,addr pausemsg,lengthof pausemsg,12,28mov playing,0no_space: mov ah,10h ; yes: remove from bufferint 16hcmp ah,key_escjne not_esc call exit_gamenot_esc: cmp ah,key_space ; was it the space key?jne no_space mov playing,1invoke PrintMessage,addr playmsg,lengthof playmsg,12,28mov ax,6mov bx,0int 33hmov clickx,cxmov clicky,dxretpause_game ENDPdrawchess PROCmov dx,0mov ax,clickxsub ax,laxisxmov bx,10div bxmov x_cl,axmov dx,0mov ax,clickysub ax,laxisymov bx,10div bxmov y_cl,axmov bx,offset deskmov dx,0mov ax,y_clmov cx,15mul cxadd bx,axmov cur_bx,bxmov si,x_clmov cur_si,simov cl,ds:bx+sicmp cl,0jne exit_nowmov al,curuserinc almov BYTE ptr ds:bx+si,almov dx,0mov ax,x_clmov bx,10mul bxadd ax,laxisxmov cx,axmov dx,0mov ax,y_clmov bx,10mul bxadd ax,laxisycmp curuser,0jne for_whiteinvoke Draw_Circle,cx,ax,BLACKcall checkwinmov curuser,1call resetupcall printdownjmp exit_nowfor_white:invoke Draw_Circle,cx,ax,WHITEcall checkwinmov curuser,0 call resetdown call printup exit_now: retdrawchess ENDPcheckwin PROCmov dx,1mov bx,cur_bxmov si,cur_simov al,ds:bx+simov cx,x_cl;jz h2horizion1: ;leftdec sicmp ds:bx+si,aljne h2inc dxcmp dx,5je succeedloop horizion1h2: ;rightmov si,cur_simov cx,14sub cx,x_cljz v1horizion2:inc sicmp ds:bx+si,aljne v1inc dxcmp dx,5je succeedloop horizion2v1:mov dx,1mov bx,cur_bxmov si,cur_simov cx,y_cl;jz v2vertical1: ;topsub bx

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论