贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!
贪吃蛇小程序,主要采用C语言描述,采用数组进行数据存储的图形化操作界面,会涉及一点点C++ 知识(特别少的一点点),但是有C语言基础就够用了,编译器:VS2019,会涉及部分库函数的安装及使用,不过也很简单啦!
效果展示:

看到了这个效果之后,那我们就动手来实现吧!
希望大家都能轻松实现这个项目!另外涉及到的#include <graphics.h>需要额外安装图形库插件easyX哦~
代码如下:
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include "snake.h"int score = 0;
int gamespeed = 100; //蛇运行速度static void Init(void); /*图形驱动*/
static void Close(void); /*图形结束*/
static void Game_interface(void); /*游戏界面*/
static void GameOver(void); /*结束游戏*/
static void GamePlay(void); /*游戏过程*/
static void PrScore(void); /*输出成绩*//*主函数*/
int main(void)
{Init(); Game_interface(); GamePlay(); Close(); return 0;
}/*图形驱动*/
static void Init(void)
{int gd=9,gm=2;initgraph(&gd,&gm," ");cleardevice();
}/* 开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 */
static void Game_interface(void)
{int i;setcolor(LIGHTCYAN); /*setbkcolor(LIGHTGREEN);*/setlinestyle(PS_SOLID,0,1); /*设置线型*/for(i=50;i<=600;i+=10) /*画边框*/{rectangle(i,40,i+10,49); /*上边框*/rectangle(i,451,i+10,460); /*下边框*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边框*/rectangle(601,i,610,i+10); /*右边框*/}
}/* 游戏主函数 */
static void GamePlay(void)
{int i;srand(time(NULL)); /*随机数发生器*/food.yes = 1; /*1表示需要出现新食物,0表示已经存在食物*/snake.life = 0; /*活着*/snake.direction = 1; /*方向往右*/snake.x[0] = 100;snake.y[0] = 100; snake.x[1] = 110;snake.y[1] = 100;snake.node = 2; /*节数*/PrScore(); /*输出得分*/while(1) /*可以重复玩游戏,压ESC键结束*/{while( !kbhit() ) /*在没有按键的情况下,蛇自己移动*/{if(food.yes == 1) /*需要出现新食物*/{food.x = rand()%400 + 60;food.y = rand()%350 + 60;while(food.x%10 != 0) /*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/food.x++;while(food.y%10 != 0)food.y++;food.yes = 0; /*画面上有食物了*/}if(food.yes == 0) /*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x + 10,food.y - 10);}for(i=snake.node-1;i>0;i--) /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1: snake.x[0] += 10;break;case 2: snake.x[0] -= 10;break;case 3: snake.y[0] -= 10;break;case 4: snake.y[0] += 10;break;}/* 从蛇的第四节开始判断是否撞到自己 */for(i=3;i<snake.node;i++){if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0])){GameOver(); /*显示失败*/snake.life = 1;break;}}if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455)) /*蛇是否撞到墙壁*/{GameOver(); /*本次游戏结束*/snake.life = 1; /*蛇死*/}if(snake.life == 1) /*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if((snake.x[0] == food.x) && (snake.y[0] == food.y)) /*吃到食物以后*/{setcolor(BLACK); /*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node] = -20;snake.y[snake.node] = -20;/* 新的一节先放在看不见的位置,下次循环就取前一节的位置 */snake.node++; /*蛇的身体长一节*/food.yes = 1; /*画面上需要出现新的食物*/score += 10;PrScore(); /*输出新得分*/}setcolor(RED); /*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);Sleep(gamespeed);setcolor(BLACK); /*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life == 1) /*如果蛇死就跳出循环*/break;key=getch(); /*接收按键*/if (key == ESC) break; /*按ESC键退出*/switch(key){ case UP:if(snake.direction != 4) /*判断是否往相反的方向移动*/snake.direction = 3;break;case RIGHT:if(snake.direction != 2)snake.direction = 1;break;case LEFT:if(snake.direction != 1)snake.direction = 2;break;case DOWN:if(snake.direction != 3)snake.direction = 4;break;}}/*endwhile(1)*/
}/*游戏结束*/
static void GameOver(void)
{cleardevice();PrScore();setcolor(RED);setfont(56,0,"黑体");outtextxy(200,200,"GAME OVER");getch();
}/*输出成绩*/
static void PrScore(void)
{char str[10];setfillstyle(YELLOW);bar(50,15,220,35);setcolor(BROWN);setfont(16,0,"宋体");sprintf(str,"score:%d",score);outtextxy(55,16,str);
}static void Close(void)
{closegraph();
}
#ifndef SNAKE_H
#define SNAKE_H#define LEFT 'a'
#define RIGHT 'd'
#define DOWN 's'
#define UP 'w'
#define ESC 27#define N 200 /*蛇的最大长度*/char key; /*控制按键*/struct Food
{int x; /*食物的横坐标*/int y; /*食物的纵坐标*/int yes; /*判断是否要出现食物的变量*/
}food; /*食物的结构体*/struct Snake
{int x[N];int y[N];int node; /*蛇的节数*/int direction; /*蛇移动方向*/int life; /* 蛇的生命,0活着,1死亡*/
}snake;#endif
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

整理分享(学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)

















