C语言中断编程(C--五子棋实例).doc_第1页
C语言中断编程(C--五子棋实例).doc_第2页
C语言中断编程(C--五子棋实例).doc_第3页
C语言中断编程(C--五子棋实例).doc_第4页
C语言中断编程(C--五子棋实例).doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

C语言中断编程(C五子棋实例)中断是微处理器与外部设备进行信息交换的一种方式。使用中断,可以获得更高的执行速度和更好的交互效果(如游戏编程中对鼠标或键盘的调用来完成某些游戏功能)。本文档以简单“五子棋双人游戏”为案例,整个游戏过程用鼠标操作完成,很好的阐明中断在程序中简便操作和简单明了的交互作用。 图1、五子棋双人游戏屏幕截图(蓝棋胜)BIOS(Basic Input Output System),中文是“基本输入输出系统”。它是全称是ROMBIOS,即只读存储器基本输入输出系统。实际上它是一组固化到计算机主板上的一个ROM芯片上的程序,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。BIOS的主要有以下3个作用:1、自检及初始化程序 计算机电源接通后,系统有一个对内部各个设备进行检查的过程,由一个称为POST(Power On SelfTest,上电自检)的程序完成,这也是BIOS程序的一个功能。完整的自检包括对CPU、640KB的基本内存、1MB以上睥扩展内存、ROM、主板、CMOS存储器、串并口、显示卡、软硬盘子系统及键盘的测试。2、硬件中断处理计算机开机的时候,BIOS会通知CPU等硬件设备的中断号。操作时,当输入了使用某个硬件的命令后,它就会根据中断使用相应的硬件完成命令的工作,最后根据中断号跳回原来的状态。3、程序服务请求从BIOS的定义可以看出它总是和计算机的输入输出设备打交道,通过特定的数据端口发出指令,发送或接收各类外部设备的数据,从而实现软件应用程序对硬件的操作。BIOS功能调用C语言提供了一些BIOS功能调用函数,方便用户在自己的程序中进行BIOS调用有int86()函数、int86x()函数和geninterrupt()函数。1. int86()函数int int86(int intr_num,union REGS *inregs,union GEGS *outregs);第1个参数intr_num表示BIOS调用类型号;第2个参数表示指向联合类型REGS的指针,用于接收调用的功能号及其他一些指定的入口参数,以便传给相应的寄存器;第3个参数也是一个指向联合类型REGS的指针,用于接收功能调用后的返回值,即出口参数。联合类型REGS在dos.h文件中定义:struct WORDREGS unsigned int ax, bx, cx, dx, si, di, cflag, flags;struct BYTEREGS unsigned char al, ah, bl, bh, cl, ch, dl, dh;union REGS struct WORDREGS x; struct BYTEREGS h;2. int86x()函数int int86x(int intno,union REGS *inregs,union REGS *outregs,struct SREGS *segregs);函数中前3个参数与int86()函数中的相同,第4个参数是一个结构SREGS类型的指针。该结构在dos.h头文件中定义:struct SREGS unsigned int es; unsigned int cs;unsigned int ss; unsigned int ds;该结构是为了设置和保存段寄存器的值,在int86x()函数中,只用了SREGS结构中的ds和es,它对应于数据寄存器DS和附加寄存器ES。进行int86x()函数调用时,要设置两个寄存器为要改变的值。调用时,该函数自动将原来未改变的值保存,然后使用改变后的DS和ES的值,调用结束后,该函数又自动恢复原来的值。3. geninterrupt()函数int geninterrupt(int intr_num);参数intr_num表示功能调用的类型号。具体的功能号和入口参数则在调用该函数前通过Turbo C中伪寄存器_AH、_AL指定。鼠标中断编程应用实例DOS操作系统和Turbo C 2.0并不支持鼠标器的操作,因而要使用鼠标器,必须首先要安装相应的驱动程序,通常使用的方法是在CONFIG.SYS文件中加入一行信息:DEVIVE=MOUSE.SYS。使得在DOS启动时,将鼠标的驱动程序也装入内存,或者也可以直接运行mouse.orn文件,使它驻留在内存。安装好鼠标的驱动程序并进行初始化后,就可以使用鼠标驱动程序管理鼠标的各种操作。鼠标驱动程序将INT 33H中断作为鼠标的操作中断,这样每移动一下鼠标,或者按一下鼠标按钮,就将产生一次INT 33H中断。鼠标驱动程序将按照中断时的入口参数,调用不同的功能处理程序,完成中断服务。对于Microsoft鼠标驱动程序,共提供了30多个功能调用,用户可以通过INT33H中断调用,选用不同的入口参数,实现相应的功能调用。 INT33H中断调用功能号和对应功能功能号功能简介功能号功能简介0鼠标复位及取状态20交换中断程序1显示鼠标光标21取驱动程序的存储要求2鼠标光标不显示22保存驱动程序状态3取按钮状态和鼠标位置23恢复驱动程序状态4设置鼠标光标位置24设辅助程序掩码和地址5取按钮压下状态25取用户程序地址6取按钮松开状态26设置分辨率7设置水平位置最大值27取分辨率8设置垂直位置最大值28设置中断速度9设置图形光标29设置显示器显示的页号10设置文本光标30取显示器显示的页号11取鼠标移动的方向和距离31关闭驱动程序12设中断程序掩码和地址32打开驱动程序13打开光标模拟33软件重置14关闭光标模拟34选择语言15设置鼠标移动速度35取语言编号16条件关闭36取版本号及鼠标类型和中断号19设置速度加倍的下限37取鼠标驱动有关信息五子棋双人游戏实例剖析:1、鼠标调用实现过程 A . 安装和初始化鼠标,通过INT 33H的0号功能调用检测鼠标驱动程序的安装情况,调用7号和8号功能设置鼠标在屏幕的活动区域范围。int MouseInit(int Xmin,int Xmax,int Ymin,int Ymax) int retcode; union REGS regs; regs.x.ax=0; int86(51,®s,®s); retcode=regs.x.ax; if(retcode=0) return 0; regs.x.ax=7; regs.x.cx=Xmin; regs.x.dx=Xmax; int86(51,®s,®s); regs.x.ax=8; regs.x.cx=Ymin; regs.x.dx=Ymax; int86(51,®s,®s); return retcode; B .鼠标的表现形态,为了更好的使用鼠标的各种信息,程序中设置了鼠标数据结构:typedef struct int mx; int my; int mkey; int bf1616;MOUSEH; 鼠标的形态,在程序中鼠标用一个“十”形状出现。在绘制鼠标形状前把所要绘制区域的屏幕图像保存到鼠标缓冲区,然后再绘制鼠标。void DrawMouse(MOUSEH *ht) int i,j; for(i=0;i16;i+) for(j=0;jbfij=getpixel(ht-mx-8+j,ht-my-8+i); for(i=0;imx,ht-my-3+i,6); putpixel(ht-mx-3+i,ht-my,6); 隐藏鼠标,擦除鼠标的运动轨迹并恢复屏幕形态。在改变鼠标物理位置前把原来鼠标区域缓冲区的图像恢复到屏幕上。void HideMouse(MOUSEH *hw) int i,j; for(i=0;i16;i+) for(j=0;jmx-8+j,hw-my-8+i,hw-bfij); C .获取鼠标的数据(物理位置和按钮操作状态),调用3号功能来实现。void MouseRead(MOUSEH *hd) union REGS r1; int dx,dy,ky; do r1.x.ax=3; int86(51,&r1,&r1); dx=r1.x.cx; dy=r1.x.dx; hd-mkey=r1.x.bx; while(dx=hd-mx&dy=hd-my&!hd-mkey); HideMouse(hd); hd-mx=r1.x.cx; hd-my=r1.x.dx;2、游戏主界面的设计(棋盘),棋盘为15行和15列纵横交错的矩形区域。在盘面上用9个小圆把棋盘分成若干个区域便于下棋。void DrawWindow() int i; setcolor(3); for(i=0;i15;i+) line(Posi,Pos0,Posi,Pos14); for(i=0;imy+3-Pos0)/20; c=(ht-mx+3-Pos0)/20; rm0=-1; if(BOX_BFrc0=0) if(ht-mx=Posc-3&ht-mxmy=Posr-3&ht-my=Posr+3) rm0=1; rm1=r; rm2=c; 4、检测游戏是否结束(哪方胜利),对下到棋盘上棋子在所在行、列、左上、左下、右上、右下的检测,看同一颜色的棋子在同一方向上是否连续有5颗棋了连在一起,如果有游戏胜利结束。int GameOver(int r,int c,int vcolor) int i,j,tr,tc,k; tr=r;k=0; for(i=0;i15;i+) if(BOX_BFic0=1&BOX_BFic1=vcolor) k+; else k=0; if(k=5) return 1; k=0; for(i=0;i15;i+) if(BOX_BFri0=1&BOX_BFri1=vcolor) k+; else k=0; if(k=5) return 1; k=0;tr=0; for(i=0;i15;i+) for(j=0;j15-i;j+) if(BOX_BFtr+jj0=1&BOX_BFtr+jj1=vcolor) k+; else k=0; if(k=5) return 1; tr+; k=0;tc=0; for(i=0;i15;i+) for(j=0;j15-i;j+) if(BOX_BFjtc+j0=1&BOX_BFjtc+j1=vcolor) k+; else k=0; if(k=5) return 1; tc+; k=0;tr=0; for(i=0;i15;i+) for(j=0;j15-i;j+) if(BOX_BFtr+j14-j0=1&BOX_BFtr+j14-j1=vcolor) k+; else k=0; if(k=5) return 1; tr+; k=0;tc=0; for(i=0;i15;i+) for(j=0;j15-i;j+) if(BOX_BFj14-tc-j0=1&BOX_BFj14-tc-j1=vcolor) k+; else k=0; if(k=5) return 1; tc+; return 0;附:五子棋双人游戏程序源码#include graphics.h#include dos.hint Pos15=100,120,140,160,180,200,220,240,260,280,300,320,340,360,380;typedef struct int mx; int my; int mkey; int bf1616;MOUSEH;MOUSEH *hw;int Rm3;int FCOLOR=15;int BOX_BF15152;void DrawWindow() int i; setcolor(3); for(i=0;i15;i+) line(Posi,Pos0,Posi,Pos14); for(i=0;imy+3-Pos0)/20; c=(ht-mx+3-Pos0)/20; rm0=-1; if(BOX_BFrc0=0) if(ht-mx=Posc-3&ht-mxmy=Posr-3&ht-my=Posr+3) rm0=1; rm1=r; rm2=c; void DrawCircle(int x,int y,int fcolor) setcolor(8); circle(x,y,8); setfillstyle(1,fcolor); floodfill(x,y,8);int MouseInit(int Xmin,int Xmax,int Ymin,int Ymax) int retcode; union REGS regs; regs.x.ax=0; int86(51,®s,®s); retcode=regs.x.ax; if(retcode=0) return 0; regs.x.ax=7; regs.x.cx=Xmin; regs.x.dx=Xmax; int86(51,®s,®s); regs.x.ax=8; regs.x.cx=Ymin; regs.x.dx=Ymax; int86(51,®s,®s); return retcode;void HideMouse(MOUSEH *hw) int i,j; for(i=0;i16;i+) for(j=0;jmx-8+j,hw-my-8+i,hw-bfij);void MouseRead(MOUSEH *hd) union REGS r1; int dx,dy,ky; do r1.x.ax=3; int86(51,&r1,&r1); dx=r1.x.cx; dy=r1.x.dx; hd-mkey=r1.x.bx; while(dx=hd-mx&dy=hd-my&!hd-mkey); HideMouse(hd); hd-mx=r1.x.cx; hd-my=r1.x.dx;void DrawMouse(MOUSEH *ht) int i,j; for(i=0;i16;i+) for(j=0;jbfij=getpixel(ht-mx-8+j,ht-my-8+i); for(i=0;imx,ht-my-3+i,6); putpixel(ht-mx-3+i,ht-my,6); void Init() int i,j; for(i=0;i15;i+) for(j=0;j15;j+) BOX_BFij0=BOX_BFij1=0;void OutS(int color) setcolor(10); outtextxy(430,240,Game over!); outtextxy(430,320,Press and key.); DrawCircle(460,280,color); getch();int GameOver(int r,int c,int vcolor) int i,j,tr,tc,k; tr=r;k=0; for(i=0;i15;i+) if(BOX_BFic0=1&BOX_BFic1=vcolor) k+; else k=0; if(k=5) return 1; k=0; for(i=0;i15;i+) if(BOX_BFri0=1&BOX_BFri1=vcolor) k+; else k=0; if(k=5) return 1; k=0;tr=0; for(i=0;i15;i+) for(j=

温馨提示

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

评论

0/150

提交评论