编游戏 C语言程序设计案例精编

时间:2019-05-12 17:18:19下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《编游戏 C语言程序设计案例精编》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《编游戏 C语言程序设计案例精编》。

第一篇:编游戏 C语言程序设计案例精编

编游戏 C语言程序设计案例精编.txt让人想念而死,是谋杀的至高境界,就连法医也鉴定不出死因。。。C语言 编游戏案例精编 案例一 贪吃蛇游戏 #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key;int score=0;/*得分*/ int gamespeed=50000;/*游戏速度自己调整*/ struct Food { int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/ struct Snake { int x[N];int y[N];int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/ }snake;void Init(void);/*图形驱动*/ void Close(void);/*图形结束*/ void DrawK(void);/*开始画面*/ void GameOver(void);/*结束游戏*/ void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*/ /*主函数*/ void main(void){ Init();/*图形驱动*/ DrawK();/*开始画面*/ GamePlay();/*玩游戏具体过程*/ Close();/*图形结束*/ } /*图形驱动*/ void Init(void){ int gd=DETECT,gm;initgraph(&gd,&gm,“c: c”);cleardevice();} /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){ /*setbkcolor(LIGHTGREEN);*/ setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/ for(i=50;i<=600;i+=10)/*画围墙*/ { rectangle(i,40,i+10,49);/*上边*/ rectangle(i,451,i+10,460);/*下边*/ } for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左边*/ rectangle(601,i,610,i+10);/*右边*/ } } /*玩游戏具体过程*/ void GamePlay(void){ randomize();/*随机数发生器*/ food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life=0;/*活着*/ snake.direction=1;/*方向往右*/ snake.x[0]=100;snake.y[0]=100;/*蛇头*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ { if(food.yes==1)/*需要出现新食物*/ { food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/ } if(food.yes==0)/*画面上有食物了就要显示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食物*/ score+=10;PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i=0;i

snake.direction=2;else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;}/*endwhile(1)*/ } /*游戏结束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*输出成绩*/ void PrScore(void){ char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} /*图形结束*/ void Close(void){ getch();closegraph();}

案例二 计算器

#include /*DOS接口函数*/ #include /*数学函数的定义*/ #include /*屏幕操作函数*/ #include /*I/O函数*/ #include /*库函数*/ #include /*变量长度参数表*/ #include /*图形函数*/ #include /*字符串函数*/ #include /*字符操作函数*/ #define UP 0x48 /*光标上移键*/ #define DOWN 0x50 /*光标下移键*/ #define LEFT 0x4b /*光标左移键*/ #define RIGHT 0x4d /*光标右移键*/ #define ENTER 0x0d /*回车键*/ void *rar;/*全局变量,保存光标图象*/ struct palettetype palette;/*使用调色板信息*/ int GraphDriver;/* 图形设备驱动*/ int GraphMode;/* 图形模式值*/ int ErrorCode;/* 错误代码*/ int MaxColors;/* 可用颜色的最大数值*/ int MaxX, MaxY;/* 屏幕的最大分辨率*/ double AspectRatio;/* 屏幕的像素比*/ void drawboder(void);/*画边框函数*/ void initialize(void);/*初始化函数*/ void computer(void);/*计算器计算函数*/ void changetextstyle(int font, int direction, int charsize);/*改变文本样式函数*/ void mwindow(char *header);/*窗口函数*/ int specialkey(void);/*获取特殊键函数*/ int arrow();/*设置箭头光标函数*/ /*主函数*/ int main(){ initialize();/* 设置系统进入图形模式 */ computer();/*运行计算器 */ closegraph();/*系统关闭图形模式返回文本模式*/ return(0);/*结束程序*/ } /* 设置系统进入图形模式 */ void initialize(void){ int xasp, yasp;/* 用于读x和y方向纵横比*/ GraphDriver = DETECT;/* 自动检测显示器*/ initgraph(&GraphDriver, &GraphMode, “");/*初始化图形系统*/ ErrorCode = graphresult();/*读初始化结果*/ if(ErrorCode!= grOk)/*如果初始化时出现错误*/ { printf(”Graphics System Error: %sn“, grapherrormsg(ErrorCode));/*显示错误代码*/ exit(1);/*退出*/ } getpalette(&palette);/* 读面板信息*/ MaxColors = getmaxcolor()+ 1;/* 读取颜色的最大值*/ MaxX = getmaxx();/* 读屏幕尺寸 */ MaxY = getmaxy();/* 读屏幕尺寸 */ getaspectratio(&xasp, &yasp);/* 拷贝纵横比到变量中*/ AspectRatio =(double)xasp/(double)yasp;/* 计算纵横比值*/ } /*计算器函数*/ void computer(void){ struct viewporttype vp;/*定义视口类型变量*/ int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;float num1=0,num2=0,result;/*操作数和计算结果变量*/ char cnum[5],str2[20]={”“},c,temp[20]={”“};char str1[]=”1230.456+-789*/Qc=^%“;/* 定义字符串在按钮图形上显示的符号 */ mwindow(”Calculator“);/* 显示主窗口 */ color = 7;/*设置灰颜色值*/ getviewsettings(&vp);/* 读取当前窗口的大小*/ width=(vp.right+1)/10;/* 设置按钮宽度 */ height=(vp.bottom-10)/10;/*设置按钮高度 */ x = width /2;/*设置x的坐标值*/ y = height/2;/*设置y的坐标值*/ setfillstyle(SOLID_FILL, color+3);bar(x+width*2, y, x+7*width, y+height);/*画一个二维矩形条显示运算数和结果*/ setcolor(color+3);/*设置淡绿颜色边框线*/ rectangle(x+width*2, y, x+7*width, y+height);/*画一个矩形边框线*/ setcolor(RED);/*设置颜色为红色*/ outtextxy(x+3*width,y+height/2,”0.“);/*输出字符串”0.“*/ x =2*width-width/2;/*设置x的坐标值*/ y =2*height+height/2;/*设置y的坐标值*/ for(j=0;j<4;++j)/*画按钮*/ { for(i=0;i<5;++i){ setfillstyle(SOLID_FILL, color);setcolor(RED);bar(x, y, x+width, y+height);/*画一个矩形条*/ rectangle(x, y, x+width, y+height);sprintf(str2,”%c“,str1[j*5+i]);/*将字符保存到str2中*/ outtextxy(x+(width/2), y+height/2, str2);x =x+width+(width / 2);/*移动列坐标*/ } y +=(height/2)*3;/* 移动行坐标*/ x =2*width-width/2;/*复位列坐标*/ } x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y);/*移动光标到x,y位置*/ arrow();/*显示光标*/ putimage(x,y,rar,XOR_PUT);m=0;n=0;strcpy(str2,”“);/*设置str2为空串*/ while((v=specialkey())!=45)/*当压下Alt+x键结束程序,否则执行下面的循环*/ { while((v=specialkey())!=ENTER)/*当压下键不是回车时*/ { putimage(x,y,rar,XOR_PUT);/*显示光标图象*/ if(v==RIGHT)/*右移箭头时新位置计算*/ if(x>=x0+6*width)/*如果右移,移到尾,则移动到最左边字符位置*/ {

x=x0;

