上一节我们已经实现了用C语言的代码来编写一个基本的贪吃蛇游戏,但是界面比较丑陋,这一节,咱们利用eaxyX库来载入图片,优化一下界面。

EasyX 是针对 C++ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。许多同学会问,C语言也有图形界面的函数,为什么要引用第三方的库函数呢,因为在 VC 或VS下进行图形界面编程是比较复杂的,需要用到注册窗口类、建消息循环等等windows编程方面的知识,初学者会受严重打击的,所以我们就用了easyx库来简化咱们的图形界面编程

下面上一下使用easyX库后的效果图

easX库的下载大家可以自行百度,下载完事之后直接安装即可,使用easyX库需要引用#include<graphics.h>的头文件,官网上也有挺多的使用例子,大家可以参考学习

具体代码如下:

#include<graphics.h>
#include <stdio.h>
#include<Windows.h>
#include<conio.h>

struct Snake
{
int x; //每节蛇的x坐标
int y; //每节蛇的y坐标
};
struct Snake snake[600];
int map[30][30]; //二维数组map[][],用来表示游戏地图
//为0时,表示空白,什么都没有
//为1时,表示上下围墙
//为2时,表示左右围墙
//为3时,表示蛇
//为4时,表示食物

int direction=1; //1表示向上,程序开始默认向上
//2表示向下
//3表示向左
//4表示向右
int food_x=15,food_y=6; //食物位置
int score=0; //游戏得分
IMAGE i_wall,i_food,i_snake; //声明3个图片变数

void clear()
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
COORD coord; //定义游标位置结构体,其中包含x y坐标两个变数
coord.X=0; //x=0屏幕最上方
coord.Y=0; //y=0屏幕最左边
SetConsoleCursorPosition(handle,coord);//将游标位置移至屏幕左上角
}

void beginLoad()
{
loadimage(&i_wall,_T(".\wall.jpg"),20,20); //载入四周墙壁的图片
loadimage(&i_food,_T(".\food.jpg"),20,20);//载入食物图片
loadimage(&i_snake,_T(".\snake.jpg"),20,20);//载入蛇的图片
}

void show() //显示界面
{
for(int i=0;i<30;i++) //列印地图
{
for(int j=0;j<30;j++)
{
int x=i*20,y=j*20;
switch(map[i][j])
{
case 0: break; //0代表空格,什么也不列印
case 1: putimage(x,y,&i_wall);break; //将图片载入到界面上
case 2: putimage(x,y,&i_wall);break;
case 3: putimage(y,x,&i_snake);break;
case 4: putimage(y,x,&i_food);break;
}
}
}
}

void init() //初始化地图
{
int i,j;
for(i=0;i<30;i++)
for(j=0;j<30;j++)
map[i][j]=0; //初始化二维数组,全部置为0

for(i=0;i<30;i++)
for(j=0;j<30;j++)
{
if(i==0||i==29)
map[i][j]=1; //赋值上下围墙 ----------
if(j==0||j==29)
map[i][j]=2; //赋值左右围墙|||||||||||
}

snake[0].x=15;
snake[0].y=15;
map[snake[0].x][snake[0].y]=3; //利用变数在地图中间初始化蛇身
map[food_x][food_y]=4; //初始化食物位置,随便定义了一个位置
show();
}

void move() //响应键盘输入,控制蛇的移动
{
map[snake[score].x][snake[score].y]=0;//将最后一节赋值为0

if(kbhit())
{
char c;
c=getch();
switch(c)
{
case w:direction=1; break; //按w键,蛇向上移动
case s:direction=2; break; //按s键,蛇向下移动
case a:direction=3; break; //按a键,蛇向左移动
case d:direction=4; break; //按d键,蛇向右移动
default: break;
}
}

for(int i=score;i>0;i--)
{
snake[i].x=snake[i-1].x;
snake[i].y=snake[i-1].y;
map[snake[i].x][snake[i].y]=3;
}

switch(direction) //根据direction值,改变蛇的坐标
{
case 1:snake[0].x--; break;
case 2:snake[0].x++; break;
case 3:snake[0].y--; break;
case 4:snake[0].y++; break;
default:break;
}
map[snake[0].x][snake[0].y]=3; //更新地图,将蛇的新位置赋值为3
}

void ishit()
{
if(snake[0].x==food_x&&snake[0].y==food_y)//判断蛇头位置是否与食物位置相重合
{
score++; //得分加1
//如果随机生成的食物位置与围墙或蛇体或墙体重合,则循环再次随机生成食物位置
while(map[food_x][food_y]!=0)
{
food_x=rand()%29+1; //随机在1-19的位置产生食物
food_y=rand()%29+1; //随机在1-39的位置产生食物
}
map[food_x][food_y]=4; //在地图上显示食物
}
//判断蛇头位置是否与墙的位置重合
if(snake[0].x==0||snake[0].x==29||snake[0].y==0||snake[0].y==29)
{
system("pause"); //暂停程序
closegraph();
exit(0); //退出程序
}
}

void main()
{
init();
beginLoad();
initgraph(600,600);
while(1)
{
cleardevice(); //调用自定义的清屏函数
move();
show();
ishit();
Sleep(100); //睡眠函数,使程序暂停0.5秒,防止运行太快
}
}

其中wall.jpg,food.jpg,snake.jpg为三个资源图片,需要与本程序文件.cpp放到一个文件夹里,如果不在一个文件夹,需要自行修改图片文件的路径。

以上关于贪吃蛇的游戏我们就编写完毕了,但是还有许多小细节需要大家整改,如

(1)蛇正在向上运动的时候,正常我们是不能直接控制蛇向下运动的

(2)虽然定义了记录分数的变数,但是没有在屏幕上显示出来

(3)图片美化度台low,大家可以自行换自己想要的图片

这个程序包含了用C语言编写游戏的主要思路

(1)建立游戏地图

(2)通过清屏形成动画效果

(3)使用键盘滑鼠控制程序

(4)多个函数,每个函数实现单独功能

大家可以慢慢的理解


推荐阅读:
相关文章