Linux下基于SDL库贪吃蛇游戏

  SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS X等)的应用软件。现SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

1.效果展示



2.绘制蛇身函数

/*绘制蛇身*/
static void SDL_DrawSnake(int x,int y,int stat)
{SDL_Rect rect;rect.x=x;rect.y=y;rect.w=20;rect.h=20;if((x>800-20 || y>480-20) || (x<0 || y<100))//判断是否撞墙{return ;}if(stat)/*1表示绘制*/{SDL_RenderCopy(render,sdltext,NULL,&rect);}else SDL_RenderFillRect(render,&rect);/*0表示清空*/
}

3.绘制食物函数

/*绘制食物*/
static void SDL_Drawfood(int x,int y,int stat)
{SDL_Rect rect;rect.x=x;rect.y=y;rect.w=15;rect.h=15;if(stat)/*1表示绘制*/{SDL_RenderCopy(render,food_sdltext,NULL,&rect);}else SDL_RenderFillRect(render,&rect);/*0表示清空*/
}

4.判断是否碰到墙和蛇身函数

/*判读蛇头是否咬到自己或者碰到墙壁*/
static int SDL_GetSnakedeath(struct SNAKE *buff,int cnt)
{int i=0;int x=buff[cnt-1].x;int y=buff[cnt-1].y;if((x>800-20 || y>480-20) || (x<0 || y<100))//判断是否撞墙{return 1;}for(i=0;i<cnt-1;i++){if(x==buff[i].x && y==buff[i].y){printf("i=%d\n",i);return 1;}}return 0;
}

5.移动蛇身函数

/*******************动态移动蛇身********************************/
static void Snake_Move(int x,int y)
{int i=0;SDL_DrawSnake(snake_info[0].x,snake_info[0].y,0);//清除蛇尾for(i=0;i<node_cnt-1;i++)//节点往前偏移{snake_info[i].x= snake_info[i+1].x;snake_info[i].y=snake_info[i+1].y;}/*蛇头节点坐标*/snake_info[node_cnt-1].x=x;  snake_info[node_cnt-1].y=y;SDL_DrawSnake(snake_info[node_cnt-1].x,snake_info[node_cnt-1].y,1);//显示蛇头节点
}

6. 获取方向键和游戏开始函数

/*******************控制方向,判断游戏是否结束********************/
int SnakeGameStart(void)
{SDL_Surface *text1_surface;SDL_Texture * texture;SDL_Rect dstrect;static int start_stop=0;/*暂停与开始*/int count=0;int x=0;int y=120;int stat=0;int  food_x,food_y;char buff[20];SDL_Rect rect={0,100,800,380};SDL_RenderFillRect(render,&rect);//创建蛇身1snake_info[node_cnt].x=x;snake_info[node_cnt].y=y;node_cnt++;//创建蛇身2snake_info[node_cnt].x=x+20;snake_info[node_cnt].y=y; node_cnt++;snake_info[node_cnt].x=x+20*2;snake_info[node_cnt].y=y; //保存蛇头坐标x=snake_info[node_cnt].x;y=snake_info[node_cnt].y;node_cnt++;SDL_DrawSnakebody(snake_info,node_cnt,1);//绘制蛇身//生成实物坐标food_x=((rand()%800)/20)*20;food_y=((rand()%380)/20)*20+100;SDL_Drawfood(food_x,food_y,1);bool quit= true;SDL_Event event;/*获取事件*/int key_value=4;int res=0;while(quit){while(SDL_PollEvent(&event)){if(event.type==SDL_QUIT){quit=false;continue;}if(event.type==SDL_KEYDOWN)//键盘事件{//printf("key=%d\n",event.key.keysym.sym);if(event.key.keysym.sym==SDLK_UP)key_value=1;else if(event.key.keysym.sym==SDLK_DOWN)key_value=2;else if(event.key.keysym.sym==SDLK_LEFT)key_value=3;else if(event.key.keysym.sym==SDLK_RIGHT)key_value=4;else if(event.key.keysym.sym==SDLK_q)key_value=5;/*退出*/else if(event.key.keysym.sym==SDLK_SPACE)/*空格键*/{start_stop=!start_stop;}else if(event.key.keysym.sym==SDLK_EQUALS)/*加速*/{if(movi_speed>100)movi_speed-=100;}else if(event.key.keysym.sym==SDLK_MINUS)/*减速*/{if(movi_speed<600)movi_speed+=100;}}}if(snake_info[node_cnt-1].x==food_x && snake_info[node_cnt-1].y==food_y)//判断是否吃到食物{count+=5;snprintf(buff,sizeof(buff),"%d",count);/*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,buff,color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=80+235;/*显示的起始位置*/dstrect.y=25;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderFillRect(render,&dstrect);SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*/node_cnt++;if(stat&1<<0 || stat&1<<1)//向上或向下时y+5{snake_info[node_cnt].x=food_x;snake_info[node_cnt].y=food_y+20; }else //向左或向右时{snake_info[node_cnt].x=food_x+20;snake_info[node_cnt].y=food_y; }food_x=((rand()%800)/20)*20;while(1)//保证重新生成的实物不再蛇身上{if(SDL_GetSnakeFoodX(food_x,node_cnt)==0)break;if(food_x<780)food_x+=20;else food_x=0;}food_y=((rand()%380)/20)*20+100;while(1){if(SDL_GetSnakeFoodY(food_y,node_cnt)==0)break;if(food_y<460)food_y+=20;else food_y=100;}SDL_Drawfood(food_x,food_y,1);}if(start_stop){continue;/*暂停*/}switch(key_value){case UP://上 stat&=~(0x3<<2);//清除左右标志 if(stat&1<<1){y+=20;}//向下时不能直接向上,保持向下else{stat|=1<<0;//向上y-=20;}Snake_Move(x,y);break;case DOWM://下stat&=~(0x3<<2);//清除左右标志 if(stat&1<<0){y-=20;}//在向上时不能直接向下,保持向下else{stat|=1<<1;//向下标志位y+=20;}Snake_Move(x,y); break;case LEFT://左stat&=~(0x3<<0);//清除上下标志  if(stat&1<<3){x+=20;}//向右时不能直接向左,保持向右else{stat|=1<<2;//向左x-=20;   }Snake_Move(x,y);   break; case RIGHT://右 stat&=~(0x3<<0);//清除上下标志  if(stat&1<<2){x-=20; }//向左时不能直接向右,保持向左else{stat|=1<<3;x+=20;      }Snake_Move(x,y);break;   case QUIT:{node_cnt=0;/*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"正在退出游戏,请稍等。。",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=480/2-text1_surface->h/2;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderFillRect(render,&dstrect);SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*/SDL_RenderPresent(render);quit=false;SDL_Delay(2000);res= 2;quit=false;} break;    }if(SDL_GetSnakedeath(snake_info,node_cnt)){node_cnt=0;res= 1;/*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"游戏结束!",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=480/2-text1_surface->h/2-30;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderFillRect(render,&dstrect);SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*//*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"请按 Space 重新开始游戏 ",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=480/2-text1_surface->h/2+30;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*/SDL_RenderPresent(render);quit=false;continue;}SDL_RenderPresent(render);SDL_Delay(movi_speed);}return res;
}