m=0;} else {

x=x+width+width/2;

m++;} /*否则,右移到下一个字符位置*/ if(v==LEFT)/*左移箭头时新位置计算*/ if(x<=x0){

x=x0+6*width;

m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/ else {

x=x-width-width/2;

m--;} /*否则,左移到前一个字符位置*/ if(v==UP)/*上移箭头时新位置计算*/ if(y<=y0){

y=y0+4*height+height/2;

n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/ else { y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/ if(v==DOWN)/*下移箭头时新位置计算*/ if(y>=7*height){

y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/ else {

y=y+height+height/2;

n++;} /*否则,移到下边一个字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置显示光标箭头*/ } c=str1[n*5+m];/*将字符保存到变量c中*/ if(isdigit(c)||c=='.')/*判断是否是数字或小数点*/ { if(flag==-1)/*如果标志为-1,表明为负数*/ { strcpy(str2,”-“);/*将负号连接到字符串中*/ flag=1;} /*将标志值恢复为1*/ sprintf(temp,”%c“,c);/*将字符保存到字符串变量temp中*/ strcat(str2,temp);/*将temp中的字符串连接到str2中*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,str2);/*显示字符串*/ } if(c=='+'){ num1=atof(str2);/*将第一个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=1;/*做计算加法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='-'){ if(strcmp(str2,”“)==0)/*如果str2为空,说明是负号,而不是减号*/ flag=-1;/*设置负数标志*/ else { num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=2;/*做计算减法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } } if(c=='*'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=3;/*做计算乘法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='/'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=4;/*做计算除法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='^'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=5;/*做计算乘方标志值*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='%'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=6;/*做计算模运算乘方标志值*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='='){ num2=atof(str2);/*将第二个操作数转换为浮点数*/ switch(act)/*根据运算符号计算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做减法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6:result=fmod(num1,num2);break;/*做模运算*/ } setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/ sprintf(temp,”%f“,result);/*将结果保存到temp中*/ outtextxy(5*width,height,temp);/*显示结果*/ } if(c=='c'){ num1=0;/*将两个操作数复位0,符号标志为1*/ num2=0;flag=1;strcpy(str2,”“);/*将str2清空*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='Q')exit(0);/*如果选择了q回车,结束计算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光标箭头*/ return;/*返回*/ } /*窗口函数*/ void mwindow(char *header){ int height;cleardevice();

/* 清除图形屏幕 */ setcolor(MaxColors1);/*设置当前颜色为白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*设置画线方式*/ getviewsettings(&vp);/*将当前视口信息装入vp所指的结构中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*画矩形边框*/ } /*设计鼠标图形函数*/ int arrow(){ int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定义多边形坐标*/ setfillstyle(SOLID_FILL,2);/*设置填充模式*/ fillpoly(8,raw);/*画出一光标箭头*/ size=imagesize(4,4,16,16);/*测试图象大小*/ rar=malloc(size);/*分配内存区域*/ getimage(4,4,16,16,rar);/*存放光标箭头图象*/ putimage(4,4,rar,XOR_PUT);/*消去光标箭头图象*/ return 0;} /*按键函数*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待键盘输入*/ key=bioskey(0);/*键盘输入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊键的扫描值,其余为0*/ return(key);/*返回键值*/ }

案例三 黑白棋游戏

#include ”graphics.h“ /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值*/ #define RIGHT 0x4d00 /*光标右键值*/ #define DOWN 0x5000 /*光标下键值*/ #define UP 0x4800 /*光标上键值*/ #define ESC 0x011b /* ESC键值*/ #define ENTER 0x1c0d /* 回车键值*/ int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/ void playtoplay(void);/*人人对战函数*/ void DrawQp(void);/*画棋盘函数*/ void SetPlayColor(int x);/*设置棋子第一次的颜色*/ void MoveColor(int x,int y);/*恢复原来棋盘状态*/ int QpChange(int x,int y,int z);/*判断棋盘的变化*/ void DoScore(void);/*处理分数*/ void PrintScore(int n);/*输出成绩*/ void playWin(void);/*输出胜利者信息*/ /******主函数*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化图形系统*/ DrawQp();/*画棋盘*/ playtoplay();/*人人对战*/ getch();closegraph();/*关闭图形系统*/ } void DrawQp()/*画棋盘*/ { int i,j;score1=score2=0;/*棋手一开始得分都为0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*画水平线*/ line(i,100,i,420);/*画垂直线*/ } setcolor(0);/*取消圆周围的一圈东西*/ setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/ fillellipse(500,200,15,15);/*在显示得分的位置画棋*/ setfillstyle(SOLID_FILL,8);/*黑色实体填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始两个黑棋*/ a[3][4]=a[4][3]=2;/*初始两个白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改变分数*/ DoScore();/*输出开始分数*/ } void playtoplay()/*人人对战*/ { int x,y,t=1,i,j,cc=0;while(1)/*换棋手走棋*/ { x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/ while(1)/*具体一个棋手走棋的过程*/ { PrintScore(1);/*输出棋手1的成绩*/ PrintScore(2);/*输出棋手2的成绩*/ SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按键*/ if(key==ESC)/*跳出游戏*/ break;else if(key==ENTER)/*如果按键确定就可以跳出循环*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/ { if(t%2==1)/*如果是棋手1移动*/

a[(x-120)/40][(y-120)/40]=1;else/*否则棋手2移动*/

a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/ cc++;/*开始统计尝试次数*/ if(cc>=64-score1-score2)/*如果尝试超过空格数则停步*/ {

MoveColor(x,y);

fillellipse(x,y,15,15);

break;} else

continue;/*如果按键无效*/ } DoScore();/*分数的改变*/ break;/*棋盘变化了,则轮对方走棋*/ } else/*已经有棋子就继续按键*/ continue;} else /*四个方向按键的判断*/ if(key==LEFT&&x>120)/*左方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)/*结束游戏*/ break;if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/ { playWin();/*输出最后结果*/ break;} t=t%2+1;/*一方走后,改变棋子颜色即轮对方走*/ cc=0;/*计数值恢复为0*/ } /*endwhile*/ } void SetPlayColor(int t)/*设置棋子颜色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/ { if(y<100)/*如果是从起点出发就恢复蓝色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*蓝色*/ } } int QpChange(int x,int y,int t)/*判断棋盘的变化*/ { int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*计算数组元素的行下标*/ j=(y-120)/40;/*计算数组元素的列下标*/ SetPlayColor(t);/*设置棋子变化的颜色*/ /*开始往8个方向判断变化*/ if(j<6)/*往右边*/ { for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk1)/*判断左边*/ { for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){ for(kk=j-1;kk>k&&k>=0;kk--){ a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);} if(kk!=j-1)yes=1;} } if(i<6)/*判断下边*/ { for(k=i+1;k<8;k++)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k<8){ for(kk=i+1;kk1)/*判断上边*/ { for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){ for(kk=i-1;kk>k&&k>=0;kk--){ a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);} if(kk!=i-1)yes=1;} } if(i>1&&j<6)/*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){ for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j>1)/*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){ for(ii=i+1,jj=j-1;ii1&&j>1)/*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){ for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j<6)/* 右下*/ { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){ for(ii=i+1,jj=j+1;iiscore1)/*开始判断最后的结果*/ outtextxy(100,50,”black win!“);else if(score2

案例四 迷宫问题

#include #include #include #include #include #define N 20/*迷宫的大小,可改变*/ int oldmap[N][N];/*递归用的数组,用全局变量节约时间*/ int yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/ int way[100][2],wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/ void Init(void);/*图形初始化*/ void Close(void);/*图形关闭*/ void DrawPeople(int *x,int *y,int n);/*画人工探索物图*/ void PeopleFind(int(*x)[N]);/*人工探索*/ void WayCopy(int(*x)[N],int(*y)[N]);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/ int FindWay(int(*x)[N],int i,int j);/*自动探索函数*/ void MapRand(int(*x)[N]);/*随机生成迷宫函数*/ void PrMap(int(*x)[N]);/*输出迷宫图函数*/ void Result(void);/*输出结果处理*/ void Find(void);/*成功处理*/ void NotFind(void);/*失败处理*/ void main(void)/*主函数*/ { int map[N][N];/*迷宫数组*/ char ch;clrscr();printf(”n Please select hand(1)else auton“);/*选择探索方式*/ scanf(”%c“,&ch);Init();/*初始化*/ MapRand(map);/*生成迷宫*/ PrMap(map);/*显示迷宫图*/ if(ch=='1')PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/ Result();/*输出结果*/ Close();} void Init(void)/*图形初始化*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void DrawPeople(int *x,int *y,int n)/*画人工控制图*/ {/*如果将以下两句注释掉,则显示人工走过的路径,*/ setfillstyle(SOLID_FILL,WHITE);/*设置白色实体填充样式*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢复原通路*/ switch(n)/*判断x,y的变化,8个方向的变化*/ { case 1:(*x)--;break;/*上*/ case 2:(*x)--;(*y)++;break;/*右上*/ case 3:(*y)++;break;/*右*/ case 4:(*x)++;(*y)++;break;/*右下*/ case 5:(*x)++;break;/*下*/ case 6:(*x)++;(*y)--;break;/*左下*/ case 7:(*y)--;break;/*左*/ case 8:(*x)--;(*y)--;break;/*左上*/ } setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);} void PeopleFind(int(*map)[N])/*人工手动查找*/ { int x,y;char c=0;/*接收按键的变量*/ x=y=1;/*人工查找的初始位置*/ setcolor(11);line(500,200,550,200);outtextxy(570,197,”d“);line(500,200,450,200);outtextxy(430,197,”a“);line(500,200,500,150);outtextxy(497,130,”w“);line(500,200,500,250);outtextxy(497,270,”x“);line(500,200,450,150);outtextxy(445,130,”q“);line(500,200,550,150);outtextxy(550,130,”e“);line(500,200,450,250);outtextxy(445,270,”z“);line(500,200,550,250);outtextxy(550,270,”c“);/*以上是画8个方向的控制介绍*/ setcolor(YELLOW);outtextxy(420,290,”Press 'Enter' to end“);/*压回车键结束*/ setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显示*/ while(c!=13)/*如果按下的不是回车键*/ { c=getch();/*接收字符后开始各个方向的探索*/ if(c=='w'&&map[x-1][y]!=1)DrawPeople(&x,&y,1);/*上*/ else if(c=='e'&&map[x-1][y+1]!=1)DrawPeople(&x,&y,2);/*右上*/ else if(c=='d'&&map[x][y+1]!=1)DrawPeople(&x,&y,3);/*右*/ else if(c=='c'&&map[x+1][y+1]!=1)

DrawPeople(&x,&y,4);/*右下*/ else

if(c=='x'&&map[x+1][y]!=1)

DrawPeople(&x,&y,5);/*下*/

else

if(c=='z'&&map[x+1][y-1]!=1)

DrawPeople(&x,&y,6);/*左下*/

else

if(c=='a'&&map[x][y-1]!=1)

DrawPeople(&x,&y,7);/*左*/

else if(c=='q'&&map[x-1][y-1]!=1)

DrawPeople(&x,&y,8);/*左上*/ } setfillstyle(SOLID_FILL,WHITE);/*消去红色探索物,恢复原迷宫图*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x==N-2&&y==N-2)/*人工控制找成功的话*/ yes=1;/*如果成功标志为1*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷贝迷宫数组 */ { int i,j;for(i=0;i=0;i--){ bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+ way[i][1]*15+6,50+way[i][0]*15+6);sleep(1);/*控制显示时间*/ } bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/*在目标点标红色*/ setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,”Find a way!“);} void NotFind(void)/*没找到通路*/ { setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,”Not find a way!“);} void Result(void)/*结果处理*/ { if(yes)/*如果找到*/ Find();else/*没找到路*/ NotFind();getch();} void Close(void)/*图形关闭*/ { closegraph();}

