首页 > 文章资讯 > 新闻资讯
这么丝滑的蛇蛇你做过吗?四步即可完成C语言超丝滑贪吃蛇
更新时间:2022-04-25 17:00:15 作者:云寺手游
1 贪吃蛇效果展示

前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片、音乐,不能做出拥有自己风格的程序)学起来比较乏味,很难坚持下去。所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,做一些好玩的,超丝滑的贪吃蛇


2 背景知识

开发贪吃蛇小游戏,让初学者也能感受界面的魅力。做的不是很完善,希望大家可以自己动手完善它表白程序设计原理:

第一步,我们需要一张地图,图形库初始化的窗口是自带坐标的(左上角为0,0)。

第二步,我们需要一条蛇,这条蛇由蛇头和蛇身组成(这里我们初始化三节蛇)。

第三步,我们需要食物,并且在蛇吃掉食物之后将蛇的身体变长,而且重新生成一个食物。

第四步,蛇需要移动,这应该是最难实现的(实现蛇身坐标的传值,除蛇头以外,每一节蛇的坐标都是上节蛇的上一次运动之前的坐标,有点绕~)。

第五步,我们需要能用键盘控制蛇的运动方向,这个会和蛇的移动有一些联系。

第六步,蛇撞到墙或者撞到自己的身体就会死亡(判断坐标是否重合就可以)。

3 错误及决绝方案

此程序使用Vs209+easyx开发。刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。相关知识的基础讲解可观看专栏教程:

4. 话不多说上代码4.1 头文件snake.h

我们把一些函数的声明,和结构体的定义放在头文件中:

#ifndef_SNAKE_H_ #define_SNAKE_H_ #include<graphics.h> #include<conio.h> #include<stdio.h> #include<time.h> #defineWIN_WIDTH640//窗口宽高 #defineWIN_HEIGHT480 #defineMAX_SNAKE10000//蛇的最大节数 enumDIR//蛇的方向 { UP, DOWN, LEFT, RIGHT, }; //每一节蛇的位置信息 typedefstruct_Pos { intx; inty; DWORDcolor; }Pos; typedefstructSnake_tlg//蛇的结构体 { intnum; intdir;//蛇的方向 intscore;//分数 intsize;//蛇的宽度和高度 intspeed;//移动速度 Poscoor[MAX_SNAKE]; }Snake; typedefstructFood_tlg { intx; inty; intr; intflag; DWORDcolor; }Food; //画眼睛函数 voidDrawEye(intx,inty); //初始化数据 voidGameInit(); //游戏的绘制 voidGameDraw(); //蛇的移动 voidSnakeMove(); //控制方向 voidKeyControl(); //吃食物 voidEatFood(); //暂停游戏按空格暂停和继续 voidstop(); //定时器 boolTimer(clock_tms); #endif 4.2 实现文件snake.cpp

OK,头文件部分完毕,接下来进入snake.cpp代码编写环节。

