《c语言游戏初始编程.doc》由会员分享,可在线阅读,更多相关《c语言游戏初始编程.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/*文字信息大部分来自百度:*我只是给加上了源程序 。*976 于 2011年4月2日*所有源程序仅供学习使用!特声明* 程序源码* 适用TC2.0* BY 976* E-Mail : fdca_6431* Copyright 2011, All Rights Reseverd*/纯真童趣的泡泡堂,还有武林情仇,笑傲江湖的剑侠情缘on line.它是e时代常谈的话题,是交互式娱乐的主力军,是一种 高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式 .作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科.一般来说,是比较
2、枯燥的.那么,我们能不能通过编一些小 游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.这正是 我发贴的目的. 1, 总是从Hello,world开始 学习编程的第一个程序,一般就是打印一个亲切的词语Hell o,world!.让我们来看看这个最简单的C程序: #incolude /*把输入输出函数的头文件包含进来*/ int main() printf(Hello, world!);/*在屏幕上输出字符串Hello,world!*/ return 0;/*退出main函数,并返回0*/ 下面我们发现几个值得改进的地方,1,程序的运
3、行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们 还希望屏幕输出一个笑脸来欢迎我们.(大家不要小看了这个笑脸 曾经有人发贴专门问呢)让我们来改进一下这个程序吧! 1,在return语句的前面加一句:getch ();,表示按任意键结 束.2,在printf语句前用clrscr函数清屏,要使用这个函数和get ch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可 以用printf(%c, 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world
4、了.下 面让我们开始做游戏吧! /*Start of C Program*/#include#include/*经测试 命令提示符 窗口 容纳 字符数 为 : 80 * 25*据此 ,设置 HMAX 为 25 ,VMAX 为 80*边界初始值为 (1,1)-(80,25)*/#define HMAX 25#define VMAX 80struct move_pointint x, y;/*该点的位置,包括x坐标和y坐标*/int xv, yv;/*该点在x轴,y轴的速度*/;int main()struct move_point man;/* 结构体初始化 */man.x=1;man.y=1;
5、man.xv=1;man.yv=1;gotoxy(man.x, man.y);/*把光标移到指定的坐标*/ /* 初始显示 */printf(%cb, 2);getch();while(!kbhit()/* kbhit()无键盘输入时返回值为真 */* 先消去原位置图形,* 再计算新位置* 显示*/*/gotoxy(man.x, man.y);printf( );/* 感觉没清屏函数好用 , 边界时常会留下笑脸无法清除 * /clrscr();/*/man.x += man.xv;/*水平方向按x轴的速度运动*/man.y += man.yv;/*垂直方向按y轴的速度运动*/* 应该反弹时计算
6、 */if(man.xVMAX|man.xHMAX|man.y1)man.yv=0 - man.yv;man.y=(HMAX*2 - man.y)%(HMAX*2);/* 新位置显示 */gotoxy(man.x, man.y);printf(%cb,2);/* 延时, i 或 j减小太多会呈现不规则运动 */int i, j;for(i=0;i10000;i+)for(j=0;j10000;j+);return 0;/*End of C Program*/2, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让 我们来做一个小动画吧.在屏幕上显示一个运动
7、的小笑脸,而且当 它到达屏幕的边缘时会自动弹回来. 先在程序定义一个在屏幕中运动的点的结构: struct move_point int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/ ; 运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段 距离,再画出该物体.让我们看到以下代码: gotoxy(man.x, man.y);/*把光标移到指定的坐标*/ printf( );/*输出一个空格,把先前的字符擦去*/ 然后我们让物体按其速度运动: man.x += man.xv;/*水平方向按x轴的速度运动*/ man.y += man
8、.yv;/*垂直方向按y轴的速度运动*/ 运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸: gotoxy(man.x, man.y); printf(%cb, 2); /*输出ASCII码值为2的笑脸字符*/ 怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! /*Start of C Program*/* 程序源码* 适用TC2.0* BY 976* E-Mail : fdca_6431* Copyright 2011, All Rights Resever
9、d*/#include#include/*经测试 命令提示符 窗口 容纳 字符数 为 : 80 * 25*据此 ,设置 HMAX 为 25 ,VMAX 为 80*边界初始值为 (1,1)-(80,25)*/#define HMAX 25#define VMAX 80struct move_pointint x, y;/*该点的位置,包括x坐标和y坐标*/int xv, yv;/*该点在x轴,y轴的速度*/;int main()struct move_point man;/* 结构体初始化 */man.x=1;man.y=1;man.xv=1;man.yv=1;gotoxy(man.x, man
10、.y);/*把光标移到指定的坐标*/ /* 初始显示 */printf(%cb, 2);getch();while(!kbhit()/* kbhit()无键盘输入时返回值为真 */* 先消去原位置图形,* 再计算新位置* 显示*/*/gotoxy(man.x, man.y);printf( );/* 感觉没清屏函数好用 , 边界时常会留下笑脸无法清除 * /clrscr();/*/man.x += man.xv;/*水平方向按x轴的速度运动*/man.y += man.yv;/*垂直方向按y轴的速度运动*/* 应该反弹时计算 */if(man.xVMAX|man.xHMAX|man.y1)ma
11、n.yv=0 - man.yv;man.y=(HMAX*2 - man.y)%(HMAX*2);/* 新位置显示 */gotoxy(man.x, man.y);printf(%cb,2);/* 延时, i或j减小太多会呈现不规则运动 */int i, j;for(i=0;i10000;i+)for(j=0;j10000;j+);return 0;/*End of C Program*/3, 交互的实现让我们来控制笑脸运动 这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸 顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略 处理.接受按键我们用以下两条语句: while (b
12、ioskey(1) = 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ 然后用switch语句来判断按键以及执行相关操作,如下: switch (key) /*对变量key的值进行判断*/ case UP: /*如果按的是向上键*/ break; /*让物体向上运动,并退出switch*/ case DOWN: /*如果按的是向下键*/ break; /*让物体向下运动,并退出switch*/ case LEFT: /*向左键*/ break;/*向左运动*/ case RIGHT: /*向右键*/ break;/*向右运动*/ defau
13、lt: break;/*其他按键则忽略处理*/ 怎么样,是不是有了玩游戏的感觉了?不过这个程序没有什么目的 ,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动 的笑脸来做一个更有趣的游戏吧! /*Start of C Program*/* 程序源码* 适用TC2.0* BY 976* E-Mail : fdca_6431* Copyright 2011, All Rights Reseverd*/* 程序限制移动边界*/#include#include#define UP 72#define DOWN 80#define LEFT 75#define RIGHT 77#define E
14、SC27#define HMAX 25#define VMAX 80struct move_pointint x, y;/*该点的位置,包括x坐标和y坐标*/int xv, yv;/*该点在x轴,y轴的步进长度*/;struct move_point man=15,10,1,1;void move(int x, int y)gotoxy(man.x, man.y);printf( b);man.x += x;man.y += y;/* 边界时固定不动 */if(man.x80|man.x25|man.y1)man.y -= y;gotoxy(man.x, man.y);/*把光标移到指定的坐标
15、*/printf(%cb, 2);void help()printf(-Help Info-n);printf( 1, w means UPn);printf( 2, s means DOWNn);printf( 3, a means LEFTn);printf( 4, d means RIGHTn);printf( 5, means ENDn);printf( 6, h to get helpn);printf( Press any to continuen);getch();clrscr();move(0,0);int main()char key;gotoxy(man.x, man.y)
16、;/*把光标移到指定的坐标*/ /* 初始显示 */printf(%cb, 2);getch();while(1)while (bioskey(1) = 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ switch (key) /*对变量key的值进行判断*/ case w: /*如果按的是向上键*/move(0,-1);break; /*让物体向上运动,并退出switch*/ case s: /*如果按的是向下键*/move(0,1);break; /*让物体向下运动,并退出switch*/ case a: /*向左键*/move(-1,
17、0);break;/*向左运动*/ case d: /*向右键*/move(1,0);break;/*向右运动*/ case h: /* 帮助 */help();break; case :exit(0);default:break;/*其他按键则忽略处理*/ return 0;/*End of C Program*/4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜 欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编 个迷宫的游戏,重温一下童年的乐趣. 首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中m apxy = #表示在(x,y)坐标上的点
18、是墙壁.DrawMap函数 在屏幕上输出迷宫的地图和一些欢迎信息. 在main函数里,我们定义了小人man的坐标和目的地des的 坐标.在游戏循环中,我们增加了一些用来判断胜负的语句: if (man.x = des.x & man.y = des.y) /*如果人的坐标等于目 的地的坐标*/ gotoxy(35, 3); printf(Ok! You win!); /*输出胜利信息*/ . 在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不 是有墙壁,如果有的话,就不能往前移动了.好的,我们在判 断按键的switch语句的各个分支加上了判断语句,如下: if (map = #) br
19、eak;/*如果前面是墙壁,就不执行 下去*/ 哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修 改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们 要设计一个更好玩的游戏 /*Start of C Program*/* 程序源码* 适用TC2.0* BY 976* E-Mail : fdca_6431* Copyright 2011, All Rights Reseverd*/#include#include#define HMAX 26#define VMAX 80/* SX : 迷宫初始x轴坐标* SY : 迷宫初始y轴坐标* MSX: 迷宫x轴大小* MSY: 迷宫
20、y轴大小*/#define SX10#define SY10#define MSX5#define MSY5/* 值为 1 表示墙壁,用 # 显示;0 表示 通道,用 显示 */int mapMSXMSY=1,1,1,1,1,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,1,0,1;struct move_pointint x, y;/*该点的位置,包括x坐标和y坐标*/int xv, yv;/*该点在x轴,y轴的步进长度*/;struct move_point man=SX+1,SY,1,1;void move(int x, int y)gotoxy(man.x, ma
21、n.y);printf( b);man.x += x;man.y += y;gotoxy(man.x, man.y);/*把光标移到指定的坐标*/printf(%cb, 2);void help()printf(-Help Info-n);printf( 1, w means UPn);printf( 2, s means DOWNn);printf( 3, a means LEFTn);printf( 4, d means RIGHTn);printf( 5, means ENDn);printf( Press any to continuen);getch();clrscr();move(
22、0,0);int main()char key;int i,j;for(i=0;iMSX;i+)for(j=0;jMSY;j+)gotoxy(SX+i,SY+j);if(1=mapij)printf(#);elseprintf( );gotoxy(man.x, man.y);/*把光标移到指定的坐标*/ /* 初始显示 */printf(%cb, 2);getch();while(1)while (bioskey(1) = 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ switch (key) /*对变量key的值进行判断*/ case
23、w: /*如果按的是向上键*/if(!mapman.x-SXman.y-SY-1)move(0,-1);break; /*让物体向上运动,并退出switch*/ case s: /*如果按的是向下键*/if(!mapman.x-SXman.y-SY+1)move(0,1);break; /*让物体向下运动,并退出switch*/ case a: /*向左键*/if(!mapman.x-SX-1man.y-SY)move(-1,0);break;/*向左运动*/ case d: /*向右键*/if(!mapman.x-SX+1man.y-SY)move(1,0);break;/*向右运动*/ c
24、ase h: /* 帮助 */help();break; case :exit(0);default:break;/*其他按键则忽略处理*/ if(14=man.x & 13=man.y)gotoxy(1,1);printf(Success!nCongratulation!);getch();clrscr();break;return 0;/*End of C Program*/5, 聪明的搬运工 大家一定玩过搬运工的游戏吧!这是在电脑和电子字典上较流 行的益智游戏,让我们动手做一个属于自己的搬运工吧! 程序依然用数组map来保存地图,数组元素如果为空格则表示什么 也没有,b表示箱子,#表示墙
25、壁,*表示目的地,i 表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的 显示,也要改变map相应元素的值. 游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人 前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继 续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推 箱子前进,否则不可移动.好的,我们在switch中增加了这些判断 语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目 的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断 这些目的地上是否都有箱子了. 真棒啊!我们可以做游
26、戏了.而且是一个老少皆宜,趣味十足的游 戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图, 我们还可以相互分享好的游戏地图呢. /*Start of C Program*/#include#include#define UP 72#define DOWN 80#define LEFT 75#define RIGHT 77#define ESC27#define HMAX 26#define VMAX 80#define SX10#define SY10#define MSX8#define MSY8/*空格则表示什么也没有,*b表示箱子,0表示墙壁,*表示目的地,*i表示箱子在目的地
27、 ,*(char)(15) 表示人 初始位置 (5,5) 。*/char mapMSXMSY= 0,0,0,0,0,0,0,0,0,0,0,*,0,0,0,0,0,0,0, ,0,0,0,0,0,0,0,b, ,b,*,0,0,*, ,b, ,0,0,0,0,0,0,0,b,0,0,0,0,0,0,0,*,0,0,0,0,0,0,0,0,0,0,0;struct move_pointint x, y;/*人的位置,包括x坐标和y坐标*/;struct move_point man=4,4;int iOK=0,iBNUM=0,iDNUM=0;/* 本次程序显示主要依靠对地图的修改 */void
28、move(int x, int y)int i, j;/* 修改地图信息 */if( =mapman.x+xman.y+y)|(*=mapman.x+xman.y+y)/* 可直接走的,空 或者 无箱子的目的地 : 无需修改地图信息 */man.x+=x;man.y+=y;else/* 不能直接走的,箱子 或者 有箱子的目的地 : 需要修改地图信息 */if(b=mapman.x+xman.y+y)if( =mapman.x+2*xman.y+2*y)mapman.x+2*xman.y+2*y=b;mapman.x+xman.y+y= ;man.x += x, man.y += y;elsei
29、f(*=mapman.x+2*xman.y+2*y)mapman.x+2*xman.y+2*y=i;iOK+;mapman.x+xman.y+y= ;man.x += x, man.y += y;else/* (i=mapman.x+xman.y+y)*/if( =mapman.x+2*xman.y+2*y)mapman.x+2*xman.y+2*y=b;iOK-;mapman.x+xman.y+y=*;man.x += x, man.y += y;elseif(*=mapman.x+2*xman.y+2*y)mapman.x+2*xman.y+2*y=i;mapman.x+xman.y+y=
30、*;man.x += x, man.y += y;/* 移动方向为目的地 或 什么都没有,直接移动 */* 输出新图 */for(i=0;iMSX;i+)for(j=0;jMSY;j+)gotoxy(SX+i,SY+j);if(mapij)printf(%c,mapij);elseprintf(#);gotoxy(man.x+10,man.y+10);printf(%cb,15);void help()printf(-Help Info-n);printf( 1, w means UPn);printf( 2, s means DOWNn);printf( 3, a means LEFTn);
31、printf( 4, d means RIGHTn);printf( 5, means ENDn);printf( 6, h to get helpn);printf( Press any to continuen);getch();clrscr();move(0,0);int main()char key;int i,j;help();for(i=0;iMSX;i+)for(j=0;jMSY;j+)gotoxy(SX+i,SY+j);if(mapij)printf(%c,mapij);elseprintf(#);if(b=mapij)iBNUM+;/* 统计箱子数 */if(*=mapij)
32、iDNUM+;/* 统计目的地数 */if(iBNUM!=iDNUM)/* 数目错误,地图信息有误退出 */printf(Error001!n);getch();exit(0);gotoxy(man.x+10, man.y+10);/*把光标移到指定的坐标*/ /* 初始显示 */printf(%cb, 15);while(1)while (bioskey(1) = 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/switch (key) /*对变量key的值进行判断*/ case w: /*如果按的是向上键*/if(mapman.xman.
33、y-1)/* 移动方向非墙壁时移动,下同 */move(0,-1);break; /*让物体向上运动,并退出switch*/ case s: /*如果按的是向下键*/if(mapman.xman.y+1)move(0,1);break; /*让物体向下运动,并退出switch*/ case a: /*向左键*/if(mapman.x-1man.y)move(-1,0);break;/*向左运动*/ case d: /*向右键*/if(mapman.x+1man.y)move(1,0);break;/*向右运动*/case h:help();break;case :/*ESC退出*/exit(0
34、);default:break;/*其他按键则忽略处理*/ key=0;if(iDNUM=iOK)clrscr();gotoxy(1,1);printf(Success!nCongratulation!);getch();break;return 0;/*End of C Program*/尾声: 在C+等高级语言还没出来的时候,很多应用程序也是C语言开发的 .C语言在与硬件联系紧密的编程中,也占有重要地位. 其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习. 象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的 曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就 有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编 游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方 法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言 来做几个自己喜欢的小游戏.