案例五 扫地雷游戏 #include #include #include #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define MOUSEMOVE 0xff08 struct { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10];int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/ int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;void Init(void);/*图形驱动*/ void MouseOn(void);/*鼠标光标显示*/ void MouseOff(void);/*鼠标光标隐藏*/ void MouseSetXY(int,int);/*设置当前位置*/ int LeftPress(void);/*左键按下*/ int RightPress(void);/*鼠标右键按下*/ void MouseGetXY(void);/*得到当前位置*/ void Control(void);/*游戏开始,重新,关闭*/ void GameBegain(void);/*游戏开始画面*/ void DrawSmile(void);/*画笑脸*/ void DrawRedflag(int,int);/*显示红旗*/ void DrawEmpty(int,int,int,int);/*两种空格子的显示*/ void GameOver(void);/*游戏结束*/ void GameWin(void);/*显示胜利*/ int MineStatistics(int,int);/*统计每个格子周围的雷数*/ int ShowWhite(int,int);/*显示无雷区的空白部分*/ void GamePlay(void);/*游戏过程*/ void Close(void);/*图形关闭*/ void main(void){ Init();Control();Close();} void Init(void)/*图形开始*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void Close(void)/*图形关闭*/ { closegraph();} void MouseOn(void)/*鼠标光标显示*/ { _AX=0x01;geninterrupt(0x33);} void MouseOff(void)/*鼠标光标隐藏*/ { _AX=0x02;geninterrupt(0x33);} void MouseSetXY(int x,int y)/*设置当前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠标左键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠标右键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} void MouseGetXY(void)/*得到当前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} void Control(void)/*游戏开始,重新,关闭*/ { int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/ while(1){ if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/ { GameBegain();/*游戏初始画面*/ GamePlay();/*具体游戏*/ if(gameAGAIN==1)/*游戏中重新开始*/ { gameAGAIN=0;continue;} } MouseOn();gameFLAG=0;if(LeftPress())/*判断是否重新开始*/ { MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判断是否按键退出*/ break;} MouseOff();} void DrawSmile(void)/*画笑脸*/ { setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);} void DrawRedflag(int i,int j)/*显示红旗*/ { setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);} void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/ { setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*没有单击过的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*单击过后显示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);} void GameBegain(void)/*游戏开始画面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠标一开始的位置,并作为它的初始坐标*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*画格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*画脸*/ randomize();for(i=0;i<10;i++)/*100个格子随机赋值有没有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*现有雷数加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示没红旗标志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*显示这次总共有多少雷数*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*变量取空白格数量*/ MouseOn();} void GameOver(void)/*游戏结束画面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*显示所有的地雷*/ { DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);fillellipse(200+j*20,100+i*20,7,7);} } void GameWin(void)/*显示胜利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的统计*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的统计*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的统计*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else

if(i==9&&j==9)/*右下角格子的统计*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左边第一列格子的统计*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右边第一列格子的统计*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的统计*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)

nNUM++;if(Mine[i+1][j+1].num==1)

nNUM++;} else if(i==9)/*最后一行格子的统计*/ { if(Mine[i-1][j].num==1)

nNUM++;if(Mine[i][j-1].num==1)

nNUM++;if(Mine[i][j+1].num==1)

nNUM++;if(Mine[i-1][j-1].num==1)

nNUM++;if(Mine[i-1][j+1].num==1)

nNUM++;} else/*普通格子的统计*/ { if(Mine[i-1][j].num==1)

nNUM++;if(Mine[i-1][j+1].num==1)

nNUM++;if(Mine[i][j+1].num==1)

nNUM++;if(Mine[i+1][j+1].num==1)

nNUM++;if(Mine[i+1][j].num==1)

nNUM++;if(Mine[i+1][j-1].num==1)

nNUM++;if(Mine[i][j-1].num==1)

nNUM++;if(Mine[i-1][j-1].num==1)

nNUM++;} return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/ } int ShowWhite(int i,int j)/*显示无雷区的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/ return;mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*输出雷数*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/ return;} /*8个方向递归显示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戏过程*/ { int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠标左键盘按下*/ {

*/

*/

MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内 { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/ continue;if(Mine[i][j].num!=0)/*如果格子没有处理过*/ { if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/ { MouseOff();GameOver();/*游戏失败*/ break;} else/*鼠标按下的格子不是地雷*/ { MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/ ShowWhite(i,j);else/*按下格子周围有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*输出当前格子周围的雷数*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;} MouseOn();Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过 if(mineNUM<1)/*胜利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠标右键键盘按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn();sleep(1);} } }

案例六 速算24 #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系统时间函数*/ #include ”graphics.h“ /*图形函数*/ #include ”alloc.h“/*动态地址分配函数*/ #include ”stdlib.h“ /*库函数*/ #include ”string.h“ /*字符串函数*/ #include ”ctype.h“ /*字符操作函数*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*扑克牌,10用0来表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*栈1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*栈2*/ void init(void);/*图形驱动*/ void close(void);/*图形关闭*/ void play(void);/*发牌的具体过程*/ void rand1(int j);/*随机发牌函数*/ void change(char *e,char *a);/*中缀变后缀函数*/ int computer(char *s);/*后缀表达式计算函数*/ STACK1 *initstack1(STACK1 *top);/*栈1初始化*/ STACK1 *push(STACK1 *top,int x);/*栈1入栈运算*/ STACK1 *pop(STACK1 *top);/*栈1删除栈顶元素*/ int topx(STACK1 *top);/*栈1读栈顶元素*/ STACK1 *ptop(STACK1 *top,int *x);/*栈1读出栈顶元素值并删除栈顶元素*/ int empty(STACK1 *top);/*判栈1是否为空函数*/ STACK2 *initstack2(STACK2 *top);/*栈2初始化*/ STACK2 *push2(STACK2 *top,char x);/*栈2入栈运算*/ STACK2 *pop2(STACK2 *top);/*栈2删除栈顶元素*/ char topx2(STACK2 *top);/*栈2读栈顶元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*栈2读出栈顶元素值并删除栈顶元素*/ int empty2(STACK2 *top);/*判栈2是否为空函数* int text1(char *s);/*显示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函数*/ while(1){ setbkcolor(BLACK);/*设置背景颜色*/ cleardevice();/*清屏*/ play();/*发牌*/ gotoxy(1,15);/*移动光标*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示输入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*输入字符串压回车键*/ change(s1,s);/*调用change函数将中缀表达式s1转换为后缀表达式s*/ result=computer(s);/*计算后缀表达式的值,返回结果result */ if(result==24)/*如果结果等于24*/ text1(”very good“);/*调用函数text1显示字符串”very good“*/ else text1(”wrong!!“);/*否则函数text1显示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否继续*/ scanf(”%c“,&ch);/*输入一字符*/ if(ch=='n'||ch=='N')/*如果该字符等于n或N*/ break;/*跳出循环,程序结束*/ } /*否则,开始下一轮循环*/ close();return;/*返回*/ } void rand1(int j)/*随机发牌函数*/ { int kind,num;char str[3],n;randomize();while(1)/*循环直到有牌发*/ { kind=random(4);/*花色随机数*/ num=random(13);/*大小随机数*/ if(p[kind][num]!=-1)/*该数未取过*/ { n=p[kind][num];/*取相应位置的扑克牌数*/ p[kind][num]=-1;/*牌发好以后相应位置的元素置-1*/ break;} } switch(kind)/*花式的判断*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*红桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*显示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*显示右下角花色*/ if(n!='0')/*输出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*显示牌的大小*/ } else/*输出10的时候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*发牌的具体过程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*画空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*画矩形框*/ rand1(j);/*随机取牌*/ delay(10000);/*延时显示*/ } } void init(void)/*图形驱动*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*图形关闭*/ { closegraph();} void change(char *e,char *a)/*中缀字符串e转后缀字符串a函数*/ { STACK2 *top=NULL;/* 定义栈顶指针*/ int i,j;char w;i=0;j=0;while(e[i]!='')/*当字符串没有结束时*/ { if(isdigit(e[i]))/*如果字符是数字*/ { do{ a[j]=e[i];/*将数字原样拷贝到数组a中*/ i++;/*e数组的下标加1*/ j++;/*a数组的下标加1*/ }while(e[i]!='.');/*直到字符为数字结束符“.”为止*/ a[j]='.';j++;/*将数字结束符“.”拷贝到a数组依然保持结束标记*/ } if(e[i]=='(')/*如果字符是“(”时*/ top=push2(top,e[i]);/*将其压入堆栈*/ if(e[i]==')')/*如果字符是“)”时*/ { top=ptop2(top,&w);/*取出栈顶元素,并从栈顶删除该元素*/ while(w!='(')/*如果字符不是“(”时反复循环*/ { a[j]=w;/*将栈顶元素存入a数组*/ j++;/*下标加1*/ top=ptop2(top,&w);/*取出栈顶元素,并从栈顶删除该元素*/ } } if(e[i]=='+'||e[i]=='-')/*如果字符是加或减号时*/ { if(!empty2(top))/*如栈不为空*/ { w=topx2(top);while(w!='(')/*当栈顶元素不是“(”时反复循环*/ { a[j]=w;j++;/*将栈顶元素存入表达式a中,a的下标加1*/ top=pop2(top);/*删除栈顶元素*/ if(empty2(top))/*如果栈为空*/

break;/*跳出循环*/ else

w=topx2(top);/*否则读栈顶元素*/ } } top=push2(top,e[i]);/*将当前e的字符元素压入堆栈*/ } if(e[i]=='*'||e[i]=='/')/*如果字符是乘或除号时*/ { if(!empty2(top))/*如栈不为空*/ { w=topx2(top);/*读栈顶元素存入w*/ while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/ { a[j]=w;j++;/*将栈顶元素存入字符串a中,a的下标加1*/ top=pop2(top);/*删除栈顶元素*/ if(empty2(top))/*如果栈为空*/

break;/*跳出循环*/ else

w=topx2(top);/*否则读栈顶元素*/ } } top=push2(top,e[i]);/*将当前e字符元素压入堆栈*/ } i++;/*e的下标加1*/ } while(!empty2(top))/*当不为空时反复循环*/ top=ptop2(top,&a[j++]);/*将栈顶元素存入数组a中*/ a[j]='';/*将字符串结束标记写入最后一个数组元素中构成字符串*/ } int computer(char *s)/* 计算函数*/ { STACK1 *top=NULL;int i,k,num1,num2,result;i=0;while(s[i]!='')/*当字符串没有结束时作以下处理*/ { if(isdigit(s[i]))/*判字符是否为数字*/ { k=0;/*k初值为0*/ do{ k=10*k+s[i]-'0';/*将字符连接为十进制数字*/ i++;/*i加1*/ }while(s[i]!='.');/*当字符不为‘.’时重复循环*/ top=push(top,k);/*将生成的数字压入堆栈*/ } if(s[i]=='+')/*如果为'+'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num2+num1;/*将num1和num2相加存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='-')/*如果为'-'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1-num2;/*将num1减去num2结果存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='*')/*如果为'*'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1*num2;/*将num1与num2相乘结果存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='/')/*如果为'/'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1/num2;/*将num1除num2结果存入result中* top=push(top,result);/*将result压入堆栈*/ } i++;/*i加1*/ } top=ptop(top,&result);/*最后栈顶元素的值为计算的结果*/ return result;/*返回结果*/ } STACK1 *initstack1(STACK1 *top)/*初始化*/ { top=NULL;/*栈顶指针置为空*/ return top;/*返回栈顶指针*/ } STACK1 *push(STACK1 *top,int x)/*入栈函数*/ { STACK1 *p;/*临时指针类型为STACK1*/ p=(STACK1 *)malloc(sizeof(STACK1));/*申请STACK1大小的空间*/ if(p==NULL)/*如果p为空*/ { printf(”memory is overflown!“);/*显示内存溢出*/ exit(0);/*退出*/ } p->data=x;/*保存值x到新空间*/ p->link=top;/*新结点的后继为当前栈顶指针*/ top=p;/*新的栈顶指针为新插入的结点*/ return top;/*返回栈顶指针*/ } STACK1 *pop(STACK1 *top)/*出栈*/ { STACK1 *q;/*定义临时变量*/ q=top;/*保存当前栈顶指针*/ top=top->link;/*栈顶指针后移*/ free(q);/*释放q*/ return top;/*返回栈顶指针*/ } int topx(STACK1 *top)/*读栈顶元素*/ { if(top==NULL)/*栈是否为空*/ { printf(”Stack is nulln“);/*显示栈为空信息*/ return 0;/*返回整数0*/ } return top->data;/*返回栈顶元素*/ } STACK1 *ptop(STACK1 *top,int *x)/*取栈顶元素,并删除栈顶元素*/ { *x=topx(top);/*读栈顶元素*/ top=pop(top);/*删除栈顶元素*/ return top;/*返回栈顶指针*/ } int empty(STACK1 *top)/*判栈是否为空*/ { if(top==NULL)/*如果为空*/ return 1;/*返回1*/ else return 0;/*否则返回0*/ } STACK2 *initstack2(STACK2 *top)/*初始化*/ { top=NULL;/*栈顶指针置为空*/ return top;/*返回栈顶指针*/ } STACK2 *push2(STACK2 *top,char x)/*入栈函数*/ { STACK2 *p;/*临时指针类型为STACK2*/ p=(STACK2 *)malloc(sizeof(STACK2));/*申请STACK2大小的空间*/ if(p==NULL)/*如果p为空*/ { printf(”memory is overflown!“);/*显示内存溢出*/ exit(0);/*退出*/ } p->data=x;/*保存值x到新空间*/ p->link=top;/*新结点的后继为当前栈顶指针*/ top=p;/*新的栈顶指针为新插入的结点*/ return top;/*返回栈顶指针*/ } STACK2 *pop2(STACK2 *top)/*出栈*/ { STACK2 *q;/*定义临时变量*/ q=top;/*保存当前栈顶指针*/ top=top->link;/*栈顶指针后移*/ free(q);/*释放q*/ return top;/*返回栈顶指针*/ } char topx2(STACK2 *top)/*读栈顶元素*/ { if(top==NULL)/*栈是否为空*/ { printf(”Stack is nulln“);/*显示栈为空信息*/ return '';/*返回空字符*/ } return top->data;/*返回栈顶元素*/ } STACK2 *ptop2(STACK2 *top,char *x)/*取栈顶元素,并删除栈顶元素*/ { *x=topx2(top);/*读栈顶元素*/ top=pop2(top);/*删除栈顶元素*/ return top;/*返回栈顶指针*/ } int empty2(STACK2 *top)/*判栈是否为空*/ { if(top==NULL)/*如果为空*/ return 1;/*返回1*/ else return 0;/*否则返回0*/ }

