2018-10-29 23:59:04    2018-10-29 23:59:04   

贪吃蛇 easyx c语言
安装easyx,文件保存为cpp后缀 ```C #include <graphics.h> #include <conio.h> #include <time.h> #include <stdio.h> #include <math.h> #include <windows.h> #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) void init(void);//初始化 void gamebegin(void);//游戏开始 void gameplay(void);//开始游戏 void gameend(void);//游戏借宿 void drawsnake(void);//绘制小蛇 void drawfood(void);//绘制食物 //定义坐标struct struct Point{ int x,y; }; struct Point aps[3871]; //定义界面所有点坐标数组 struct Point snake[3871];//定义蛇身的各个位置的坐标数组 struct Point food[100];//定义食物的各个位置的坐标数组 int apsindex=0; //定义界面所有点坐标数组索引 int snakeindex=0; //定义蛇身的各个位置的坐标数组索引 int foodindex=0; //定义食物的各个位置的坐标数组索引 struct Point snakehead={300,250};//定义蛇头的位置 int snakedirect; //1为上,2为下,3为左,4为右 int snakespeed=1; //设置蛇的速度 int snakelength=3; //初始化蛇的长度 int gamestop=0; //游戏是否结束 int stoptype; //游戏结束原因,值为1,则是撞墙,值为2则为碰到身子 int gamescore=0; //游戏分数 int gamelevel=1; //游戏等级 void main(void){ init(); gamebegin(); gameplay(); gameend(); } //初始化函数 void init(void){ initgraph(1100,600); } //绘制分数 void drawscore(int score){ char s[50]; sprintf(s,"分数:%4d",score); settextstyle(18, 0, _T("黑体")); settextcolor(RGB(255,255,0)); outtextxy(950, 60, s); } //绘制等级 void drawlevel(int level){ char s[50]; sprintf(s,"等级:%4d",level); settextstyle(18, 0, _T("黑体")); settextcolor(RGB(255,255,0)); outtextxy(950, 80, s); } //绘制蛇 void drawsnake(){ setlinecolor(RGB(255,255,255)); setlinestyle(PS_SOLID, 1); for(int i=0;i<snakeindex;i++){ if(i==0){ setfillcolor(RGB(255,0,0)); }else{ setfillcolor(RGB(128,128,0)); } fillrectangle(snake[i].x-5,snake[i].y-5,snake[i].x+5,snake[i].y+5); } } //擦除蛇尾 void earsesnaketail(){ //setlinestyle(PS_SOLID, 0); setlinecolor(RGB(0,128,0)); setfillcolor(RGB(0,128,0)); fillrectangle(snake[snakeindex-1].x-5,snake[snakeindex-1].y-5,snake[snakeindex-1].x+5,snake[snakeindex-1].y+5); } //绘制食物 void drawfood(Point p1){ setlinestyle(PS_SOLID, 1); setfillcolor(RGB(255,255,0)); fillrectangle(p1.x-5,p1.y-5,p1.x+5,p1.y+5); } //生成食物 void genfood(int index=-1){ //生产随机数0~3871 int r=rand()%3872; //判断随机点aps[r]是否和蛇身所在位置是否重合 for(int j=0;j<snakeindex;j++){ if(aps[r].x==snake[j].x&&aps[r].y==snake[j].y){ //如果发生重合,j减一,重新循环一次 j--; //重新生成随机数 r=rand()%3872; } } if(index!=-1){ food[index]=aps[r]; }else{ food[foodindex]=aps[r]; foodindex++; } } //游戏开始 void gamebegin(){ //1 绘制游戏界面 //1.1 设置游戏框 setfillcolor(RGB(0,128,0)); setlinestyle(PS_SOLID, 10); fillrectangle(100,50,900,550); //绘制分数 drawscore(gamescore); //绘制等级 drawlevel(gamelevel); //初始化所有点的坐标 for(int i=110;i<=890;i+=10){ for(int j=60;j<=540;j+=10){ aps[apsindex].x=i; aps[apsindex].y=j; apsindex++; printf("%d,%d ",i,j); } } //初始化小蛇身体数组 for(i=0;i<snakelength;i++){ snake[i].x=snakehead.x-10*i; snake[i].y=snakehead.y; snakeindex++; } //初始化食物的数组 //初始化随机数种子 srand((unsigned)time(NULL)); //绘制小蛇 drawsnake(); //绘制食物 //随机5个食物 for(i=0;i<10;i++){ genfood(); } //画出食物 for(i=0;i<foodindex;i++){ drawfood(food[i]); } //drawfood(); } //方向函数 void toward(struct Point temp){ //判断是否撞墙 if(temp.x<110||temp.x>890||temp.y<60||temp.y>540){ gamestop=1; stoptype=1; } //判断是否蛇头碰到身子 for(int i=0;i<snakeindex;i++){ if(temp.x==snake[i].x&&temp.y==snake[i].y){ gamestop=1; stoptype=2; } } //定义蛇是否迟到食物变量iseat bool iseat=0; //判断是否吃到食物 for(i=0;i<foodindex;i++){ if(food[i].x==temp.x&&food[i].y==temp.y){ iseat=1; //计算游戏分数 gamescore=gamescore+(snakeindex-snakelength+1)*2; if(gamescore>400){ gamelevel=6; }else if(gamescore>300){ gamelevel=5; }else if(gamescore>200){ gamelevel=4; }else if(gamescore>100){ gamelevel=3; }else if(gamescore>10){ gamelevel=2; } genfood(i); drawfood(food[i]); } } Sleep(10); if(iseat){ for(int i=snakeindex;i>0;i--){ snake[i]=snake[i-1]; } snakeindex++; snake[0]=temp; }else{ earsesnaketail(); for(int i=snakeindex;i>0;i--){ snake[i]=snake[i-1]; } snake[0]=temp; } drawsnake(); } //向上 void towardsUp(){ struct Point newhead={snake[0].x,snake[0].y-10}; toward(newhead); } //向下 void towardsDown(){ struct Point newhead={snake[0].x,snake[0].y+10}; toward(newhead); } //向左 void towardsLeft(){ struct Point newhead={snake[0].x-10,snake[0].y}; toward(newhead); } //向右 void towardsRight(){ struct Point newhead={snake[0].x+10,snake[0].y}; toward(newhead); } void gameplay(){ //判断方向键,绘制蛇头的方块的方向,同时在蛇尾去掉方块 //判断方块是否和墙面接触,如果是则游戏结束,否则,继续往最后一次按键方向绘制方块 int dr=0; while(gamestop!=1){ //判断方向键是否为上 if(KEYDOWN(VK_UP)&&dr!=2){ dr=1; } //判断方向键是否为下 if(KEYDOWN(VK_DOWN)&&dr!=1){ dr=2; } //判断方向键是否为左 if(KEYDOWN(VK_LEFT)&&dr!=4){ dr=3; } //判断方向键是否为右 if(KEYDOWN(VK_RIGHT)&&dr!=3){ dr=4; } switch(dr){ case 1: towardsUp(); break; case 2: towardsDown(); break; case 3: towardsLeft(); break; case 4: towardsRight(); break; } //绘制分数 drawscore(gamescore); //绘制等级 drawlevel(gamelevel); switch(gamelevel){ case 1: Sleep(80); break; case 2: Sleep(70); break; case 3: Sleep(60); break; case 4: Sleep(50); break; case 5: Sleep(40); break; case 6: Sleep(20); break; } } } void gameend(){ //绘制结束框 setfillcolor(RGB(255,0,0)); setlinestyle(PS_SOLID, 10); fillrectangle(300,200,700,300); char s[200]; if(stoptype==1){ sprintf(s,"你撞墙了,游戏结束!"); }else if(stoptype==2){ sprintf(s,"你咬到自己了,游戏结束!"); }else{ sprintf(s,"游戏结束!"); } settextstyle(18, 0, _T("黑体")); settextcolor(RGB(255,255,0)); RECT r = {300,200,700,300}; setbkmode(TRANSPARENT); drawtext(s, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); while(1){ Sleep(10000); }; getch(); closegraph(); } ``` ![](https://image.ynotes.cn/18-10-30/5567999.jpg) `下载链接`[贪吃蛇下载](https://image.ynotes.cn/%E8%B4%AA%E5%90%83%E8%9B%87.exe)
阅读 989 评论 0 收藏 0
阅读 989
评论 0
收藏 0