1、C语言程序设计课程大型作业 大型作业内容介绍 图形操作简介 鼠标操作简介 西文状态下汉字的显示 DOS下如何发声 良好的程序设计风格题目简介*五子棋游戏的棋盘功能,要求能悔棋一步,判断玩家输赢。*中国象棋游戏的棋盘功能,能判断走棋是否合法,允许悔棋一步,并能对玩家记时。*俄罗斯方块,要求能选难度,记分规则同掌上机。所有题目简介 中文窗口下拉式菜单设计,汉化界面,只要求实现菜单,不要求TC功能 BMP图象处理,柔化SMOOTH、锐化SHARPEN、浮雕EMBOSS、扩散D I F F U S E 和 定 制 过 滤 器。对640*480*256色图象处理题目简介*二维图象动画演示,移动、翻转、旋
2、转。题目简介*三维模型处理,对一个立方体进行旋转、平移、放大缩小。题目简介 细胞生命演示,考虑到二维大数组的存取,及大数组的动态生成。*数据库的读写,对FOXBASE数据库的DBF和MEM文件进行读写。题目简介*电脑音乐程序,能根据乐谱用PC喇叭演奏。*DOS版画笔程序,要求用不同粗细的点、线和不同填充模式的方块、圆,以不同颜色画图。题目简介*汉诺塔的动态演示,自动移动HANIO,要求能输入塔盘的数量。题目简介 数据加密技术探讨,DES加密算法的实现,要求能够加密解密,密钥位数可以指定。*扑克牌24点游戏,人机对弈,提供难度选择。题目简介*TIC-TAC-TOE的人机对弈,机器判断输赢。题目简
3、介*人工智能“重排九宫”,8个数字放在3*3九个格子中,余下一个格子为空。要求可以用鼠标拖动数字,并记录玩家花费的时间。题目简介*跳棋,将三只黑子放在123方格中,3只白子放在567方格中,空格是4,将白子移到黑子位置,黑子移到白子位置。规则,可以走一步或跳一格,不能后退。题目简介*中文文本文件阅读器。能处理HOME,END,PGUP,PGDN,ARROW,SPACE BAR,ESCAPE键。显示文件名,文件大小,以及操作提示。题目简介 模拟PCTOOLS对文件进行编辑同时显示16进制和字符格式信息。题目简介*自动发牌程序,能够将54张牌随机发给四个人。课题要求 四个人一组,自由组合。每组选一
4、个题目,确定组长。上机时坐在一起。学期结束前每组提交一份正规的源程序清单,要有详尽的注释,同时注明哪个人负责编写哪部分程序。最后两周验收。图形操作简介 必要的头文件 必须的系统变量 初始化图形界面 初始化出错处理 取得必须的信息 关闭图形界面 一些常用的画图函数必要的头文件#include#include#include#include#include 必须的变量 int GraphDriver;int GraphMode;double AspectRatio;int MaxX,MaxY;int MaxColors;int ErrorCode;struct palettetype palett
5、e;初始化图形界面 GraphDriver=DETECT;initgraph(&GraphDriver,&GraphMode,);initgraph(&GraphDriver,&GraphMode,”d:tc);初始化出错处理 ErrorCode=graphresult();if(ErrorCode!=grOk)printf(Graphics System Error:%sn,grapherrormsg(ErrorCode);exit(1);取得必须的参数 getpalette(&palette);MaxColors=getmaxcolor()+1;MaxX=getmaxx();MaxY=ge
6、tmaxy();AspectRatio=(double)xasp/(double)yasp;关闭图形界面 closegraph();/*Return the system to text mode*/一些常用的画图函数 outtext(buffer),outtextxy(x,y,buffer)line(x0,y0,x1,y1);linerel();lineto()circle(int x,int y,int radius);arc()bar(int l,int t,int r,int b);bar3d();moveto(int x,int y);moverel(dx,dy);getx()put
7、pixel(x,y,color);getpixel(x,y)setcolor();setbkcolor();getcolor();getbkcolor鼠标操作 鼠标简介 鼠标驱动程序的主要功能 鼠标功能调用方法 鼠标的初始化 鼠标光标的显示与隐藏 读取按钮状态,读取或设置光标位置 设置鼠标的光标形状和移动范围鼠标简介 鼠标系统实际上由两个主要元素组成:鼠标机制和称作鼠标驱动程序的内存驻留程序。鼠标驱动程序提供与鼠标通信所需的全部低级支持。此外,它自动维持鼠标光标位置和发现是否按下了某个键。一旦装入驱动程序,鼠标就可以被随后执行的任意程序使用。鼠标简介 可以通过PC中断33H访问鼠标和鼠标驱动程
8、序的各种功能。所选择的特定函数依赖于中断时AX寄存器的值。三个其它寄存器(BX、CX和DX)用于把各种参数传送给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。鼠标驱动程序主要功能功能功能输入值输入值输出值输出值功能调用功能调用初始化无AX BXAX=0000显示光标 无无AX=0001隐藏光标 无无AX=0002读取状态 无BXCXDX AX=0003设置位置 CX、DX无AX=0004设置光标 BXCXDX 无AX=0009鼠标驱动程序主要功能功能功能输入值输入值输出值输出值功能调用功能调用X 范围CX DX无AX=0007Y 范围CX DX无AX=0008
9、光标范围 CX DX SIDI无AX=0010中断程序 CX ES:DX无AX=000C鼠标功能调用方法 用TC通过INT33H中断来编制基本函数,有三种常用方法:嵌入汇编程序,如:ASM CLI清中断 利用全程变量赋予寄存器值,然后通过函数geninterrupt()调用中断实现 利用联合类型REGS,SREGS通过函数int86(),int86x()调用中断,原型在鼠标的初始化InitMouse()union REGS regs;regs.x.ax=0;int86(0 x33,®s,®s);if(regs.x.ax=0)return false;else return true
10、;鼠标光标的隐藏HideCur()union REGS regs;if(visual)regs.x.ax=2;int86(0 x33,®s,®s);visual=false;鼠标光标的显示ShowCur()union REGS regs;if(!visual)regs.x.ax=1;int86(0 x33,®s,®s);visual=true;鼠标光标的显示与隐藏 在鼠标驱动程序中,鼠标的显示状态用0值表示,隐藏用负值表示,每调用一次显示功能则该值加一,每调用一次隐藏功能,则该值减一。这样,在多次调用了驱动程序的隐藏鼠标光标功能后,再调用显示鼠标光标功能时,将不能正常显
11、示鼠标光标。需要加入一个visual布尔型变量,来取代驱动程序中的数值。读取鼠标的状态Status()union REGS regs;regs.x.ax=3;int86(0 x33,®s,®s);x=regs.x.cx;y=regs.x.dx;status=regs.x.bx;读取鼠标的状态 其中X,Y为光标位置 status&1左键状态,1为按下,0为未按 status&2右键状态,1为按下,0为未按 status&4中键状态,1为按下,0为未按 要注意循环检测时的抖动现象,可增加一些空循环或延时来清除剩余的按键信号。设置光标位置void MoveMouse(int x,int
12、y)REGS regs;regs.x.ax=4;regs.x.cx=x;regs.x.dx=y;int86(0 x33,®s,®s);设置鼠标光标形状设置鼠标光标需要三个方面信息:鼠标的外边界:8*8点阵,16个整数 鼠标的内部形状:8*8点阵,16个整数 以及鼠标的热点的相对坐标:int x,y 其中外边界和内边界连续存放,为长度为32的整型数组 int marks32设置鼠标光标形状SetCurs(unsigned masks32,x,y)union REGS regs;struct SREGS sregs;regs.x.ax=9;regs.x.bx=x;regs.x.cx=y
13、;/*hot spot*/regs.x.dx=(unsigned)masks;s e g r e a d(&s r e g s);int86(0 x33,®s,®s);手的光标数据 0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,0 xffff,/*cursor mask*/0 x0c00,0 x1200,0 x1200,0 x1200,0 x13fe,0 x1249,0 x1249,0 x1
14、249,0 x7249,0 x9001,0 x9001,0 x9001,0 x8001,0 x8001,0 x4002,0 x3ffc/*cursor mask*/4,0/*hot spot*/设置鼠标的移动范围SetMouseArea(int x0,int y0,int x1,int y1)union REGS regs;regs.x.ax=7;regs.x.cx=x0;regs.x.dx=x1;int86(0 x33,®s;®s);regs.x.ax=8;regs.x.cx=y0;regs.x.dx=y1;int86(0 x33,®s,®s);西文状态下汉字的显示
15、汉字库简介 取得字节的某一位 显示24点阵汉字 显示16点阵汉字 在字库中取字模汉字库简介 程序中可直接使用UCDOS中的HZK16,ASC16和HZK24三个文件。HZK16中存储的是16*16点阵汉字是按行存储的以便于显示,每个 汉 字 字 模32BYTE,按照国标码顺序存储,其中也包含了682个纯中文符号字母。汉字库的情况 ASC16存储256个西文ASCII码的8*16点阵格式,按行存储,每个ASCII码16字节。HZK24X存储24*24点阵打印字模,按列存储,每个汉字字模占576字节。24*24点阵汉字存储两比较大,所以从16区1位“啊”字开始存储,以减少字库大小。其中X为KS表示
16、楷体,宋体等。取得字节某一位的值int getbit(unsigned char byte,int bit)if(bit7)return 0;return(bytebit)&0 x1;函数getbit用于得出一个字节中每个位(bit)是0还是1。显示24点阵的汉字void PutChn24(x,y,char*by,color)int i1,i2,i3;for(i1=0;i124;i1+)/LINES for(i2=0;i23;i2+)/3 bytes per line for(i3=0;i38;i3+)f(getbit(byi1*3+i2,7-i3)putpixel(x+i1,y+(i2*8+
17、i3),color);显示16点阵的汉字void PutChn16(x,y,char*buf,color)int i1,i2,i3;for(i1=0;i116;i1+)for(i2=0;i22;i2+)for(i3=0;i38;i3+)if(getbit(bufi1*2+i2,7-i3)putpixel(x+i2*8+i3,y+i1,color);在字库中找字模 qu=c1-0 xa1;wei=c2-0 xa1;通过计算个计算出该区位码在汉字库中的偏移量:lenth=32 long offset=(qu)*94+wei)*(long)lenth;24*24点阵汉字字模的读取类似,只是其偏移量计算稍有不同:lenth=72 long offset=(qu-15)*94+wei)*(long)lenth;DOS下如何发声在下,有如下三个函数可以处理声音:sound(long freq):发出特定频率的声音 nosound():停止发声 delay():延时特定时间良好的程序设计风格 使用有意义的变量名 匈牙利式命名法 文档的模块化组织(缩进、对齐)自顶向下的设计方法 增加程序的可读性(增加注释)不要滥用语言技巧