int text1(char *s){ setbkcolor(BLUE);/*设置背景颜色为蓝色*/ cleardevice();/*清除屏幕*/ setcolor(12);/*设置文本颜色为淡红色*/ settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/ outtextxy(120, 120, s);/*输出字符串s*/ setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/ setcolor(15);/*设置文本颜色为*白色/ settextstyle(3, 0, 5);/*无衬字笔划, 放大5倍*/ outtextxy(220, 220, s);/*输出字符串s*/ getch();/*键盘输入任一字符*/ return;/*返回*/ }

案例七 数据结构CAI系统 案例八 进程调度 #include ”stdio.h“ #include ”stdlib.h“ #include ”string.h“ typedef struct node { char name[10];/*进程标识符*/ int prio;/*进程优先数*/ int round;/*进程时间轮转时间片*/ int cputime;/*进程占用CPU时间*/ int needtime;/*进程到完成还要的时间*/ int count;/*计数器*/ char state;/*进程的状态*/ struct node *next;/*链指针*/ }PCB;PCB *finish,*ready,*tail,*run;/*队列指针*/ int N;/*进程数*/ /*将就绪队列中的第一个进程投入运行*/ firstin(){ run=ready;/*就绪队列头指针赋值给运行头指针*/ run->state='R';/*进程状态变为运行态*/ ready=ready->next;/*就绪对列头指针后移到下一进程*/ } /*标题输出函数*/ void prt1(char a){ if(toupper(a)=='P')/*优先数法*/ printf(” name cputime needtime priority staten“);else printf(” name cputime needtime count round staten“);} /*进程PCB输出*/ void prt2(char a,PCB *q){ if(toupper(a)=='P')/*优先数法的输出*/ printf(” %-10s%-10d%-10d%-10d %cn“,q->name, q->cputime,q->needtime,q->prio,q->state);else/*轮转法的输出*/ printf(” %-10s%-10d%-10d%-10d%-10d %-cn“,q->name, q->cputime,q->needtime,q->count,q->round,q->state);} /*输出函数*/ void prt(char algo){ PCB *p;prt1(algo);/*输出标题*/ if(run!=NULL)/*如果运行指针不空*/ prt2(algo,run);/*输出当前正在运行的PCB*/ p=ready;/*输出就绪队列PCB*/ while(p!=NULL){ prt2(algo,p);p=p->next;} p=finish;/*输出完成队列的PCB*/ while(p!=NULL){ prt2(algo,p);p=p->next;} getch();/*压任意键继续*/ } /*优先数的插入算法*/ insert1(PCB *q){ PCB *p1,*s,*r;int b;s=q;/*待插入的PCB指针*/ p1=ready;/*就绪队列头指针*/ r=p1;/*r做p1的前驱指针*/ b=1;while((p1!=NULL)&&b)/*根据优先数确定插入位置*/ if(p1->prio>=s->prio){ r=p1;p1=p1->next;} else b=0;if(r!=p1)/*如果条件成立说明插入在r与p1之间*/ { r->next=s;s->next=p1;} else { s->next=p1;/*否则插入在就绪队列的头*/ ready=s;} } /*轮转法插入函数*/ insert2(PCB *p2){ tail->next=p2;/*将新的PCB插入在当前就绪队列的尾*/ tail=p2;p2->next=NULL;} /*优先数创建初始PCB信息*/ void create1(char alg){ PCB *p;int i,time;char na[10];ready=NULL;/*就绪队列头指针*/ finish=NULL;/*完成队列头指针*/ run=NULL;/*运行队列指针*/ printf(”Enter name and time of processn“);/*输入进程标识和所需时间创建PCB*/ for(i=1;i<=N;i++){ p=malloc(sizeof(PCB));scanf(”%s“,na);scanf(”%d“,&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='w';p->prio=50-time;if(ready!=NULL)/*就绪队列不空调用插入函数插入*/ insert1(p);else { p->next=ready;/*创建就绪队列的第一个PCB*/ ready=p;} } clrscr();printf(” output of priority:n“);printf(”************************************************n“);prt(alg);/*输出进程PCB信息*/ run=ready;/*将就绪队列的第一个进程投入运行*/ ready=ready->next;run->state='R';} /*轮转法创建进程PCB*/ void create2(char alg){ PCB *p;int i,time;char na[10];ready=NULL;finish=NULL;run=NULL;printf(”Enter name and time of round processn“);for(i=1;i<=N;i++){ p=malloc(sizeof(PCB));scanf(”%s“,na);scanf(”%d“,&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->count=0;/*计数器*/ p->state='w';p->round=2;/*时间片*/ if(ready!=NULL)insert2(p);else { p->next=ready;ready=p;tail=p;} } clrscr();printf(” output of roundn“);printf(”************************************************n");prt(alg);/*输出进程PCB信息*/ run=ready;/*将就绪队列的第一个进程投入运行*/ ready=ready->next;run->state='R';} /*优先数调度算法*/ priority(char alg){ while(run!=NULL)/*当运行队列不空时,有进程正在运行*/ { run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3;/*每运行一次优先数降低3个单位*/ if(run->needtime==0)/*如所需时间为0将其插入完成队列*/ { run->next=finish;finish=run;run->state='F';/*置状态为完成态*/ run=NULL;/*运行队列头指针为空*/ if(ready!=NULL)/*如就绪队列不空*/ firstin();/*将就绪对列的第一个进程投入运行*/ } else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/ if((ready!=NULL)&&(run->prioprio)){ run->state='W';insert1(run);firstin();/*将就绪队列的第一个进程投入运行*/ } prt(alg);/*输出进程PCB信息*/ } } /*时间片轮转法*/ roundrun(char alg){ while(run!=NULL){ run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->count=run->count+1;if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/ { run->next=finish;finish=run;

