千家信息网

怎么用C++实现贪吃蛇游戏

发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,这篇文章给大家分享的是有关怎么用C++实现贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏
千家信息网最后更新 2024年09月25日怎么用C++实现贪吃蛇游戏

这篇文章给大家分享的是有关怎么用C++实现贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。 听起来有点复杂,其实就是下面这个样子: 基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 GamesDBase 的介绍。 Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏--Snake。

我们今天就来自己写一个游戏《贪吃蛇》

其实这个项目很早就想和大家分享了,但是鉴于这个比较简单,当时觉得没必要,但近期有小伙伴私信我说想要贪吃蛇的项目源码,我就来满足小伙伴们的要求,大家一定要好好看好好学哦!

行吧,我们现在就开始吧!!!

首先还是、还是我们的老朋友结构体(我们的食物以及蛇)

typedef struct pointXY{        int x;        int y;}MYPOINT;HWND hwnd = NULL; //蛇struct mySnake{        int num;        MYPOINT xy[MAX];        char postion;              //表示方向,标记}snake; //食物struct myFood{        MYPOINT foodxy;        int flag;        int eatGrade;}food;

接下来便是初始化了,这也是我们的老伙计了,再有就是绘制这条蛇以及食物的函数

//1.初始化蛇void initSnake(){        snake.xy[2].x = 0;        snake.xy[2].y = 0;         snake.xy[1].x = 10;        snake.xy[1].y = 0;         snake.xy[0].x = 20;        snake.xy[0].y = 0;         snake.num = 3;        snake.postion = right;         food.flag = 0;}//2.绘制蛇void drawSnake(){        for (int i = 0; i < snake.num; i++)        {                setlinecolor(RED);                setfillcolor(GREEN);                fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);        }}//初始化食物void  initFood(){        //0,63    630   640          //0,47    470   480        food.foodxy.x = rand() % 64 * 10;  //只能是10的整数倍,蛇头才能对齐食物        food.foodxy.y = rand() % 48 * 10;        food.flag = 1;        //食物不能出现在蛇身上        for (int i = 0; i < snake.num; i++)        {                if (food.foodxy.x == snake.xy[i].x&&food.foodxy.y == snake.xy[i].y)                {                        food.foodxy.x = rand() % 64 * 10;  //只能是10的整数倍,蛇头才能对齐食物                        food.foodxy.y = rand() % 48 * 10;                }        }}//绘制食物void drawFood(){        fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10);}

现在是蛇的移动函数,蛇要怎么走,千万不要一下头朝前,一下屁股朝前,不要闹笑话了

//3.移动蛇void moveSnake(){        //除了第一节之外,后面的坐标都是前一节坐标        for (int i = snake.num - 1; i > 0; i--)        {                snake.xy[i].x = snake.xy[i - 1].x;                snake.xy[i].y = snake.xy[i - 1].y;        }        //蛇头怎么走,要根据方向标志去做移动        switch (snake.postion)        {        case right:                snake.xy[0].x += 10;                break;        case left:                snake.xy[0].x -= 10;                break;        case down:                snake.xy[0].y += 10;                break;        case up:                snake.xy[0].y -= 10;                break;        }  }

项目重点,如何去控制我们的蛇,之前是鼠标控制,那键盘控制该怎么去写呢,看好了

//4.按键用户:人玩蛇void keyDown(){        static char userkey = '\0';    //VC  getch不需要加下划线        //userkey=_getch();             //不可见输入        //自己生成按键        switch (snake.postion)        {        case right:        case left:                if (food.foodxy.y >= snake.xy[0].y)                {                        userkey = 80;                }                else  if (food.foodxy.y= snake.xy[0].x)                {                        userkey = 77;                }                else  if (food.foodxy.x < snake.xy[0].x)                {                        userkey = 75;                }                break;        }        switch (userkey)        {        case 'w':        case 'W':        case 72:   //上                if (snake.postion != down)                {                        //蛇往上走,你要排除掉蛇本来是朝下                        snake.postion = up;                }                break;        case 's':        case 'S':        case 80:   //下                if (snake.postion != up)                {                        snake.postion = down;                }                break;        case 'a':        case 'A':        case 75:   //左                if (snake.postion != right)                {                        snake.postion = left;                }                break;        case 'd':        case 'D':        case 77:   //右                if (snake.postion != left)                {                        snake.postion = right;                }        }}

接下来是我们的老判断函数了,蛇吃到食物会怎么样以及怎么判断蛇的死亡,理清逻辑

//蛇吃食物void eatFood(){        if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y)        {                snake.num++;                food.eatGrade += 10;                food.flag = 0;        }}//蛇死亡判断int snakeDie(){        //显示分数        char grade[100] = { 0 };        sprintf(grade, "%d", food.eatGrade);        setbkmode(TRANSPARENT);        settextcolor(RED);        outtextxy(580, 20, "分数:");          //loadimage           outtextxy(620, 20, grade);            //        //判断蛇是否死亡         //撞墙        if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)        {                MessageBox(hwnd, "游戏结束!", "撞墙死亡!", 0);                return 1;        }        //撞自己        for (int i = 1; i < snake.num; i++)        {                if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y)                {                        MessageBox(hwnd, "游戏结束!", "撞自己!", 0);                        return 1;                }        }        return 0;}

最后是我们的主函数,这我就不说了

int main(){        srand((unsigned int)time(NULL));        hwnd=initgraph(640, 480);        setbkcolor(WHITE);        cleardevice();        initSnake();        while (1)        {                cleardevice();          //刷掉路径                if (food.flag == 0)                {                        initFood();                }                drawFood();                drawSnake();                if (snakeDie())                {                        break;                }                eatFood();                moveSnake();                Sleep(100);                     //控制速度                //while (_kbhit()) //kbhit() 存在按键操作,返回非零                //{                //      keyDown();                //}                keyDown();        }        closegraph();        printf("GameOver!!!");        system("pause");        return 0;}

感谢各位的阅读!关于"怎么用C++实现贪吃蛇游戏"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0