贪吃蛇游戏

前段时间自己试着做的小游戏,很简陋。制作过程中,既要考虑到蛇的移动,食物的生成坐标,还要考虑蛇在移动过程中会发生的各种情况,以及结束界面的的生成。

背景音乐凭自己喜好添加,不建议网易云下载的音乐,有时候会播放不出来。可以在别的音乐平台下载,音质不要太好,也不要太差。

最重要的一点,就是要结合图形库Easxy。

图形库下载链接:https://easyx.cn/

话不多说,请看如下代码:

/*
      文件名称:main.cp[p
      程序名称: 贪吃蛇
      作者:muyiyueniao 
      时间:2019,6.8
   */

#include<stdio.h>
#include<graphics.h>  //图形库的头文件
#include<mmsystem.h>     //多媒体设备接口 音乐视频 麦克风
#pragma comment(lib,"winmm.lib")
#include<time.h>
#include<windows.h>
#include<conio.h>
#define SNAKELENGTH 100  //蛇的最大长度
#define SNAKESIZE 10         //定义宏 ,蛇的大小

void InitSnake();
void DrawSnake();
void MoveSnake();
void ChangeSnake();
void DrawFood();
void CoorFood();
int EatFood();
void BeakSnake();
void OverSnake();


typedef enum ch
{
    up = 72,
    down=80,
    left=75,
    right=77
}CH;

//定义坐标的结构体
struct Coor
{
    int x;
    int y;
}COOR;

//定义蛇的结构体
struct Snake
{
    Coor szb[SNAKELENGTH];//蛇每一节的坐标
    int n; //蛇的当前长度
    CH ch;  //蛇的方向
}SNAKE;

//定义食物的结构体
struct food
{
    Coor Fzb;
    int flag;   //标志   flag=0  代表食物没有被吃,  flag=1表示食物被吃
}FOOD;
  

//主函数
int main()
{
    int flag=0;
    InitSnake();
    while (1)
    {
        while (!_kbhit())
        {
            if (flag == 0)
            {
                CoorFood();
            }
            DrawFood();
            BeakSnake();
            MoveSnake();
            flag = EatFood();
            Sleep(100);   //延时100毫秒
        }
        ChangeSnake();
        
        
    }
    return 0;
}


//初始化函数
void InitSnake()
{
    initgraph(640, 480);  //初始化窗口
        //circle(320,240,160);  ////rectangle(160,80,480,400);  //矩形

    mciSendString(L"open Horizon.mp3 alias bk",0,0,0);
    mciSendString(L"play bk repeat",0,0,0); 
    


    setbkcolor(RGB(220, 120, 150));  //设置背景颜色
    cleardevice();  //刷新
    //画图
    rectangle(0, 0, 10, 10);      //初始化一条蛇
    //蛇的坐标
    SNAKE.szb[0].x = 0;   //第一节蛇的坐标
    SNAKE.szb[0].y = 0;
    SNAKE.n = 1;         //蛇的初始结束
    SNAKE.ch = right;     //蛇初始向右    

    FOOD.flag = 0;
}

//在界面上画蛇
void DrawSnake()   //n   10    n-1 n-2 n-4.....1直到第一节
{
    for (int i = SNAKE.n-1; i >= 0; i--)
    {
        rectangle(SNAKE.szb[i].x, SNAKE.szb[i].y,
            SNAKE.szb[i].x + SNAKESIZE, SNAKE.szb[i].y + SNAKESIZE);
    }
    setcolor(RGB(220, 120, 150));      //走过的路径与背景色相同,故看不见
    rectangle(SNAKE.szb[SNAKE.n].x, SNAKE.szb[SNAKE.n].y,
              SNAKE.szb[SNAKE.n].x + SNAKESIZE, 
              SNAKE.szb[SNAKE.n].y + SNAKESIZE);

    setcolor(RGB(255, 255, 255));    //蛇的第一节
    rectangle(SNAKE.szb[SNAKE.n-1].x, SNAKE.szb[SNAKE.n-1].y,
              SNAKE.szb[SNAKE.n-1 ].x + SNAKESIZE,
              SNAKE.szb[SNAKE.n-1 ].y + SNAKESIZE);

}
//让蛇移动起来 
void MoveSnake()
{
    for (int i = SNAKE.n; i > 0; i--)   //蛇移动后它的节数位置互换
    {
        SNAKE.szb[i].x = SNAKE.szb[i - 1].x;
        SNAKE.szb[i].y = SNAKE.szb[i - 1].y;
    }
    switch (SNAKE.ch)    //方向
    {
    case up:   //不是按键  是方向  在蛇往上下左右的过程中一个处理的数据
        SNAKE.szb[0].y -= SNAKESIZE;
        break;
    case down:
        SNAKE.szb[0].y += SNAKESIZE;
        break;
    case left:
        SNAKE.szb[0].x -= SNAKESIZE;
        break;
    case right:
        SNAKE.szb[0].x += SNAKESIZE;
        break;
    }
    DrawSnake();
    
    
}

