目录一、在VisualStudio2010上创立C名目二、关于新建名目的测试三、贪吃蛇游戏1.游戏预备2.游戏界面大小及背风景彩确定3.画出食物4.画蛇且使蛇移动5.经过按键控制蛇的移动6.蛇吃食物的疑问7.分数显示的疑问8.蛇死亡的疑问9.参与音乐疑问一、在VisualStudio2010上创立C名目1.关上VS2010,选用新建名...。
目录
一、在Visual Studio2010上创立C名目
二、关于新建名目的测试
三、贪吃蛇游戏
1.游戏预备
2.游戏界面大小及背风景彩确定
-
画出食物
4.画蛇且使蛇移动
5.经过按键控制蛇的移动
6.蛇吃食物的疑问
7.分数显示的疑问
8.蛇死亡的疑问
9.参与音乐疑问
一、在Visual Studio2010上创立C名目
-
关上VS2010,选用新建名目。
2.选用 “win32控制台运行程序” ,在窗口上方的称号填写好称号。
3.点击 “下一步” 继续,在附加选项当选用 “空名目” ,而后点击“成功”。
4.在软件界面左边的 "处置打算资源治理器" 中的 “源文件” 上方右击鼠标一次性选用 “参与”、“新建项”。
5.在新窗口当选用 “C++文件(.cpp)” ,在窗口下方的称号中填写好称号。留意不要遗记在填写好的称号前面写上 .c,最后选用“参与” 。
二、关于新建名目的测试
在创立好一个新名目之后,要测试新建名目能否可以,咱们便可以编写一个比拟便捷的C言语程序启动测试,例如:
在启动程序 口头 后,便可以失掉结果C=24了,说明新建名目成功。 留意,操作选用是口头文件,而不是启动调试,否则得不到输入结果。
三、贪吃蛇游戏
1.游戏预备
在写这个游戏之前,须要启动一些基本的预备,比如咱们这个游戏的全体框架是怎样的,须要多大的游戏界面,蛇的身材长度,食物示意,死亡状况,游戏音乐等等是怎样布局的,接上去咱们一步步来设计。
2.游戏界面大小及背风景彩确定
咱们这里就定义一个X,Y坐标区分为(800,600)的一个游戏界面,并且还要设置好游戏界面的背风景彩。
initgraph(800,600); 这个函数的性能是 初始化图形环境 创立一个尺寸为 800x600 的绘图环境。
setbkcolor(RGB(110,120,119)); //设置背风景彩,这里用的是RGB三元色的参数来选用色彩, 调整相关数字,便可以失掉深浅不一的各种色彩 。
在口头以上两个函数之后,须要启动清屏操作。
cleardevice(); //清屏,该函数的作用是用背风景清空屏幕,否则得不到咱们设置的色彩。
在口头程序之后,就可以失掉咱们设置的图形界面了。
3. 画出食物
画一个矩形的食物,食物的色彩 随机 产生,并且食物的位置也是 随机 产生
至于要让食物随机产生,就要用到随机函数rand(),咱们以期间启动收获,则可以失掉食物的随机产生。
要成功这样的想法,首先要建设一个存储X,Y坐标的结构体,如下:
而后再建设一个结构体,存储食物坐标,食物能否存在,以及食物的分数:
为了让食物产生,首先要给食物一个存在的坐标,并且是食物存在时的形态标位1,
接上去就可以画出食物了,画一个填充矩形就可。填充矩形色彩随机产生,运用随机函数。
4.画蛇且使蛇移动
在画好食物之后,便可以启动画蛇了,雷同,和画食物相似,咱们须要建设一个结构体来存储蛇的坐标,蛇的长度。这里咱们须要留意的是, 蛇不同于食物,不能仅用一个坐标来示意,蛇初始时最好是由3个矩形导致,并且随着蛇把食物吃掉,蛇的长度会参与,所以示意蛇的坐标会更多,因此,就须要一个 数组 来示意蛇的坐标。
所以,首先就初始化蛇,定义好蛇最后存在的位置,这里咱们思考蛇在吃到食物之后,数组坐标值便参与一个,所以以数组0作为蛇头,初始化程序如下:
在对蛇初始化成功之后,便可以启动画蛇的操作了,程序如下:
在画完蛇之后运转程序的效果如下:
如今曾经有蛇存在了,咱们便须要蛇能够动起来,就须要设计到蛇的方向疑问,所以在存储蛇的信息的结构体外面,要参与方向的信息:
要让咱们画好的三节蛇动起来,就可以运用 坐标转换 的原理使蛇动起来,因为坐标转换运用的是for循环来成功,所以并没有处置蛇头,所以蛇头须要独自处置。
关于蛇头的处置,是依据蛇头的方向,来成功蛇头的移动,详细实现代码如下:
5.经过按键控制蛇的移动
经过按键控制蛇的移动,可以用最罕用的W,A,S,D来控制蛇的移动,所以就要用到一个_getch()函数,_getch() 函数读入一个字符时 不用 enter 建代码会继续跑,所以控制蛇的移动时,代码如下:
6.蛇吃食物的疑问
蛇吃食物就是简化为一个坐标相等的疑问,当食物的坐标等于蛇头的坐标时,就相当于蛇吃掉了食物,所以咱们须要降级的就是蛇的长度,食物的存在形态以及分数。当咱们 降级蛇的长度 之后,主函数循环里就会相应画出蛇的长度。并且咱们须要降级一下食物形态,所以须要始终检测食物形态来确定能否降级食物。
7.分数显示的疑问
这里分数显示咱们经常使用outtextxy()函数来在制订的位置显示咱们的文本,并且可以设置字体样式和色彩,输入咱们想要输入的物品。
须要留意的是,在经常使用settextstyle()函数和outtextxy()函数时,须要将VS版本里的名目属性外面的字符集修正为经常使用多字符集,否则VS会报错。
8.蛇死亡的疑问
蛇死亡疑问,是相当于蛇头的坐标超越墙的坐标就相当于死亡,并且还有一种蛇咬到自己的一个状况,也属于蛇死亡,蛇咬到自己的一个状况是蛇头的坐标等于蛇身任何一处的坐标则相当于死亡。 留意在这里的一个逻辑相关是且的相关而不是或的相关, 只要蛇头的X和Y坐标都等于蛇身的X,Y坐标时,才干判定蛇曾经死亡。假设蛇死亡,则主函数里可以分开循环。
9.参与音乐疑问
在将游戏的基本框架设置好之后,之后的一步便是参与音乐了,咱们先下载好音乐文件,随后 将音乐文件放在咱们的名目文件中,留意,必定要把音乐文件放出来,否则播放不了音乐。 并且,经常使用mciSendString函数时,须要蕴含
include<mmsystem.h> //多媒体头文件
pragma comment(lib,"winmm.lib") //加载静态库
这两个文件。否则会报错,
在以上预备上班做好之后,便可以加出来了。
这样,最基本的贪吃蛇游戏便功败垂成了,假设有须要改良的中央,大家可以多多交换,接上去,我把我的源码附上。亲测可用。
#include <stdio.h>
#include <graphics.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#include <MMSystem.h>
#pragma comment(lib,"winmm.lib") //加载静态库/*定义一个结构体来存储咱们的坐标*/
typedef struct point
{int x,y;
}MYPOINT;/*定义一个结构体来存储咱们蛇的坐标,蛇身的长度*/
struct
{MYPOINT snakexy[100]; //定义一个数组来存储蛇的坐标int snakenum;int position;
}snake;/*定义一个结构体来存储咱们的食物坐标*/
struct
{MYPOINT fdxy; //食物坐标int grade; //食物分数int flag; //标志食物能否产生
}food;//定义一个枚举类型,来示意蛇的方向
enum position{up,down,right,left};/*初始化蛇*/
void initSnake()
{//初始化时先列出蛇的前三节坐标位置snake.snakexy[2].x=0;snake.snakexy[2].y=0; //蛇尾的坐标snake.snakexy[1].x=10;snake.snakexy[1].y=0;snake.snakexy[0].x=20;snake.snakexy[0].y=0; //蛇头的坐标snake.snakenum=3; //此时蛇的长度为3snake.position=right;
}/*画蛇*/
void drawSnake()
{for(int i=0;i<snake.snakenum;i++){setlinecolor(BLACK); // 设置以后线条色彩setfillcolor(RGB(rand()%255,rand()%255,rand()%255)); // 设置以后填充色彩fillrectangle (snake.snakexy[i].x,snake.snakexy[i].y,snake.snakexy[i].x+10, snake.snakexy[i].y+10); // 画填充矩形(有边框)}
}/*使蛇移动起来*/
void movesnake()
{//运用坐标转换的原理,使蛇动起来for(int i=snake.snakenum-1;i>0;i--){snake.snakexy[i].x=snake.snakexy[i-1].x;snake.snakexy[i].y=snake.snakexy[i-1].y;}//上述坐标转换没有顾虑到蛇头//蛇头的移动switch(snake.position){case up:snake.snakexy[0].y=snake.snakexy[0].y-10;break;case down:snake.snakexy[0].y=snake.snakexy[0].y+10;break;case right:snake.snakexy[0].x=snake.snakexy[0].x+10;break;case left:snake.snakexy[0].x=snake.snakexy[0].x-10;break;}
}/*经过按键控制蛇的移动*/
void KeyControl()
{char userkey=_getch();switch(userkey){case 'W':case 'w':if(snake.position!=down){snake.position=up;}break;case 'A':case 'a':if(snake.position!=right){snake.position=left;}break;case 'S':case 's':if(snake.position!=up){snake.position=down;}break;case 'D':case 'd':if(snake.position!=left){snake.position=right;}break;}
}/*在画食物之前要初始化食物,先让食物产生*/
//食物详细出如今哪里,就是食物坐标的疑问,咱们选用让它随机产生
void initfood()
{food.fdxy.x = rand()%80*10; //让食物随机产生food.fdxy.y = rand()%60*10;food.flag =1; //1示意食物存在//须要留意的是,食物不能出如今蛇身上for(int i=0;i<snake.snakenum;i++){if(food.fdxy.x==snake.snakexy[i].x && food.fdxy.y == snake.snakexy[i].y){food.fdxy.x = rand()%80*10; //让食物随机产生food.fdxy.y = rand()%60*10;food.flag =1; //1示意食物存在}}
}//画食物
/*画一个矩形的食物,食物的色彩随机产生*/
void drawfood()
{setlinecolor(BLACK); // 设置以后线条色彩setfillcolor(RGB(rand()%255,rand()%255,rand()%255)); // 设置以后填充色彩fillrectangle (food.fdxy.x,food.fdxy.y,food.fdxy.x+10, food.fdxy.y+10); // 画填充矩形(有边框)
}/*吃食物*/
void eatfood()
{if(food.fdxy.x==snake.snakexy[0].x && food.fdxy.y == snake.snakexy[0].y){snake.snakenum++;food.flag=0;food.grade+=10;}
}/*显示分数*/
void ShowGrade()
{//格局化打印char grade[20];sprintf(grade,"grade:%d",food.grade);settextcolor(LIGHTGREEN);settextstyle(25,0,"楷体"); //经常使用这一个函数时,要讲名目属性里的字符集修正为经常使用多字符集,否则会报错outtextxy(650,50,grade);
}HWND hwnd=NULL;
/*蛇的死亡*/
int SnakeDie()
{//撞墙游戏完毕if(snake.snakexy[0].x>800 ||snake.snakexy[0].x<0 ||snake.snakexy[0].y>600 || snake.snakexy[0].y<0){mciSendString("close 1.mp3",0,0,0);MessageBox(hwnd,"撞墙了,游戏完毕","gameover",MB_OK);return 1;}//蛇吃自己游戏完毕for(int i=1;i<snake.snakenum;i++){if(snake.snakexy[0].x==snake.snakexy[i].x && snake.snakexy[0].y==snake.snakexy[i].y) //这里特意要留意一下,这里的逻辑相关是且不是或{ //否则会出错mciSendString("close 1.mp3",0,0,0);MessageBox(hwnd,"自杀了,游戏完毕","gameover",MB_OK);return 1;}}return 0;
}void main()
{srand((unsigned int)time(NULL)); //随机函数收获initgraph(800,600); //初始化图形界面setbkcolor(RGB(128,138,135)); //设置背风景彩cleardevice(); //用背风景清空屏幕mciSendString("open 1.mp3",0,0,0); //该函数须要蕴含两个头文件mciSendString("play 1.mp3 repeat",0,0,0); //该函数须要蕴含两个头文件initSnake();drawSnake();while(1){cleardevice(); //用背风景清空屏幕movesnake();drawSnake();if(_kbhit()) //假设有按键按下,相当于一个按键检测函数{KeyControl();}if(food.flag==0){initfood();} drawfood();eatfood();ShowGrade();if(SnakeDie()){break; //假设蛇死亡,则分开循环,游戏完毕}Sleep(100);}}
客服邮箱:kefu@itcaiji.cn
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!