




已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计开放性实验指导手册C语言程序设计开放性实验指导手册信息工程学院计算机系目 录实验一: 扫雷游戏- 2 -实验二: 贪吃蛇游戏- 23 -实验三: 进程调度- 30 -实验四: 存储管理分配分区算法- 39 -实验五: 通讯录- 48 -实验六: 工资管理- 59 -实验一: 扫雷游戏第一部分 实验内容在屏幕中央位置显示一个雷区,雷区范围内预先埋设了一定数量的随机分布的地雷;玩家通过上下左右键控制光标在雷区的各个小方块之间移动并做标记;若能正确标记出雷区中的所有地雷,则游戏胜利;否则踩雷,游戏失败。扫雷游戏要具备以下功能:开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级方块数为初级:88、中级:1616、高级:2424;各级地雷数=总方块数/6;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;挖雷:将光标移到某个方块,并按空格或回车键,可挖开它;若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;标记地雷:在光标所在的某个方块上按F或f键,则标记此块下埋着地雷(实际上可能是误标),显示为F。每标记一个地雷,地雷数减少1;标记疑问:在光标所在的某个方块上按Q或q键,则在某方块上面标一个问号(?),意味着没有把握判定它是否有雷。标记为?的块可在恰当的时候再按标记地雷或挖开; 自动挖开:如果某个数字方块周围的地雷全都标记完,则在该方块上按A或a键,将其剩下的方块挖开;输入:通过键盘输入相关指示信息;输出:提示游戏是否成功,是否继续。任务1:确定游戏界面、输入方式和基本数据(1) 确定游戏的界面。游戏屏幕中央显示由小方块组成的雷区,小方块的背景显示为浅灰,表示该方块没有被挖开或标记;小方块的背景显示为深灰,表示它已经被挖开或标记为“F”、“?”或“*”;当选中一个方块要操作时,它的边框线为红色。在屏幕的左上方显示游戏是否成功等信息,这也是游戏结果的表现形式。(2)决定游戏的输入方式。采用键盘,通过光标的移动来选择操作的小方块,根据所敲击的键值来选择游戏的功能。下面是对键盘功能键的定义:上,下,左,右键用来移动光标的位置;回车或者空格键用来挖开光标当前指向的一个方块;F, f 标记当前光标指向的方块有地雷;Q, q 在光标指向方块打一个问号,表示可能有地雷;A , a 自动挖开光标周围的方块;ESC 退出游戏。(3)确定主要的数据,这里主要是有关雷区的数据。雷区界面数据int MAXCOL=640; /*屏幕最大宽度*/int MAXROW=480; /*屏幕最大高度*/#define _ROW 24 /*雷区最多方块行数*/#define _COL 24 /*雷区最多方块列数*/int ROW=8; /*当前游戏雷区行数*/int COL=8; /*当前游戏雷区列数*/#define SIZEX 20 /*雷区方块的水平大小(像素数)*/#define SIZEY 20 /*雷区方块的垂直大小(像素数)*/#define STARTX (MAXCOL-COL*SIZEX)/2 /*水平起始位置*/#define STARTY (MAXROW-ROW*SIZEY)/2 /*垂直起始位置*/雷区内部数据int totalMine; /* 整个雷区所含的地雷总数*/int table_ROW_COL; /* 数组table的每个元素值记录了雷区对应方块是否有雷:1表示有雷,0表示没有雷*/int num_ROW_COL;/* 数组num的每个元素值记录了雷区对应方块周围有多少个地雷*/int flag_ROW_COL;/* 数组flag的每个元素值记录了雷区对应方块当前的状态*/在整个系统中table_ROW_COL、num_ROW_COL、flag_ROW_COL是最核心的数据,是雷区的内部表示,游戏的挖雷、标记雷、标记疑问、自动挖开等界面操作,在内部实际上是对这些数据的操作。方块(i,j)的状态取值:#define UNFLAG 0 /* 表示该方块还没有被打开或者标记*/#define FLAGED 1 /* 标记该方块有地雷*/#define QUESTION 20 /* 表示该方块可能有地雷*/#define EXPLOD 30 /* 踩到地雷爆炸了*/#define OPEN 40 /* 一个没有地雷的方块被打开*/光标当前位置数据int pi,pj; /* 记录光标的当前位置,初始时光标在(0,0)上*/int di8=-1,-1,0,1,1,1,0,-1; /*x方向偏移量*/int dj8=0,1,1,1,0,-1,-1,-1; /*y方向偏移量*/游戏状态数据int gameRes; /*记录游戏结束的结果状态,值为0表示按esc键退出游戏;-1 表示游戏失败;gameRes = 1 表示游戏胜利。实际为输出数据的内部形式*/功能键的键值/*为避免书写错误和明确含义,对系统的按键值用符号常量来定义*/*上,下,左,右键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00/*回车、空格键*/#define ENTER 0x1c0d#define SPACE 0x3920/*F, f */#define UPPERF 0x2146#define LOWERF 0x2166/*Q, q*/#define UPPERQ 0x1051#define LOWERQ 0x1071/*A , a*/#define UPPERA 0x1e41#define LOWERA 0x1e61/*ESC*/#define ESC 0x011b任务2:写出主程序的基本框架,确定各子模块名字和参数 int main() initGraph(); /*图形显示方式初始化*/do newGame(); /*初始化新游戏,即开局*/ int gameRes=0; do int key = getKey(); /*读入操作信息*/ if (key = ESC) gameRes = 0;break; switch(key)对其他key值进行判断处理; if (checkWin() /*判断游戏是否胜利*/gameRes = 1; while(!gameRes); while (!confirm(gameRes); return 0;主控模块的各子模块说明:void initGraph()函数:用于将显示器显示方式设置为图形方式。void newGame()函数:开局初始化新游戏界面及数据。int getKey()函数:得到从键盘读入的操作信息。int checkWin()函数:用于判断游戏是否获胜。若返回值为1表示胜利,返回值为0表示游戏还没结束。int confirm(int) 函数:用于判断游戏是否重新开始。参数的值来自gameRes,gameRes=0,表示按esc键退出游戏;gameRes = -1,表示踩到地雷,游戏失败;gameRes = 1,表示游戏胜利。Confirm的返回值为0表示重新开始游戏;为1表示关闭游戏,退出程序。任务3:详细设计图形初始化模块、初始化新游戏模块、读入操作信息模块对“图形初始化”功能模块进一步求精。void initGraph( ) int gdriver = DETECT, gmode, errorcode; /* 自动检测最高图形模式*/ initgraph(&gdriver, &gmode, ); /*初始化图形模式*/ errorcode = graphresult(); /* 读取初始化结果*/ if (errorcode != grOk) /* 如果有错误发生*/ printf(Graphics error: %sn, grapherrormsg(errorcode); printf(Press any key to halt:); getch(); exit(1); /*返回错误码*/ MAXCOL = getmaxx(); /*获取当前屏幕最大宽度*/ MAXROW = getmaxy(); /*获取当前屏幕最大高度*/对“初始化新游戏”功能模块进一步求精。 void newGame() cleardevice(); /*清除屏幕*/ setGrade(); /*设置游戏等级*/ generateMine(); /*随机生成雷区地雷分布*/ pi = pj = 0; /*设置初始光标位置*/ drawTable(); /*实现在屏幕上画出雷区*/SetGrade()的继续细化:void setGrade()功能:设置游戏等级。参数: 无返回值:无算法描述:1. 在屏幕左上角提示:Please choice grade(J for Junior,M foe Medium,S for Senior): 2. 等待读取一个键值:若该键是J或j,则表示初级:COL=8;ROW=8;若该键是M或m,则表示中级:COL=16;ROW=16;若该键是S或s,则表示初级:COL=24;ROW=24;generateMine()的继续细化:void generateMine()功能:随机生成地雷的分布。参数: 无返回值:无算法描述:1. 计算将要生成的地雷的总数,存放在变量totalMine中。2. 将table数组和num数组清零,table和num都是全局的二维数组,table记录 坐标(x,y)中是否有地雷,0表示没有地雷,1表示有。 num数组表示和(x,y)相邻的所有小方块中有多少颗地雷。3. 随机生成totalMine个地雷的坐标,动态更新table和num数组的状态, drawTable()的继续细化:void drawTable()int i,j; for(i=0;iROW;i+) for(j=0;j0,然后调用drawBlock()函数重新画光标原来所指的方块和现在所指的方块。其余函数的实现类似,要注意边界条件的判断。函数moveDown(),当前光标(pi,pj)下移一格操作;函数moveLeft(),当前光标(pi,pj)左移一格操作; 函数moveRight(),当前光标(pi,pj)右移一格操作。当key值为LOWERF或UPPERF时,执行flagBlock(pi,pj)操作。函数flagBlock(i, j)标记光标所指的方块(i,j)有地雷。函数实现过程如下:如果方块的flag值为FLAGED,则将flag值设为UNFLAG;如果方块的flag值为UNFLAG,则将flag值设为FLAGED。接着调用drawBlock()函数重新画这个方块。当key值为LOWERA或UPPERA时,执行gameRes= autoOpen(pi,pj)操作。函数autoOpen(i, j)表示如果某个已经打开了的小方块显示的数字等于它周围已经被标记为雷的小方块的数目,则表明周围没有被挖开的小方块都已经不是地雷的,自动挖开这些小方块。参数: i 表示坐标的行的值,j表示坐标的列的值。返回:整型。自动挖开的过程中由于玩家的标记有错误导致挖开了一个雷使得游戏失败,返回1,否则返回0。函数实现过程如下:判断当前的方块是否被挖开。若没有,自动挖开无效,返回0;若是,接(b)。计算当前方块周围被标记为FLAGED的方块数目。若该数目等于当前方块的numij值,对(i,j)小方块的八个邻居中所有没有被挖开的小方块调用openMine函数。如果自动挖开过程中踩到地雷,返回1;否则,返回0值。当key值为LOWERQ或UPPERQ时,执行questBlock(pi,pj)操作。函数questBlock(i, j)在光标所指向的方块(i,j)上打一个问号,表示可能有地雷。函数实现过程:如果方块的flag值为QUESTION,则将flag值设为UNFLAG;如果方块的flag值为UNFLAG,则将flag值设为QUESTION。接着调用drawBlock()函数重新画这个方块。对“判断游戏是否胜利”功能模块进一步求精。int checkWin()功能:判断当前玩家是否已经取胜(即所有没有雷的坐标都已经被挖开了)。参数:无返回值: 整型值,1表示玩家取得了胜利,0表示没有。算法描述:对每个没有地雷的坐标,判断该坐标是否已经被挖开,如果遇到有一个没有挖开,返回0;相反,如果所有没有地雷的坐标都已经被挖开返回1。对“判断游戏是否重新开始”功能模块进一步求精。int confirm(int res)功能:判断当前玩家是否还要重新开始新的游戏。参数:游戏结束的状态:0-ESC退出,-1-失败,1-胜利返回值: 整型值,1表示继续,0表示结束游戏。算法描述:首先在屏幕左上角位置显示当前的游戏结束状态,提示是否继续游戏;然后等待玩家从键盘输入键值:若输入Y或y,则返回1继续游戏;若输入N或n,则返回0结束游戏。训练的技能点(1) 建立程序设计的基本概念,训练学生为解决实际问题而创建较完整的简单应用程序的独立编程能力。(2)体会程序开发过程,充分认识程序设计的各个环节的重要性,包括需求分析、总体设计、算法设计、文档总结以及详细设计和测试修改等。第二部分 上机任务分阶段完成如下任务阶段1:指导1、训练要点(1) 面向过程程序设计方法(2) 函数(3) 数组(4) 绘图方法2、需求说明(1) 这是一个简化版扫雷游戏模拟程序。需多了解和积累有关图形函数的知识。(2) 以键盘输入代替鼠标输入来实现游戏输入方式。3、实现思路(1) 在本设计中,应用程序分为主函数和其他五个模块分别设计。主函数体主要采用循环来实现,等待用户选择进入不同的模块,各个模块执行完任务后也应返回主程序。(2) 地雷分布信息、附近地雷数目信息和是否已标记地雷信息分别存储在数组中。(3) 评委打分涉及最值和均值算法,成绩显示涉及排序算法。4、程序设计图(1) 扫雷顶层层次图开局扫雷游戏(主框架)输入挖雷标记雷题标记疑问自动挖开输出图1 扫雷系统的顶层层次图图2 扫雷游戏的主控模块流程图形方式初始化初始化新游戏从键盘读入键值开始重新游戏?关闭游戏,结束是ESC?对其他键值进行判断处理本次游戏结束束?FTTTFF(2) 程序流程图5、评分标准评分重点放在面向过程程序设计方法和实际编写代码能力这两个方面。凡是能够基本完成程序设计,画出合理的设计框图,建立基本的代码框架,均视为及格。能够以清晰的思路设计出较为详细的程序流程图,并编写代码实现大部分功能,没有重大语法错误的可以视为良好。如果程序功能完备,运行无误,并在设计上有一定的独到之处,或者编写的代码具有良好的设计风格,规范易读,此类设计视为优秀。6、参考代码#include #include #include #include #include /*定义有效的键值*/#define ENTER 0x1c0d#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ESC 0x011b#define SPACE 0x3920#define LOWERF 0x2166#define UPPERF 0x2146#define LOWERA 0x1e61#define UPPERA 0x1e41#define LOWERQ 0x1071#define UPPERQ 0x1051int MAXCOL=640; /*屏幕最大宽度*/int MAXROW=480; /*屏幕最大高度*/#define _ROW 24 /*雷区最多方块行数*/#define _COL 24 /*雷区最多方块列数*/int ROW=8; /*当前游戏雷区行数*/int COL=8; /*当前游戏雷区列数*/#define SIZEX 20 /*雷区方块的水平大小(像素数)*/#define SIZEY 20 /*雷区方块的垂直大小(像素数)*/#define STARTX (MAXCOL-COL*SIZEX)/2 /*水平起始位置*/#define STARTY (MAXROW-ROW*SIZEY)/2 /*垂直起始位置*/#define UNFLAG 0 /*未标记或挖开*/#define FLAGED 1 /*已标记为雷*/#define QUESTION 20 /*不能确定*/#define EXPLOD 30 /*踩雷*/#define OPEN 40 /*挖开*/int table_ROW_COL; /* 雷区各方块是否有雷*/int num_ROW_COL; /*雷区各方块周围的雷数*/int flag_ROW_COL; /*雷区各方块的状态*/int pi,pj; /*光标当前位置*/int di8=-1,-1,0,1,1,1,0,-1; /*方块八向偏移量*/int dj8=0,1,1,1,0,-1,-1,-1;/*初始化图形显示方式*/void initGraph() /* 要求自动检测 */ int gdriver = DETECT, gmode, errorcode; /* 初始化图形模式 */ initgraph(&gdriver, &gmode, ); /* 读取初始化结果 */ errorcode = graphresult(); if (errorcode != grOk) /* 发生错误 */ printf(Graphics error: %sn, grapherrormsg(errorcode); printf(Press any key to halt:); getch(); exit(1); /* 具有错误代码的返回 */ MAXCOL = getmaxx(); /*获取当前屏幕最大宽度*/ MAXROW = getmaxy(); /*获取当前屏幕最大高度*/*随机生成地雷的分布*/void generateMine() int totalMine; int i,k; int ri,rj; int ni,nj; static int seed=0; totalMine = ROW * COL / 6; memset(table, 0 ,sizeof(table); memset(num, 0 ,sizeof(num); srand(seed+); for(i=0;itotalMine;i+) do ri = rand()%ROW; rj = rand()%COL; while(tablerirj); for(k=0;k=0 & ni=0 & nj=1 & numij=8) char buf3; itoa(numij,buf,10); outtextxy(mx,my,buf); break; /*绘制雷区*/void drawTable() int i,j; for(i=0;iROW;i+) for(j=0;jCOL;j+) drawBlock(i,j);/*设置游戏等级*/void setGrade() int kk; setcolor(WHITE); outtextxy(0,0,Please choice grade(J for Junior,M foe Medium,S for Senior):); kk = bioskey(0); kk = (kk&0xff); if(kk = J | kk = j) COL = 8; ROW = 8; else if (kk = M | kk = m) COL = 16; ROW = 16; else COL = 24; ROW = 24; return 0;/*初始化游戏*/void newGame() cleardevice(); setGrade(); cleardevice(); generateMine(); pi = pj = 0; drawTable();/*判断游戏是否胜利*/int checkWin() int i,j; for(i=0;iROW;i+) for(j=0;j0) pi-; drawBlock(pi,pj); drawBlock(pi+1,pj); /*光标下移一格*/void moveDown() if(pi0) pj-; drawBlock(pi,pj); drawBlock(pi,pj+1); /*光标右移一格*/void moveRight() if(pjCOL-1) pj+; drawBlock(pi,pj); drawBlock(pi,pj-1); /*标记有雷*/void flagBlock(int i,int j) if(flagij = FLAGED) flagij = UNFLAG; else if(flagij = UNFLAG) flagij = FLAGED; drawBlock(i,j);/*标记不确定*/void questBlock(int i,int j) if(flagij = QUESTION) flagij = UNFLAG; else if(flagij = UNFLAG) flagij = QUESTION; drawBlock(i,j);/*挖雷*/int openMine(int i,int j) int ii,jj,k; if(flagij = OPEN) return 0; if(tableij) /*meet a mine*/ for(ii=0;iiROW;ii+) for(jj=0;jjCOL;jj+) if(tableiijj & flagiijj = UNFLAG) flagiijj = EXPLOD; drawBlock(ii,jj); return -1; /*游戏失败*/ else flagij = OPEN; drawBlock(i,j); if(numij=0) for(k=0;k=0 & ni=0 & njCOL) openMine(ni,nj); return 0; /*自动挖开*/int autoOpen(int i,int j) int k,c=0; int ni,nj; int ret=0; if(! (flagij = OPEN) return 0; for(k=0;k=0 & ni=0 & njCOL) if(flagninj = FLAGED) c+; if(c = numij) for(k=0;k=0 & ni=0 & njCOL) if(flagninj = UNFLAG) if(openMine(ni,nj) = -1) ret = -1; return ret;/*获取按键信息,返回有效的操作值*/int getKey(void) while(1) int key=bioskey(0); switch(key) case ENTER: case UP: case DOWN: case LEFT: case RIGHT: case ESC: case SPACE: case LOWERF: case UPPERF: case LOWERA: case UPPERA: case LOWERQ: case UPPERQ: return key; int main() int gameRes; /*记录游戏结束的结果状态:0表示退出游戏;-1游戏失败; 1为胜利。*/ initGraph(); /*初始化图形显示方式*/ do newGame(); /*初始化新的游戏*/ gameRes=0; do /*主循环-处理按键信息*/ int key = getKey(); /*读入操作信息*/ if(key = ESC) break; switch(key) /*对其他有效操作的处理*/ case ENTER: case SPACE: gameRes = openMine(pi,pj);break; case UP: moveUp();break; case DOWN: moveDown();break; case LEFT: moveLeft();break; case RIGHT: moveRight();break; case LOWERF: case UPPERF: flagBlock(pi,pj);break; case LOWERA: case UPPERA: gameRes = autoOpen(pi,pj);break; case LOWERQ:case UPPERQ: questBlock(pi,pj);break; if(checkWin() gameRes = 1; while(!gameRes); while (!confirm(gameRes) ; return 0;7、程序运行测试效果:图3 扫雷游戏的界面实验二: 贪吃蛇游戏第一部分 本次上机目标在屏幕上画出游戏区域,并在四周用“围墙”围好;在游戏区域内随机显示食物;模拟画出蛇并自动朝某个方向运动,在键盘按方向键来控制蛇的走向;蛇每吃中一个食物,其身长即増一;蛇头碰到自身或者墙壁及为游戏结束,并显示成绩和游戏结束提示画面;在游戏过程中按ESC键退出游戏。任务1:基本数据类型的创建和全局变量的设置int i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/struct Food int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/;/*食物的结构体*/struct Snake int xN; int yN; int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/;任务2:主要模块的分析与设计 void GamePlay(void);/*玩游戏具体过程*/任务3:辅助模块的设计和主函数 void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void PrScore(void);/*输出成绩*/void main(void)训练的技能点(1) 建立程序设计的基本概念,训练学生为解决实际问题而创建较完整的简单应用程序的独立编程能力。(2)体会程序开发过程,充分认识程序设计的各个环节的重要性,包括需求分析、总体设计、算法设计、文档总结以及详细设计和测试修改等。第二部分 上机任务分阶段完成如下任务阶段1:指导1、训练要点(1) 面向过程程序设计方法。(2) 结构体类型的定义与使用。(3) 图形编程函数的使用。2、需求说明节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。段:当许多节连成一条直线,我称它为段。上图的贪吃蛇只有一段,如果它拐弯就变成两段。 一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级上册信息技术教学设计-7.装扮美丽的花园∣粤教版
- 2024年届九年级历史上册 第15课 决定美利坚命运的内战说课稿1 北师大版
- 单元学习总结教学设计-2025-2026学年高中信息技术教科版2019选择性必修4 人工智能初步-教科版2019
- 2025年中考数学试题分类汇编:勾股定理与翻折、动点、最值问题(10大考点40题) (第1期)解析版
- (2025秋新版)苏教版科学三年级上册全册教案2
- 小学科学新教科版三年级上册全册教案(2025秋新版)
- 神奇的泡泡 教学设计-2023-2024学年小学生科学课后服务拓展
- 人教版 2019年第二学期高中物理必修2 7.8 机械能守恒定律 教学设计
- 2025年中考地理试题分类汇编:西半球的地区和国家、极地地区、地区综合(第1期)解析版
- 本章复习与测试教学设计-2025-2026学年初中数学鲁教版五四制2012六年级下册-鲁教版五四制2012
- 烟花爆竹理论题目及答案
- 苏教版2025-2026秋三年级数学上册教学计划及课时安排
- 2025江苏连云港市东海县开发区实验幼儿园招聘劳动合同制教师12人考试模拟试题及答案解析
- 酒吧mc教学课件
- 永辉超市激励机制案例研究
- 北师大版五年级下册数学口算题题库1200道带答案可打印
- 托管老师岗前培训
- DB32T3916-2020建筑地基基础检测规程
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 新苏教版六年级上册《科学》全一册全部课件(含19课时)
- 移动式压力容器充装质量保证体系
评论
0/150
提交评论