第二篇:C语言程序设计扫雷游戏

C语言程序设计报告

题目: 扫雷小游戏设计

电子通信与物理学院 日期:2018年7月 12 日

指导教师评语

目录

1.课程设计内容...........................................................................................................1 2.课程设计目的...........................................................................................................1 3.背景知识..................................................................................................................1 4.工具/准备工作..........................................................................................................3 5.设计步骤、方法.....................................................................................................3

5.1........................................................................................................................3 5.2定义全局变量..................................................................................................4 5.3挖雷部分函数的分析.......................................................................................5 6.设计结果及分析.....................................................................................................11 7.设计结论...............................................................................................................16 8.参考文献...............................................................................................................17 附录...........................................................................................................................17

1.课程设计内容

在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。

即:设计一个功能与Windows中的挖雷游戏相同的小游戏。

2.课程设计目的

1.培养学生综合运用所学知识独立完成课题的能力。

2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核

3.背景知识

游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于 右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:

左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ×”(见下图)

扫雷的设计原理: 扫雷游戏分为几个步骤: 第一步,使用二维数组表示地图; 第二步,随机生成几个地雷;

第三步,点击方格的反应,计算每个非雷区方格点开后的数字; 第四步,当方格数字为0的情况; 第五步,当方格为地雷的情况。

第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。这个是多少自己决定吧。第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时候再计算。点 击非雷区方格,显示数字,这个方格标记为“已点过”。第四步,当方格数字为0时,这里要用到递归调用,就是让程序自动“点击”这个数字为0方格周围的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。第五步,很简单,宣布玩家死亡就可以了。

4.准备工作

查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。借鉴他人写过的程序,从中找到突破口。从程序中了解需要的各种函数准备,再进一步获悉该函数的功能与使用方法。

对自己要设计的挖地雷游戏进行功能分析,大致如下:

总体游戏过程分析:在屏幕上显示一个游戏界面,雷区范围内预先埋设了一定数量的随机分布的地雷(用数字9代替地雷);玩家通过从键盘中输入(行数X,列数Y)↙进行点击;若能点中所有非雷区,则游戏胜利;否则踩雷,游戏失败。简易版扫雷游戏要具备以下功能:

1)开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分 为三级:各等级行列数为———:简单:10×

10、普通:15×

15、困难:20×20;雷区每个*号下面或埋藏有1个地雷,或者没有地雷;

2)挖雷:从键盘中输入(行数X,列数Y),并按回车键,可挖开它;若所揭方块下有9,则踩雷,此时所有含地雷的块都出现9,该局游戏失败;如果方块上出现数字,它代表 在它周围的8个方块中共有多少颗地雷;

3)输入:通过键盘输入相关指示信息; 4)输出:提示游戏失败,是否继续再来一遍;

5.设计步骤、方法 5.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。具体的函数流程如图5-3 所示:

定义使用到的常数、全局变量、函数原型说明。然后初始化图形系统,调用游戏控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。

主控模块的各子模块说明:

void InitialValue_game()用于棋盘初始化; InitialMine_game()用于棋盘的随机布雷; void print_game()用于打印棋盘; int judge_game()用于判断游戏是否结束; int openmap()用于点开地图;

5.2定义全局变量

#include #include “stdlib.h” #include“time.h” # define s 20 int x;/*棋盘行数*/ int y;/*棋盘列数*/ int b;/*选择游戏难度 1简单2普通3困难4 自定义*/ int h;/*雷的个数*/ struct Games g;struct Games { int game_int[s][s];char game_char[s][s];};使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时性。

5.3挖雷部分函数的分析