//接受键盘信息
void ChangeSnake()    //控制蛇的方向
{
    int move;
    //getchar()   getch()  getchar()需要按下回车键,getch()不需要按回车键,直接接收到键盘输入的信息
    move = _getch();

    
    switch (move)  //move是整型变量,用来接收键盘信息。
    {
    case up:  //向上键
        if (SNAKE.ch != down)
        {
            SNAKE.ch = up;
        }
        break;

    case down:  //向下键
        if (SNAKE.ch !=up )
        {
            SNAKE.ch = down;
        }
        break;

    case left:  //向左键
        if (SNAKE.ch != right )
        {
            SNAKE.ch = left;
        }
        break;

    case right:  //向右键
        if (SNAKE.ch != left)
        {
            SNAKE.ch = right;
        }
        break;
    }
}


//放食物
void DrawFood()
{
    setcolor(WHITE);
    roundrect(FOOD.Fzb.x, FOOD.Fzb.y,
        FOOD.Fzb.x + SNAKESIZE,
        FOOD.Fzb.y + SNAKESIZE,10,10);
}

//计算食物的坐标
void CoorFood()
{
    srand(unsigned(time(NULL)));
    FOOD.Fzb.x = rand() % (640 / SNAKESIZE) * SNAKESIZE;
    FOOD.Fzb.y = rand() % (480 / SNAKESIZE) * SNAKESIZE;
    FOOD.flag = 1;//食物没有被吃掉
}


//吃食物
int EatFood()
{
    if (SNAKE.szb[0].x == FOOD.Fzb.x && SNAKE.szb[0].y == FOOD.Fzb.y)
    {
        SNAKE.n++;
        setcolor(RGB(220,120,150));
        roundrect(FOOD.Fzb.x, FOOD.Fzb.y,
            FOOD.Fzb.x + SNAKESIZE,
            FOOD.Fzb.y + SNAKESIZE, 10, 10);
        setcolor(WHITE);
        FOOD.flag = 0;
        return FOOD.flag;
    }
    return 1;

}

//判断是否撞到墙  自己
void BeakSnake()
{
    if (SNAKE.szb[0].x < 0 || SNAKE.szb[0].x>640 ||  
        SNAKE.szb[0].y < 0 || SNAKE.szb[0].y>480)    //撞到墙
    {
        mciSendString(L"close bk", 0, 0, 0);
        OverSnake();
    }
    for (int i = SNAKE.n-2; i >0; i--)
    {
        if (SNAKE.szb[0].x == SNAKE.szb[i].x &&
            SNAKE.szb[0].y == SNAKE.szb[i].y)
        {
            mciSendString(L"close bk", 0, 0, 0);
            OverSnake();
        }
    }
}

void OverSnake()
{
    cleardevice();
    setcolor(BLACK);
    settextstyle(50,0,L"楷体");
    outtextxy(100,70, L"上士闻道,勤而行之");
    outtextxy(100,120,L"中士闻道,若存若亡");
    outtextxy(100,170,L"下士闻道,吾大笑之");
    Sleep(1000);
    closegraph();
}

 

转载于:https://www.cnblogs.com/muyiyueniao/p/11087585.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值