#include"snake.h" Snakesnake; Foodfood; //画眼睛函数 voidDrawEye(intx,inty) { setfillcolor(WHITE); solidcircle(x,y,3); setfillcolor(BLACK); solidcircle(x,y,2); } voidGameInit() { srand(GetTickCount()); //初始化蛇 snake.num=10; snake.dir=RIGHT; snake.score=0; snake.size=10; snake.speed=1; snake.coor[0].x=20; snake.coor[0].y=10; for(inti=0;i<snake.num;i++) { snake.coor[i].color=GREEN; } //初始化食物 food.x=rand()%(WIN_WIDTH-10); food.y=rand()%(WIN_HEIGHT-10); food.flag=1; food.r=rand()%3+2; food.color=RGB(rand()%256,rand()%256,rand()%256); } voidGameDraw() { //设置背景颜色 setbkcolor(RGB(191,215,215)); cleardevice(); //画蛇 for(inti=0;i<snake.num;i++) { setfillcolor(snake.coor[i].color); solidcircle(snake.coor[i].x,snake.coor[i].y,snake.size/2); } //画眼睛 inteyewidth=5; switch(snake.dir) { caseUP: caseDOWN: DrawEye(snake.coor[0].x-eyewidth,snake.coor[0].y); DrawEye(snake.coor[0].x+eyewidth,snake.coor[0].y); break; caseLEFT: caseRIGHT: DrawEye(snake.coor[0].x,snake.coor[0].y-eyewidth); DrawEye(snake.coor[0].x,snake.coor[0].y+eyewidth); break; } //画食物 if(food.flag==1) { setfillcolor(food.color); solidcircle(food.x,food.y,food.r); } //显示分数 chartemp[20]=""; sprintf(temp,"分数:%d",snake.score); setbkmode(TRANSPARENT); outtextxy(20,20,temp); } voidSnakeMove() { for(inti=snake.num-1;i>0;i--)//从最后一节蛇开始,每一节蛇都等于前一节蛇的上一次坐标 { snake.coor[i].x=snake.coor[i-1].x; snake.coor[i].y=snake.coor[i-1].y; } //根据方向移动 switch(snake.dir) { caseUP: snake.coor[0].y-=snake.speed; if(snake.coor[0].y+10<=0) { snake.coor[0].y=WIN_HEIGHT; } break; caseDOWN: snake.coor[0].y+=snake.speed; if(snake.coor[0].y-10>=WIN_HEIGHT) { snake.coor[0].y=0; } break; caseLEFT: snake.coor[0].x-=snake.speed; if(snake.coor[0].x+10<=0) { snake.coor[0].x=WIN_WIDTH; } break; caseRIGHT: snake.coor[0].x+=snake.speed; if(snake.coor[0].x-10>=WIN_WIDTH) { snake.coor[0].x=0; } break; } } voidKeyControl() { //使用win32API获取键盘消息 if(GetAsyncKeyState(VK_UP)&&snake.dir!=DOWN) { snake.dir=UP; } if(GetAsyncKeyState(VK_DOWN)&&snake.dir!=UP) { snake.dir=DOWN; } if(GetAsyncKeyState(VK_LEFT)&&snake.dir!=RIGHT) { snake.dir=LEFT; } if(GetAsyncKeyState(VK_RIGHT)&&snake.dir!=LEFT) { snake.dir=RIGHT; } //按A键加速,不按回复初始状态 if(GetAsyncKeyState('A')&&snake.speed==1) { snake.speed=5; } elseif(snake.speed==5) { snake.speed=1; } } voidEatFood() { if(snake.coor[0].x>=food.x-food.r&&snake.coor[0].x<=food.x+food.r&& snake.coor[0].y>=food.y-food.r&&snake.coor[0].y<=food.y+food.r&& food.flag==1) { snake.num+=5; snake.score+=10; food.flag=0; //每一节的颜色都要初始化 for(inti=snake.num-5;i<snake.num;i++) { snake.coor[i].color=food.color; } } if(food.flag==0) { food.x=rand()%(WIN_WIDTH-10); food.y=rand()%(WIN_HEIGHT-10); food.flag=1; food.r=rand()%10+3; food.color=RGB(rand()%256,rand()%256,rand()%256); } } voidstop() { if(_kbhit()&&_getch()==32) { while(getch()!=32); } } boolTimer(clock_tms) { staticclock_tt=clock(); if(clock()-t>ms) { t=clock(); returntrue; } returnfalse; } 4.3 测试文件main.cpp

最后我们一起来测试一下吧

#include"snake.h" intmain() { //创建一个图形窗口 initgraph(WIN_WIDTH,WIN_HEIGHT); GameInit(); BeginBatchDraw();//① while(1) { if(Timer(10)) { SnakeMove(); } GameDraw(); FlushBatchDraw();//② EatFood(); KeyControl(); stop(); } EndBatchDraw();//③①②③为双缓冲绘图防止闪屏代码 //关闭图形窗口 closegraph(); return0; }
猜你喜欢
最新资讯