void InitialValue_game(struct Games *g){ int i,j;for(i=0;i

InitialMine_game(struct Games *g){ 5 int i,j,next1,next2;int sum=0;srand((unsigned)time(NULL));while(1){ i=rand()%x;j=rand()%y;if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;++sum;for(next1=-1;next1<2;next1++){ for(next2=-1;next2<2;next2++){ if(-1

void print_game(struct Games *g,int Logo){ int i,j;int a[s];for(i=0;i

int judge_game(struct Games *g){ int sum=0;int i,j;for(i=0;i

运行第一步:

按ENTER键进入: 11

选择游戏难度(简单、普通、困难、任意),按ENTER键进入: 简单难度: 普通难度:

困难难度:

任意难度:

游戏界面,开始从键盘输入数字,格式为(行数X,列数Y),点击Enter键:

游戏结束页面: 7.设计结论

一学期结束了,对C语言也有了一些认识,不过自我感觉学得不太好,好在还是学到了知识: 了解了C的发展以及编程的基本步骤,学会了Printf输出语句,C语言的运算,知道了有哪几种数据类型,还有我觉得经常用的if语句,if--eles语句,for循环,while 语句,do-while语句等等,基本会用数组和指针,还有字符串的处理,对了还有才学的结构体。

还有许多知识点,不一罗列了,总之C语言要学的东西太多了,听大三的都说C很简单,但我并不认为他像人们说的那样简单,C是最基础的,基础不代表简单,也可能是我没学好才有这样的感受。

在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。除此之外,我还得到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。

8.参考文献

郭翠英主编的《C语言课程设计实例精编》; 张芳妮 吕波 译《C语言编程常见问题解答》; 谭浩强《C程序设计题解与上机指导(第二版)》。伍俊良.VB课程设计与系统开发案例[M].北京

附录:

#include #include “stdlib.h” 17 #include“time.h” # define s 20 int x;/*棋盘行数*/ int y;/*棋盘列数*/ int b;/*选择游戏难度 1简单2普通3困难4 自定义*/ int h;/*雷的个数*/ struct Games g;struct Games { int game_int[s][s];char game_char[s][s];};

main(){ int i,j;/*定义i,j变量*/ int NO;int begin=1;int h;/*确定雷的个数*/ while(begin){ printf(“nnnnnnn” “ttt=================================n” “ttt 欢迎进入扫雷 nnn” “ttt 按回车键继续 n” “ttt=================================n” “ttt n”);getchar();/*游戏开始界面*/ system(“cls”);printf(“ nnnnnnnnn”);printf(“ 请选择游戏难度:nn”);printf(“ 1简单难度nn”);printf(“ 2普通难度nn”);printf(“ 3困难难度nn”);printf(“ 4自定义难度nn”);scanf(“%d”,&h);getchar();/*确定游戏难度*/ if(0

void InitialValue_game(struct Games *g){ int i,j;for(i=0;i

InitialMine_game(struct Games *g){ int i,j,next1,next2;int sum=0;srand((unsigned)time(NULL));while(1){ i=rand()%x;j=rand()%y;if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;++sum;for(next1=-1;next1<2;next1++){ for(next2=-1;next2<2;next2++){ if(-1

void print_game(struct Games *g,int Logo){ int i,j;int a[s];for(i=0;i

int judge_game(struct Games *g){ int sum=0;int i,j;for(i=0;i

第三篇:C语言程序设计

1.Problem A: Hello world!Description Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放学回家,父母分别跟他们打招呼。

Input 无

Output 请输出: Hello Da_min, Hello Er_min, Hello Xiao_ming!

Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming!

HINT 请注意换行符

Append Code #include int main(){

printf(“Hello Da_min,n”);

printf(“Hello Er_min,n”);

printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。

Input 输入一个浮点型数据,有效数字不会超过十进制的6位。

Output 输出为两行。

第一行为圆的面积,第二行为圆的周长,格式见sample。

Sample Input 3

Sample Output Area: 28.260000 Perimeter: 18.840000

HINT 了解浮点类型的输入、输出和算术运算符

Append Code 法一

#include int main(){ double r,p,s;scanf(“%lf”,&r);p=2*3.14*r;s=3.14*r*r;printf(“Area: %lfn”,s);printf(“Perimeter: %lfn”,p);} 法二

#include #define pi 3.14 int main(){

double r;

scanf(“%d”,&r);

printf(“Area: %lfn”,pi*r*r);

printf(“Perimeter: %lfn”,2*pi*r);

}

3.Problem C:平均值 Description 求3个数的平均值。

Input 输入只有一行,为3个较小的整数。

Output 输出为这3个整数的平均值,保留3位小数。

Sample Input 1 2 3 Sample Output 2.000

HINT 注意除法运算对整型数据和浮点型数据是不一样的。

Append Code #include int main(){ int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“%.3lf”,(a+b+c)/3.0);}

4.Problem D: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。

Input 输入为3个字符。

Output 输出为3行。

每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。

Sample Input 0 A

Sample Output 048 060 030 032 040 020 065 101 041

HINT 了解字符值的存储和整型的关系。

Append Code #include int main(){ char a,b,c;scanf(“%c%c%c”,&a,&b,&c);printf(“%.3d %.3o %.3xn”,a,a,a);printf(“%.3d %.3o %.3xn”,b,b,b);printf(“%.3d %.3o %.3xn”,c,c,c);}

5.Problem A: 最简单的程序 Description 输出一行“Hello world!”。

Input 无

Output Hello world!

Sample Input Sample Output Hello world!

HINT Append Code #include int main(){

printf(“Hello world!”);}

6.Problem B: 算术基本运算 Description 计算两整数x和y(0

Input 输入只有一行,格式见sample。

Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample

Sample Input x = 11, y = 3

Sample Output x + y : 14 xy : %dn“,x-y);

printf(”x * y : %dn“,x*y);

printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y);

printf(”x ^ 2 : %dn“,x*x);

printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自减运算 Description C语言中有自增运算++、自减运算--,并且可以前置和后置。

编写一个程序:对输入的一个整数a,输出a++、a--、++a、--a的值。

Input 一个整数a,a是很小的整数。

Output 输出为5行,第一行为a的值,后面依次为--a、a--、a++、++a的值。

5行输出纵向a要对齐,“:”对齐,“:”前后各一个空格,后面的数值不用对齐。每行行尾都有回车。

Sample Input 0

Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1

HINT Append Code #include int main(){ int a,x;scanf(”%dn“,&x);a=x;printf(” a

: %dn“,a);printf(”--a

: %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a

: %dn“,++a);}

8.Problem F: 绝对值 Description 求整型数据和浮点型数据的绝对值。

Input 输入两个数,第一个是整数,第二个是浮点数。

Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。

Sample Input-1 1

Sample Output 1 1

HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人!

Append Code #include //#include int main(){

int n;

float m;

scanf(”%d%f“,&n,&m);

//n=abs(n);

//m=fabs(m);

if(n<0)

{

n=-n;

}

if(m<0)

{

m=-m;

}

printf(”%dn“,n);

printf(”%g“,m);

return 0;}

9.Problem A: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。

Input 输入只有一行,为一个100以内的正整数。

Output 输出为一行。

若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30

Sample Output even

HINT 用整数运算可以解决,练习“?:”表达式。

Append Code #include int main(){

int n;

scanf(”%d“,&n);

if(n>=0&&n<=100){

if(n%2==0)printf(”evenn“);

else printf(”oddn“);

}

return 0;}

10.Problem B: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。

Input 输入只有一行,三个整数m、n和x,且0

Sample Input 95 300 4

Sample Output 334.40

HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。

Append Code #include int main(){

int m,x,n,a;

float b;

scanf(”%d%d%d“,&m,&n,&x);

0

x

m

a=m*x;

if(a>n)

b=0.88*a;

else

b=a;

printf(”%.2fn“,b);

}

11.Problem C: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。

Input 输入只有一行,为一个10000以内的正整数。

Output 输出为一行。

若输入为闰年偶数则输出“Yes”,否则输出“No”。

Sample Input 2010

Sample Output No

HINT 了解逻辑运算符和关系运算符。

Append Code #include int main(){

int x;

scanf(”%d“,&x);

if(x>0&&x<10000)

{

if(x%4==0&&x%100!=0)

printf(”Yesn“);

else if(x%400==0)

printf(”Yesn“);

else

printf(”Non“);

}

else

printf(”error“);}

12.Problem D: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。

Input 一个整数x,100<=x<=999。

Output x是水仙花数,则输出“YES”,否则为“NO”。

Sample Input 153

Sample Output YES

HINT Append Code #include int main(){

int a,b,c,x;

scanf(”%d“,&x);

a=x/100;

b=x/10%10;

c=x%10;

if(x==a*a*a+b*b*b+c*c*c)

printf(”Yes“);

else

printf(”No“);}

13.Problem E: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。

Input 输入只有一行,为三个整数。

Output 按从小到大输出这三个数。

Sample Input 15 10 20

Sample Output 10 15 20

HINT 用if语句判断各种情况可以解决这个问题。

Append Code #include int main(){

int a,b,c;

scanf(”%d%d%d“,&a,&b,&c);

if(a>=b)

{

if(b>=c)

printf(”%d %d %dn“,c,b,a);

else if(c>=a)

printf(”%d %d %dn“,b,a,c);

else

printf(”%d %d %dn“,b,c,a);

}

else

{

if(a>=c)

printf(”%d %d %dn“,c,a,b);

else if(b>=c)

printf(”%d %d %dn“,a,c,b);

else

printf(”%d %d %dn“,a,b,c);

} }

14.Problem F: 奇怪的求和之一 Description 给定3个正整数a、b和c,按照如下规则求和: 如果这个数字是偶数,则累加到和中;

如果这个数字是奇数,则将大于该数的最小偶数累加到和中。

Input 三个正整数,均在100以内。

Output 一个和。

Sample Input 2 3 5

Sample Output 12

HINT 如果不会使用分支语句,可使用条件运算符判断到底将哪个数累积到和中。

Append Code #include int main(){

int a,b,c;

scanf(”%d%d%d“,&a,&b,&c);

if(a%2!=0)a++;

if(b%2!=0)b++;

if(c%2!=0)c++;

printf(”%dn“,a+b+c);

}

15.Problem G: 你过线了吗? Description 经过四年的学习,你决定报考我国著名的“285”高校之一的北青大学,经过认真的复习,残酷的考试,终于知晓了自己的考试成绩,也知道了北青大学的录取分数线,请你编程判断,自己过线了吗? Input 输入有2行,第一行有4个正整数,分别表示三门课程的分数线以及总分分数线。第二行有3个非负整数,分别表示你考的三门课程的成绩。

Output 如果你的三门课程成绩都不低于相应课程的分数线,且你的考试总分也不低于北青大学的总分分数线要求,则输出“congratulations”,否则输出“sorry”。

Sample Input 70 80 70 240 80 80 82

Sample Output congratulations

HINT 如果你不会使用分支语句,同样可以使用条件运算符实现该程序。

Append Code #include int main(){

int a,b,c,d,e,f,g,h;

scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g);

h=e+f+g;

if(e>=a&&f>=b&&g>=c&&h>=d)

printf(”congratulations“);

else

printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的和,顺序与输入对应。

Sample Input 2 1 2 10 20

Sample Output 3 30

HINT N给出了测试样例数,用for循环处理方便。

Append Code #include int main(){

int n,a,b,i;Scanf(“%d”,&n);For(i=0;i

17.Problem H: A+B Problem Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的值,顺序与输入对应。

Sample Input 1 2 10 20

Sample Output 3 30

HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。Append Code #include int main(){

int a,b;

while(scanf(”%d%d“,&a,&b)!=EOF){

printf(”%dn“,a+b);

}

return 0;}

18.Problem A: 判断是否是元音字母 Description 输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U

Input 输入一个英文字母

Output 是元音字母,输出“yes”,否则输出“no”,行尾没有回车。

Sample Input A

Sample Output yes

HINT Append Code #include void main(){

char ch;

scanf(”%c“,&ch);

if(ch>='A'&&ch<='Z')

ch=ch+32;

if(ch=='a')

printf(”yes“);

else if(ch=='e')

printf(”yes“);

else if(ch=='i')

printf(”yes“);

else if(ch=='o')

printf(”yes“);

else if(ch=='u')

printf(”yes“);

else

printf(”no“);

}

19.Problem B: 按顺序输出三个数 Description 对于输入的3个整数,按照从小到大的顺序输出。

Input 输入3个int类型内的整数,两两之间用一个空格隔开。

Output 按照从小到大的顺序输出上述三个数,两两之间用一个空格隔开。

Sample Input 2 1 3 Sample Output 1 2 3

HINT Append Code #include void main(){

int a,b,c,temp;

scanf(”%d%d%d“,&a,&b,&c);

if(a

{

temp=a;

a=b;

b=temp;

}

if(a

{

temp=a;

a=c;

c=temp;

}

if(b

{

temp=b;

b=c;

c=temp;

}

printf(”%d %d %dn“,c,b,a);}

20.Problem E: Description 判断输入整数的奇偶性。

判断奇偶数 Input 输入为一个整数。

Output 输出只有一行,代表判断结果。如果输入的整数n是一个偶数,输出: n is an even number.否则输出:

n is an odd number.见样例。

Sample Input 12

Sample Output 12 is an even number.HINT Append Code #include int main(){

int a;

scanf(”%d“,&a);

if(a%2==0)

printf(”%d is an even number.“,a);

else

printf(”%d is an odd number.“,a);}

21.Problem A: 判断两个整数的大小关系 Description 输入2个整数a和b,如果a>b,则输出1,否则输出0。

Input 两个整数a和b,均不超过int类型的表示范围。

Output 表示a>b的结果:如果a>b,则输出1,否则输出0。

Sample Input 3 4

Sample Output 0

HINT

Append Code #include int main(){ int a,b;scanf(”%d %d“,&a,&b);if(a>b)

printf(”1“);

else

printf(”0“);return 0;} 22.Problem D: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing

不在0~100之间的输入是非法数据,输出“Error”。

Input 输入多行,每行一个整数。

Output 输入所对应的成绩等级。

Sample Input-1 81 92 35 68 72 100

Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。

Append Code #include int main(){

int score;

while(scanf(”%d“,&score)!=EOF)

{

if(score<0||score>100)

printf(”Errorn“);

else

{

switch(score/10)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:printf(”Failingn“);break;

case 6:printf(”Passn“);break;

case 7:printf(”Averagen“);break;

case 8:printf(”Goodn“);break;

case 9:

case 10:printf(”Excellentn“);break;

}

}

}

return 0;}

23.Problem E: 输出是m的倍数或n的倍数、但不是

m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n

Input 输入三个整数,依次为k、m、n。

Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。

Sample Input 15 2 3

Sample Output 2 3 4 8 9 10 14 15

HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。

Append Code #include int main(){ int k,m,n,a,i=1;scanf(”%d %d %d“,&k,&m,&n);if(m

a=m;else

a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){

}

if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0))

printf(” %d“,i);} return 0;

24.Problem B: 两整数相加减 Description 计算a+b和a-b。

Input 输入为一对整数a和b。a,b用空格分开。

Output 输出a+b和a-b的计算结果,各占一行。

Sample Input 1 2

Sample Output 3-1

HINT Append Code #include int main(){ int a,b;scanf(”%d %d“,&a,&b);

printf(”%dn“,a+b);

printf(”%dn“,a-b);} 25 Problem C: 它满足条件吗? Description 需要判断给定的一个整数是否同时满足如下三个条件: 1.它是一个完全平方数。2.它是一个偶数。3.它是一个正数。

注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如:

0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一个int范围内的整数。

Output 如果输入的数字满足条件,则输出yes,否则输出no。

Sample Input 100

Sample Output yes

HINT 注意逻辑表达式判断三个条件的顺序。如果你不会使用分支语句,同样可以使用条件运算符实现该程序。

库函数sqrt()可以用于求一个数的平方根。

Append Code #include #include int main(){ int a;scanf(”%d“,&a);

if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0)

printf(”yes“);

else

printf(”no“);}

26.Problem F: 多路分支 Description 编写一个完整的程序,运行时向用户提问”你考试考了多少分?(0-100)“接受输入后判断其等级并显示出来等级: 优:90<=分数<=100 良:80<=分数<90 中:60<=分数<80 差:0<=分数<60

Input 输入任意一个整数分数值,显示等级;再输入任意一个整数分数值,显示等级;....直到测试数据较充分,可输入-1止。

Output 对任意输入的分数值,输出对应的等级,直到输入的数为-1时才退出运行.Sample Input 102 100 90 80 70 60 50 0-80-1

Sample Output grad must between 0 and 100 优

grad must between 0 and 100 grad must between 0 and 100

HINT Append Code #include int main(){

int x;

while(scanf(”%d“,&x)!=EOF)

{

if(x<0||x>100)

printf(”grad must between 0 and 100n“);

else if(x>=90)

printf(”优n“);

else if(x>=80)

printf(”良n“);

else if(x>=60)

printf(”中n“);

else if(x>=0)

printf(”差n“);

}

return 0;} Problem D: 有多少人? Description 学校举行运动会,如果全体学生按照3人一队列队,则多了1个人;如果按照4人一队列队,则多了2个人;如果按照5人一队排队,则多了3个人。请问这个学校有多少学生?

Input 一个int类型的正整数N,是学生人数的上界,即:该校学生数不超过N。

Output 所有可能的学生数,每个数占一行。

Sample Input 200

Sample Output 58 118 178

HINT Append Code #include #include int main(){

int n,i;

scanf(”%d“,&n);

for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3)