7.主函数

int main(int argc,char *argv[])
{SDL_Init(SDL_INIT_VIDEO);SDL_Window *window=SDL_CreateWindow("SDL test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,480,SDL_WINDOW_SHOWN);/*创建渲染器*/render=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);/*设置透明度*/SDL_SetRenderDrawBlendMode(render,SDL_BLENDMODE_BLEND);/*设置渲染器颜色*/SDL_SetRenderDrawColor(render, 255, 255, 255, 255);/*清空渲染器*/SDL_RenderClear(render);SDL_SetRenderDrawColor(render, 255,0, 0, 255);int i=0;for(i=0;i<3;i++){SDL_RenderDrawLine(render,0,96+i,800,96+i);}SDL_SetRenderDrawColor(render, 255, 255, 255, 255);SDL_RenderPresent(render);surface=IMG_Load("bg6.png");sdltext=SDL_CreateTextureFromSurface(render,surface);food_surface=IMG_Load("food.jpg");food_sdltext=SDL_CreateTextureFromSurface(render,food_surface);/*TTF初始化*/TTF_Init();/*打开字库*/ttffont=TTF_OpenFont("simkai.ttf",50);if(ttffont==NULL){printf("simkai.ttf open failed\n");return 0;}/*创建字体显示表面*/SDL_Surface *text1_surface=TTF_RenderUTF8_Blended(ttffont,"当前得分:",color);/*创建纹理*/SDL_Texture * texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/SDL_Rect dstrect;dstrect.x=80;/*显示的起始位置*/dstrect.y=25;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*//*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"Space 开始/暂停 ",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=150;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*//*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"+/- 移速 ",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=210;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*//*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"Q 退出",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=270;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*//*创建字体显示表面*/text1_surface=TTF_RenderUTF8_Blended(ttffont,"贪吃蛇小游戏",color);/*创建纹理*/texture=SDL_CreateTextureFromSurface(render,text1_surface);/*将surface拷贝到渲染器*/dstrect.x=800/2-text1_surface->w/2;/*显示的起始位置*/dstrect.y=330;/*显示的起始位置*/dstrect.w=text1_surface->w;/*显示的宽度*/dstrect.h=text1_surface->h;/*显示的高度*/SDL_RenderCopy(render,texture,NULL,&dstrect);SDL_FreeSurface(text1_surface);/*释放surface*/SDL_DestroyTexture(texture);/*释放纹理*/SDL_RenderPresent(render);int stat=0;bool quit= true;SDL_Event event;/*获取事件*/
AA:quit= true;while(quit){while(SDL_PollEvent(&event)){if(event.type==SDL_QUIT){quit=false;continue;}if(event.type==SDL_KEYDOWN)//键盘事件{if(event.key.keysym.sym==SDLK_q){quit=false;continue;}else if(event.key.keysym.sym==SDLK_SPACE){quit=false;stat=1;continue;}}}}if(stat){stat=0;if(SnakeGameStart()==1)goto AA;}SDL_FreeSurface(surface);SDL_DestroyRenderer(render);SDL_DestroyWindow(window);/*销毁窗口*/SDL_Quit();/*关闭SDL*/return 0;
}

8. Makefile文件

CFLAGS =-I/home/wbyq/src_pack/SDL2-2.0.14/_install/include -I/home/wbyq/src_pack/SDL2-2.0.14/_install/include/SDL2 -L/home/wbyq/src_pack/SDL2-2.0.14/_install/lib
CFLAGS +=-L/home/wbyq/src_pack/SDL2_image-2.0.5/_install/lib -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include/SDL2CFLAGS +=-I/home/wbyq/src_pack/SDL2_ttf-2.0.15/_install/include/SDL2 -L/home/wbyq/src_pack/SDL2_ttf-2.0.15/_install/lib
CFLAGS+=-lSDL2 -lpthread -lm -ldl -lSDL2_image -lSDL2_ttf
app:gcc sdl_test.c  $(CFLAGS)

SDL2.0库编译参考:SDL2.0
SDL_ttf库编译参考:SDL_ttf

Linux下基于SDL库贪吃蛇游戏相关推荐

  1. linux贪吃蛇c程序,Linux环境下C语言实现贪吃蛇游戏

    Linux环境下C语言实现贪吃蛇游戏 [liul@test snake]$ more snake.c #include #include #include #include #include #def ...

  2. 基于EasyX的贪吃蛇游戏

    基于EasyX的贪吃蛇游戏 一.预备知识 二.游戏逻辑 1.贪吃蛇元素 2.贪吃蛇规则 三.游戏设计 1.地图设计 2.移动设计 3.速度设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...

  3. python贪吃蛇设计目标_基于 pygame 设计贪吃蛇游戏

    基于 pygame 设计贪吃蛇游戏 贪吃蛇游戏通过玩家控制蛇移动,不断吃到食物增长,直到碰到蛇身或边界游戏结束.其运行效果如下所示: 游戏开始时,先导入可能需要用到的包. import time im ...

  4. 基于React的贪吃蛇游戏的设计与实现

    代码地址如下: http://www.demodashi.com/demo/11818.html 贪吃蛇小游戏(第二版) 一年半前层用react写过贪吃蛇小游戏https://github.com/c ...

  5. 基于HTML5的贪吃蛇游戏的设计与实现

    基于HTML5的贪吃蛇游戏的设计与实现 功能要求: 贪吃蛇游戏是一款经典的单机休闲游戏,玩家通过上下左右按键控制蛇头的移动方向使其向指定方向前进,并吃掉随机位置上产生食物来获得分数.每吃掉一次食物,贪 ...

  6. linux 下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inter ...

  7. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  8. linux下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术  实时传输协议(Real-time Transport Protocol,PRT)是在 Inte ...

  9. linux怎么编写弹球游戏,Linux下利用curses库实现弹球游戏.docx

    #define TOP #define TOP 0/*当前屏幕的最上边 */ Linux 下利用 curses 库实现弹球游戏 #include #include #include #define R ...

最新文章

  1. mxnet基础到提高(13)--Activation激活函数
  2. Redis高级特性及优化
  3. Codeforces Round #260 (Div. 1) C. Civilization(dfs+并查集)
  4. Fiori UI上创建的note和web client UI上note的对应关系
  5. OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置
  6. 李迟2021年6月知识总结
  7. 浅谈FFT(快速博立叶变换)学习笔记
  8. 使用脚本把360极速浏览器修改为极速模式
  9. python开发出来的crm系统_关于python开发CRM系统
  10. 有氧运动存在哪些误区
  11. ACL流量控制工具-- 王贝的学习笔记
  12. dxf怎么用cad打开?办公常备
  13. 做测试为什么要掌握mysql_软件测试工作要掌握的知识
  14. 计算广告CTR预估系列(十)--AFM模型理论与实践
  15. ubuntu系统制作usb启动盘
  16. 模糊集合和隶属度函数--AForge.NET框架的使用(一)
  17. 教你如何提取图片中的文字?
  18. lcd命令 linux,嵌入式Linux裸机开发(十五)——LCD
  19. codevs 2627 村村通
  20. 无任何网络提供程序接受指定的网络路径”问题的几个解决方法

热门文章

  1. 2022年大数据开发实习面经总结,已拿顺丰、哔哩哔哩offer
  2. 移动网络打不开网页可以上微信,终于解决了。
  3. U盘装Win7系统,找不到任何设备驱动程序
  4. PhotoZoom Pro中文免费版电脑版下载V.2020.6 无损放大图片
  5. GeForce RTX 30:AV1解码迎来视频内容的新时代
  6. microsoft office visio 2007 安装过程中出错的解决(直接看后面)
  7. layui的轮播图片自适应大小_解决Layui 表格自适应高度的问题
  8. 复杂美公司Chain33区块链开发
  9. Python爬虫实战项目案例——爬取微信朋友圈
  10. 全息干涉图补零尺寸与三种重构方法重建像间的关系研究