资讯专栏INFORMATION COLUMN

c语言,Easyx实现贪吃蛇

opengps / 1763人阅读

摘要:十函数添加音乐必须加上这个预处理指令总结贪吃蛇游戏的难点就在于蛇身的变化与移动,只要这两个问题解决后其他的都很好想。

一、头文件包含

      #include
      #include //图形处理需要包含的库文件
      #include //windows多媒体接口
      #include   //读取键盘输入
      #include    //随机数种子
      #include   //内存分配

 包含完头文件后进行一些预处理操作:

 #pragma comment(lib,"winmm.lib")//多媒体接口
#define NUM 200;
#define SIZE 10
enum Ch{ up=72,down=80,left=75,right=77} ;   

二、创建蛇与食物的结构体 

直接上代码:

struct pos   蛇身坐标
{
    int x;
    int y;
};
struct snake  
{
    int n;    初始化蛇身长度
    Ch ch;  蛇前进的方向
    pos szb[3265];  蛇的坐标数组
};
struct food
{
    int x;
    int y;
    bool iseat;  判断食物是否被吃
};

创建一个蛇与食物

snake s;
food  f;

 三、游戏的初始化

void gameinit()
{
    srand((unsigned int)time(NULL));//随机数种子,用于随机生成食物
    s.n = 2;  //蛇的初始长度,可以自己设定
    s.ch = right;//蛇的初始方向;
    s.szb[0].x=100;
    s.szb[0].y=100;
    s.szb[1].x = 90;
    s.szb[1].y = 100;//蛇的初始位置坐标
    f.iseat = true;
}

 四、游戏的绘画事件

    cleardevice();  //每次绘画都要进行一次清屏
    setfillcolor(RED); //蛇头颜色
    fillrectangle(s.szb[0].x, s.szb[0].y,
        s.szb[0].x + SIZE, s.szb[0].y + SIZE);//SIZE在预处理是已经定义表示每个蛇身的大小
    for (int i = 0; i < s.n; i++) {
        rectangle(s.szb[i].x, s.szb[i].y,
            s.szb[i].x + SIZE, s.szb[i].y + SIZE);
    } //生成矩形蛇
    setfillcolor(GREEN);//食物颜色
    fillroundrect(f.x, f.y, f.x + SIZE, f.y + SIZE,5,5);//生成圆形食物

五、蛇的移动事件 

void snakemove()
{
    for (int i = s.n - 1; i > 0; i--)
    {
        s.szb[i].x = s.szb[i - 1].x;
        s.szb[i].y = s.szb[i - 1].y;  //通过数组的变换来实现蛇的移动
    }
    switch (s.ch)//ch枚举类型在预处理时已经定义
    {
    case up:
        s.szb[0].y -= SIZE;

        //由于在窗口坐标系中y方向是向下的所以向上移动需要减去一个size
        break;
    case down:
        s.szb[0].y += SIZE;
        break;
    case left:
        s.szb[0].x -= SIZE;
        break;
    case right:
        s.szb[0].x += SIZE;
        break;
    }
}

 六、输入方向******这个方面没什么好解释的大家看代码应该可以看懂。

void changech()
{
    char key;
    key = _getch();
    switch (key)
    {
    case up:
        if (s.ch != down)
            s.ch = up;
        break;
    case down:
        if (s.ch != up)
            s.ch = down;
        break;
    case left:
        if (s.ch != right)
            s.ch = left;
    case right:
        if (s.ch != left)
            s.ch = right;
    }
}

 七、生成食物

void creatfood()
{
    bool flag = false;
    if (f.iseat == true) {
        while (1)
        {
            flag = false;//设定flag判断食物是否与蛇身重合
                f.x = rand() % 68*10;
                f.y = rand() % 48*10;//食物的随机生成
                for (int i = 0; i < s.n; i++)
                {
                    if (f.x == s.szb[i].x && f.y == s.szb[i].y)
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    f.iseat = false;
                    break;
                }

           //上面部分为判断食物是否与蛇身重合
        }
    }
}

八、吃食物 

void eatfood()
{
    if (s.szb[0].x == f.x && s.szb[0].y == f.y)//如果蛇头与食物重合那么食物就被吃掉了
    {
        f.iseat = true;
        s.n++;
    }
}

九、游戏失败的判定 

因为我初始化的窗口为640*480,if判断的范围打击可以根据自己窗口大小设定。