printf(”%dn“,i);}

return 0;} Problem C: 正负数各有几个? Description 输入若干个整数,求其中正数、负数的个数。

Input 输入分为2行:第一行是一个数字N>0,表示下面有N个整数。第2行是N个整数,都是int类型的。

Output 输出所输入的N个整数的正数个数和负数个数,并用空格分开2个输出。Sample Input 10 2 3 4 5-1-2-3-4-5

Sample Output 5 5

HINT 貌似还有一种叫做0的数。

Append Code #include int main(){

int n,a,i,num1=0,num2=0;

scanf(”%d“,&n);for(i=0;i

{

scanf(”%d“,&a);

if(a>0)

num1++;

else if(a<0)

num2++;

}

printf(”%d %dn“,num1,num2);

return 0;} Problem A: A+B Problem(III): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。

Output 每行输出一个a+b的值,顺序与输入对应。

Sample Input 1 2 10 20 0 0

Sample Output 3 30

HINT 练习break的使用。

Append Code #include int main(){ int a,b;while(scanf(”%d %d“,&a,&b)!=EOF)

{

if(a!=0||b!=0)

}

printf(”%dn“,a+b);

else

break;

return 0;} 30 Problem B: A+B Problem(IV): Input/Output

Practice Description 计算a+b,0<=a,b<1000。

Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。

Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。

Sample Input 1 2 10 20 15 35

Sample Output 3 30 50

HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。

Append Code #include int main(){ int a,b,n=0;while(scanf(”%d %d“,&a,&b)!=EOF){

n++;

if(n==1)

printf(”%dn“,a+b);

else

printf(”n%dn“,a+b);

}

return 0;}

Problem C: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。

Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。

Output 输出为两行,格式见sample。

Sample Input 3 0 1-1

Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。

Append Code #include int main(){

int n,i,max,min;

scanf(”%d“,&n);

int a[n];

for(i=0;i

scanf(”%d“,&a[i]);

max=a[0];

min=a[0];

for(i=0;i

{

if(max

max=a[i];

if(min>a[i])

min=a[i];

}

printf(”The maximum number is %d.n“,max);

printf(”The minimum number is %d.“,min);

return 0;} 32.Problem D: 求100以内的素数 Description 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。

Input 输入为两个整数m和n,满足0<=m<=n<=100。

Output 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。

输出的所有数在两行“=====”之间。

Sample Input 2 12

Sample Output ===== 11 7 5 3 2 =====

HINT 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。

Append Code #include #include int main(){ int m,n,i,j,k,t;scanf(”%d %d“,&m,&n);printf(”=====n“);for(i=n;i>=m;i--){

t=0;

for(j=2;j<=sqrt(i);j++)

if(i%j==0)

t=1;

if(t==0&&i>1)

printf(”%dn“,i);} printf(”=====“);return 0;} 33.Problem E: 是否构成三角形? Description 给出三个整数,代表三条边的长度,判断这三条边的长度是否能构成一个三角形?

Input 第一行是n(1<=n<=100),表示有n组测试数据

接下来有n行,每一行包含三个整数,表示三个边长(1<=边长<=100)

Output 如果三条边能构成三角形,输出YES,否则输出NO

Sample Input 3 1 2 3 2 8 7 20 20 1

Sample Output NO YES YES

HINT Append Code #include int main(){ int a,b,c,n,i;scanf(”%d“,&n);for(i=0;i

{scanf(”%d%d%d“,&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a)

printf(”YESn“);else printf(”NOn“);}

return 0;} 34.Problem C: 简单的整数排序 Description 对给出的若干整数按从小到大排序。

Input 输入的第一个数为n(n<=1000),后接n个整数。

Output 按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。

Sample Input 10 3 9 1 5 2 8 5 6 7 3

Sample Output 1 2 3 3 5 5 6 7 8 9

HINT 排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。

Append Code #include int main(){

int c,i,n,j;

int a[1000];

scanf(”%d“,&n);