int gameover()
{
    if (s.szb[0].x < 0 || s.szb[0].x>640 || s.szb[0].y < 0 || s.szb[0].y>480)
    {
        return 1;
    }
    for (int i = 1; i < s.n; i++)
    {
        if (s.szb[0].x == s.szb[i].x && s.szb[0].y == s.szb[i].y)
        {
            return 1;
        }
    }
    return 0;
}

十、main函数 

int main()
{
    initgraph(680,480);
    mciSendString(L"open 7895.mp3", 0, 0, 0);
    mciSendString(L"play 7895.mp3", 0, 0, 0);

//添加音乐必须加上这个预处理指令#pragma comment(lib,"winmm.lib")
    int n = 0;
    gameinit();
    while (1) {
        while (!_kbhit())
        {
            snakemove();
            drawgame();
            creatfood();
            eatfood();
            n = gameover();
            if (n)
                break;
            Sleep(100);
        }
        if (n)
            break;
        changech();
    }
    closegraph();
    getchar();
    return 0;
}

 总结:

贪吃蛇游戏的难点就在于蛇身的变化与移动,只要这两个问题解决后其他的都很好想。封面就是运行后的结果。

这也是我第一次写文章,希望大家能够喜欢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122189.html

相关文章

  • 装逼的最高境界---一行js代码完成一个简易版的贪吃游戏

    摘要:有些奇淫技巧玩好的话,就能提升自己的逼格,这不,一行代码实现一个贪吃蛇小游戏就成了装逼到了最高境界嘛代码如下当前浏览器不支持标签游戏结束我不是来装逼的。 有些奇淫技巧玩好的话,就能提升自己的逼格,这不,一行js代码实现一个贪吃蛇小游戏就成了装逼到了最高境界嘛!代码如下: (function(){var s = [41,40],d = 1,f = 43,x,c = document.cr...

    hidogs 评论0 收藏0
  • 装逼的最高境界---一行js代码完成一个简易版的贪吃游戏

    摘要:有些奇淫技巧玩好的话,就能提升自己的逼格,这不,一行代码实现一个贪吃蛇小游戏就成了装逼到了最高境界嘛代码如下当前浏览器不支持标签游戏结束我不是来装逼的。 有些奇淫技巧玩好的话,就能提升自己的逼格,这不,一行js代码实现一个贪吃蛇小游戏就成了装逼到了最高境界嘛!代码如下: (function(){var s = [41,40],d = 1,f = 43,x,c = document.cr...

    vincent_xyb 评论0 收藏0
  • 使用TypeScript和Canvas编写移动端贪吃大作战游戏

    摘要:基本介绍一款移动端贪吃蛇大作战游戏。主要的游戏逻辑有贪吃蛇移动碰撞检测贪吃蛇碰撞碰撞墙壁和吃食物。贪吃蛇的身体如何跟随头部移动需要分为两种情况,在单位时间内贪吃蛇移动一单位长度和贪吃蛇移动多单位长度。 基本介绍 一款移动端贪吃蛇大作战游戏。(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项...

    AlphaWallet 评论0 收藏0
  • 使用TypeScript和Canvas编写移动端贪吃大作战游戏

    摘要:基本介绍一款移动端贪吃蛇大作战游戏。主要的游戏逻辑有贪吃蛇移动碰撞检测贪吃蛇碰撞碰撞墙壁和吃食物。贪吃蛇的身体如何跟随头部移动需要分为两种情况,在单位时间内贪吃蛇移动一单位长度和贪吃蛇移动多单位长度。 基本介绍 一款移动端贪吃蛇大作战游戏。(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项...

    Keagan 评论0 收藏0
  • 不小心用js重做了一遍贪吃

    摘要:基于这个核心重新实现了一次贪吃蛇游戏,并且完善了游戏的关卡设计,效果如下效果预览详细思路分析 贪吃蛇游戏想必没人会感到陌生,这个游戏的js版本在网上也是一搜一大把,今天我要介绍的仍然是如何用js做一个贪吃蛇游戏,但在关键一步,蛇的运动的实现上略有不同。 贪吃蛇的js版本通常用连续的方块元素来实现蛇身,蛇的运动处理一般是这样的,让蛇头向运动方向偏移一格,其后的元素依次移向前一个元素的位置...

    kidsamong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<