for(i=0;i

scanf(”%d“,&a[i]);

for(i=1;i<=n-1;i++)

{

for(j=0;j

{

if(a[j]>a[j+1])

{

c=a[j];

a[j]=a[j+1];

a[j+1]=c;

}

}

}

printf(”%d“,a[0]);

for(i=1;i

printf(” %d“,a[i]);

return 0;}

35.Problem A: Description

购物的路程 Saya和Kudo一起去购物。假定她们逛的街是一条直线,而商铺是这条直线上的一些点。她们将车停在该直线最左端的店铺处,然后从左向右开始逛每一个店铺,然后从最右边的店铺再返回到停车处。你的任务是计算她们走了多少路。

Input 输入有多组。每一组的第一行是N(0

Output 对每组输入,输出她们走的路长。

Sample Input 4 13 89 37 6 7 30 41 14 39 42 0

Sample Output 152 70

HINT Append Code #include int main(){

int n,i,max,min,a[100001];

while(scanf(”%d“,&n)&&n!=0)

{

scanf(”%d“,&a[0]);

min=max=a[0];

for(i=1;i

{

scanf(”%d“,&a[i]);

if(a[i]>max)

max=a[i];

if(a[i]

min=a[i];

}

printf(”%dn“,(max-min)*2);

}

return 0;} 36.Problem B: 求累加和 Description 编程求min~max的累加和(含min和max),其中max>=min>0。部分程序已经给出,请填充其中的空白语句,并提交填充后的完整程序。

Input 输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。

Output 输出为N行,每个测试用例的计算结果占据一行。每行的格式为: case i:sum=s.其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。

Sample Input 3 1 10 1 100 1 1

Sample Output case 1:sum=55.case 2:sum=5050.case 3:sum=1.HINT Append Code #include int main(){

int n,i,j,max,min,sum;

scanf(”%d“,&n);

for(i=0;i

{ sum=0;

scanf(”%d%d“,&min,&max);

if(max==min)

printf(”case %d:sum=%d.n“,i+1,min);

else

{

for(j=min;j<=max;j++)

sum=sum+j;

printf(”case %d:sum=%d.n“,i+1,sum);

}

} return 0;} 37.Problem G: 顺序输出字母 Description 按字母顺序输出两个字母st和ed之间的所有字母,但不包括st和ed。不输出逆序。

Input 两个字母st和ed,都是大写字母,用一个空格分开。

Output 在一行内按顺序输出st和ed之间的所有字母,但不包括st和ed。例如:

输入为A和E,则输出为BCD;

输入为A和B,则什么字母也不输出,只有一个空行; 输入为E和A,也是什么字母也不输出,只有一个空行。最后要输出一行(行尾不回车): ***END***

Sample Input A C

Sample Output B

***END***

HINT Append Code #include int main(){

char st,ed,a;

int i;

scanf(”%c%c%c“,&st,&a,&ed);

{

for(i=st+1;i

printf(”%c“,i);

printf(”n***END***“);

}

return 0;} 38.Problem F: 单字母变换 Description Tom和Jack是密码学爱好者,他们在聊天时经常使用一些暗语。他们使用的一种最简单的暗语是:将要说的每句话里面的英文字母变成这个字母之后的某个字母。现在要求你写一个程序,将一个字母变成它之后的某个字母。

Input 输入有2个:一个大写字母c和一个正整数d(0

Output 输出字母c之后的第d个字母。大小写与c一致。如果c之后的某个字母已经超出'Z',则再从字母'A'开始计数。

如:c='A',d=3,则输出应为:D。若:c='Y',d=3,则输出应为:B。

Sample Input A 3

Sample Output D

HINT Append Code #include int main(){

char c;

int d;

scanf(”%c%d“,&c,&d);

if(c+d<='Z')

printf(”%c“,c+d);

else

printf(”%c“,c+d-26);

return 0;}

39.Problem B: 登录密码验证 Description 编写一个程序,模拟用户登录系统的密码验证过程。系统提供给用户的密码长度最长为20个字符,若密码输入错误可以再次输入。但为了保证用户密码安全,若连续输入密码错误超过5次就会锁定账号一段时间。

Input 输入为若干个串,至EOF结束。输入的第一个串是用户的正确密码,后面的串为模拟用户登录时的输入的密码。

Output 每次输入错误的密码,输出一个“Wrong!”,若输入的密码为正确的,输出一个“Welcome!”,并结束密码测试。若前5次输入的密码都是错误的,则后面的输入中不管是否有正确的密码都输出“Out of limited!”。

Sample Input abcdefg

123456 kkkkkkkk abcdefg

Sample Output Wrong!Wrong!Welcome!

HINT 输入可以用scanf(”%s“)处理,密码比较用字符串的比较可以完成。

Append Code #include #include int main(){

char a[20],b[20];

int i,j=1;

scanf(”%s“,a);

while(scanf(”%s“,b)!=EOF)

{

if(j<=5)

{

if((strcmp(a,b)==0))

{

printf(”Welcome!n“);

break;

}

else

printf(”Wrong!n“);

j++;

}

else printf(”Out of limited!n");

} } 40.Problem C: 兔子的繁殖问题 Description 假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?

这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。

Input 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。

Output 输出为n行,每行为第m个月后的兔子总数。

第四篇:C 语言程序设计

《C 语言程序设计》主要在计算机软件、计算机网络、计算机应用、通信技术、智能电子、电子信息工程、多媒体以及核工程与核技术等专业中开设,是电子信息类、机械类等工科专业的重要专业基础课。

本校从2001至今,每年都开设《C语言程序设计》课程,由于,我校最开始时的特殊情况,主要把重点放在C语言中的各类重点、难点的语法、语义上,使得学生经过比较复杂和痛苦的过程后,对C语言在使用上很难做到自己编写程序。而且很多学生产生了畏惧心理。

2004年,学院成立计算机科学与技术系,为了更好学习和掌握C语言,计算机科学与技术专业和计算机维护专业(计算机应用技术前身)除了开设《C语言程序设计》课程外,在后续一学期还开设了《C语言程序设计课程设计》,使得计算机专业学生编程思想和能力得到了极大提高。

2005年,为了让我院工科学生更好的掌握C语言编程以及通过四川省计算机二级考试,在《C语言程序设计》课程后设置《C语言程序设计课程设计》,极大地提高了学生的动手机会和能力,过级率显著提高!

2007年,依托我校建设精品课程的契机,我们将C语言中的各个知识点进行重新规整,提出适用于三本院校学生的语言设计学习的方法。我们提出,先了解C语言,再学习C语言,再用C语言的思想。即在开始时让学生初步知道C语言,然后引入比较简单的运算符以及基本输入、输出和简单的顺序结构程序设计。通过这样的方式,我们发现,学生在C语言的学习就不会从开始的时候陷入大量难懂的语法、语义和数据结构中。有了以上铺垫再层层进入,最终进入复杂的各类数据结构以及指针等学习。通过以上的内容规整后,教学效果有明显提高。

第五篇:C语言程序设计扫雷游戏实验报告

中南大学

程序设计基础实践报告

学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 完成时间 2014.1 题 目 设计一个和window系统类似的小游戏【挖地雷】

《计算机程序设计实践》403591717.docx 目录

1.课程设计内容.............................................................................................3 2.课程设计目的.............................................................................................3 3.背景知识....................................................................................................3 4.工具/准备工作............................................................................................5 5.设计步骤、方法.........................................................................................5

5.1.步骤1:步骤名称(二级标题).......................................................错误!未定义书签。

步骤1.1:步骤名称(三级标题)..............................................................................5 5.1.1.5.2.5.3.步骤2:步骤名称..........................................................................错误!未定义书签。步骤n:步骤名称..........................................................................错误!未定义书签。

6.设计结果及分析.........................................................................................5 7.设计结论..................................................................................................15 8.问题及心得体会.......................................................................................16 9.对本设计过程及方法、手段的改进建议....................................................17 10.参考文献..................................................................................................17

《计算机程序设计实践》403591717.docx

printf(“请输入棋盘行列数(小于20且用逗号隔开):”);

scanf(“%d,%d”,&x,&y);

getchar();

printf(“请输入雷的个数:”);

scanf(“%d”,&b);

getchar();

break;

}

break;

}

else

{

printf(“输入错误请重新输n”);

}

} while(begin){

system(“cls”);

InitialValue_game(&g);

InitialMine_game(&g);

print_game(&g,2);

NO=1;

while(NO)

{

printf(“Please choose:”);

scanf(“%d,%d”,&i,&j);getchar();if(-1

{

switch(openmap(&g,i-1,j-1))

{

case 1:

print_game(&g,1);

printf(“游戏结束!按回车键再来一局n”);

《计算机程序设计实践》403591717.docx

if(getchar()=='n')begin=1;

else begin=0;

NO=0;

break;

case 2:

if(judge_game(&g)==b)

{

printf(“win!n”);

print_game(&g,1);

printf(“按回车键再来一局n”);

if(getchar()=='n')begin=1;

else begin=0;

NO=0;

break;

}

else print_game(&g,2);NO=1;break;

default:break;

}

}

else

{

printf(“你输入错误!请重新输入n”);

} } } }

下载编游戏 C语言程序设计案例精编word格式文档
下载编游戏 C语言程序设计案例精编.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    C语言程序设计扫雷游戏实验报告[五篇范文]

    中南大学 程序设计基础实践报告 学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 完成时间 2014.1 题 目 设计一个和window系统类似的小游戏【挖地雷......

    经典C语言程序设计例题

    经典C语言程序设计例题 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组......

    第一章 C语言程序设计

    第一章 C语言程序设计 考试形式:试卷(全国统一 4月第二个星期六9月倒数第二个星期六) 笔试: 满分100分60分及格 时间:90分钟内容: 70分 C语言知识30分 公共基础 选择题:60分 前......

    C语言程序设计心得体会

    C语言程序设计心得体会在这为期半个月的时间内,通过我们小组各成员之间的相互讨论和合作,我们完成了学生信息管理系统的程序设计,更值得高兴的是我们的程序得到了大家的喜爱,在......

    C语言程序设计策划书

    信息工程学院学生会科技部 关于举办信息工程学院C语言程序设计大赛的策划书 一、活动背景: 随着计算机技术的快速发展,计算机程序语言的多样化,C语言已经使用的越来越广泛,C语言......

    《C语言程序设计》教学方法探讨

    《C语言程序设计》教学方法探讨 【摘要】针对目前《C语言程序设计》教学效果不理想的问题,结合教学实际,分析教学过程中存在的问题,针对计算机专业新生的教学方法进行探讨,提出......

    C语言程序设计教案

    C语言程序设计教案 C语言程序设计教案 C 语言程序设计教案 C 语言概述 【教学目的】 1)了解 C 的发展 教学目的】 2)熟悉 C 的特点 教学重点】 【教学重点】 C 语言的特点......

    C语言程序设计--大作业

    C语言程序设计大作业 编写程序,实现单链表的插入、删除、输出、查找、统计以及销毁功能。 单链表的每个结点存储一名学生的信息,包括:学号、姓名、性别、年龄、三门课程(高数、......