千家信息网

c语言如何实现贪吃蛇玩法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下c语言如何实现贪吃蛇玩法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!(一)设计题目对网上获得的贪吃蛇游戏代码进行分析和理解再修改。以此逐步掌握c语言的实际应用。贪
千家信息网最后更新 2026年11月01日c语言如何实现贪吃蛇玩法

小编给大家分享一下c语言如何实现贪吃蛇玩法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

(一)设计题目

对网上获得的贪吃蛇游戏代码进行分析和理解再修改。以此逐步掌握c语言的实际应用。

贪吃蛇是我们小时候都玩过的游戏,这次就来试着了解它。

(二)总体设计

大概就是建立背景,建立食物和小蛇,通过玩家指令操控小蛇,最后输出game over时的结果。

(三)程序分析和主要知识应用

#include

#include

#include

#include

#include

const int H = 8; //地图的高

const int L = 16; //地图的长

const是一个C语言(ANSI C)的关键字,它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如A++、PHP5、B#.net、HC08 C、C#。

这样地图就不会改变了。

char GameMap[H][L]; //游戏地图

二维数组定义地图。

int key; //按键保存

int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)

int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向

运用数组定义方向。

int dy[4] = {-1, 1, 0, 0};

struct Snake //蛇的每个节点的数据类型

{

int x, y; //左边位置

int now; //保存当前节点的方向, 0,1,2,3分别为左右上下

}Snake[H*L];

建立各个部分的图标。

const char Shead = '@'; //蛇头

const char Sbody = '#'; //蛇身

const char Sfood = '*'; //食物

const char Snode = '.'; //'.'在地图上标示为空

void Initial(); //地图的初始化

void Create_Food(); //在地图上随机产生食物

void Show(); //刷新显示地图

void Button(); //取出按键,并判断方向

void Move(); //蛇的移动

void Check_Border(); //检查蛇头是否越界

void Check_Head(int x, int y); //检查蛇头移动后的位置情况

int main()

{

Initial();

Show();

return 0;

}

void Initial() //地图的初始化

{

int i, j;

int hx, hy;

system("title 贪吃蛇"); //控制台的标题

memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.'

system("cls");

srand(time(0)); //随机种子

srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的"随机数"都会是一组固定的序列,因此srand生成的随机数是伪随机数。

通过sarand随机生成位置。

hx = rand()%H; //产生蛇头

hy = rand()%L;

GameMap[hx][hy] = Shead;

Snake[0].x = hx; Snake[0].y = hy;

Snake[0].now = -1;

Create_Food(); //随机产生食物

二维数组表示地图。For循环套一个for循环。

for(i = 0; i < H; i++) //地图显示

{

for(j = 0; j < L; j++)

printf("%c", GameMap[i][j]);

printf("\n");

}

printf("\n小小C语言贪吃蛇\n");

printf("按任意方向键开始游戏\n");

getch(); //先接受一个按键,使蛇开始往该方向走

Button(); //取出按键,并判断方向

}

void Create_Food() //在地图上随机产生食物

{

int fx, fy;

while(1)

{

fx = rand()%H;

fy = rand()%L;

If语句用来针对玩家指令给予输出结果。

if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置

{

GameMap[fx][fy] = Sfood;

break;

}

}

}

void Show() //刷新显示地图

{

int i, j;

While语句也用来判断。

while(1)

{

_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图

Button(); //先判断按键在移动

Move();

if(over) //自吃或碰墙即游戏结束

{

printf("\n**游戏结束**\n");

printf(" >_<\n");

getchar();

break;

}

system("cls"); //清空地图再显示刷新吼的地图

for(i = 0; i < H; i++)

{

for(j = 0; j < L; j++)

printf("%c", GameMap[i][j]);

printf("\n");

}

printf("\n小小C语言贪吃蛇\n");

printf("按任意方向键开始游戏\n");

}

}

void Button() //取出按键,并判断方向

{

if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

{

while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主

key = getch(); //将按键从控制台中取出并保存到key中

Switch 后面的括号内的表达式,ANSI标准允许为任何类型.

当表达式与某一个case后面的常量表达式相等时,就执行case后面的语句,若没有匹配,则执行default后面的语句.

每一个case的常量表达式的值须互不相同,否则便会出现矛盾.

各个case和default的出现次序不影响结果.

执行完一个case语句,流程就转移到下一个case并继续执行.因此在case的分支后,加break语句来跳出switch语句.

#include

switch(key)

{ //左

case 75: Snake[0].now = 0;

break;

//右

case 77: Snake[0].now = 1;

break;

//上

case 72: Snake[0].now = 2;

break;

//下

case 80: Snake[0].now = 3;

break;

}

}

}

void Move() //蛇的移动

{

int i, x, y;

int t = sum; //保存当前蛇的长度

//记录当前蛇头的位置,并设置为空,蛇头先移动

x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';

Snake[0].x = Snake[0].x + dx[ Snake[0].now ];

Snake[0].y = Snake[0].y + dy[ Snake[0].now ];

Check_Border(); //蛇头是否越界

Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置

if(sum == t) //未吃到食物即蛇身移动哦

for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照

{

if(i == 1) //尾节点设置为空再移动

GameMap[ Snake[i].x ][ Snake[i].y ] = '.';

if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理

{

Snake[i].x = x;

Snake[i].y = y;

Snake[i].now = Snake[0].now;

}

else //其他蛇身即走到前一个蛇身位置

{

Snake[i].x = Snake[i+1].x;

Snake[i].y = Snake[i+1].y;

Snake[i].now = Snake[i+1].now;

}

GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身

}

}

void Check_Border() //检查蛇头是否越界

{

if(Snake[0].x < 0 || Snake[0].x >= H

|| Snake[0].y < 0 || Snake[0].y >= L)

over = 1;

}

void Check_Head(int x, int y) //检查蛇头移动后的位置情况

{

if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空

GameMap[ Snake[0].x ][ Snake[0].y ] = '@';

else

if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物

{

GameMap[ Snake[0].x ][ Snake[0].y ] = '@';

Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个

Snake[sum].y = y;

Snake[sum].now = Snake[0].now;

GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';

sum++;

//在循环中制造新食物

Create_Food(); //食物吃完了马上再产生一个食物

}

else

over = 1;

}

(四)程序流程和原理分析

任意键开始

Void地图初始化

Srand随机食物

For循环蛇开始成长

Switch case出现蛇死亡

显示结束分数

(五)自己修改后和源程序改进

#include

#include

#include

#include

#include

const int H = 12; //我修改了地图的大小

const int L = 24;

char GameMap[H][L];

int key;

int sum = 1, over = 0; int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0};

struct Snake

{

int x, y;

int now;

}Snake[H*L];

const char Shead = '^'; //我把头部修改成^,明显形象许多。

const char Sbody = '%'; //身体变成%,体会出蛇的扭曲感

const char Sfood = '$'; //食物变成$,仿佛钱一样

const char Snode = '.';

void Initial();

void Create_Food();

void Show();

void Button();

void Move();

void Check_Border();

void Check_Head(int x, int y);

int main()

{

Initial();

Show();

return 0;

}

void Initial()

{

int i, j;

int hx, hy;

system("title ì°3é");

system("cls");

srand(time(0));

hx = rand()%H;

hy = rand()%L;

GameMap[hx][hy] = Shead;

Snake[0].x = hx; Snake[0].y = hy;

Snake[0].now = -1;

Create_Food();

for(i = 0; i < H; i++) //μíê

for(j = 0; j < L; j++)

printf("%c", GameMap[i][j]);

printf("\n");

}

printf("\nDDCóì°3é\n");

printf("°′èòa·òüaêó·\n");

getch();

Button();

}

void Create_Food()

{

int fx, fy;

while(1)

{

fx = rand()%H;

fy = rand()%L;

if(GameMap[fx][fy] == '.')

{

GameMap[fx][fy] = Sfood;

break;

}

}

}

void Show()

{

int i, j;

while(1)

{

_sleep(250); //我把500修改250加快了速度,提升了难度。

Button();

Move();

if(over)

{

printf("\n**GAME OVER**\n");

printf(" ./>_<\.\n");

getchar();

break;

}

system("cls");

for(i = 0; i < H; i++)

{

for(j = 0; j < L; j++)

printf("%c", GameMap[i][j]);

printf("\n");

}

printf("\nDDCóì°3é\n");

printf("°′èòa·òüaêó·\n");

}

}

void Button()

{

if(kbhit() != 0)·0μ£·ò·μ0

{

while(kbhit() != 0) a÷

key = getch(); switch(key)

{ //×ó

case 75: Snake[0].now = 0;

break;

case 77: Snake[0].now = 1;

break;

case 72: Snake[0].now = 2;

break;

case 80: Snake[0].now = 3;

break;

}

}

}

void Move()

{

int i, x, y;

int t = sum;

x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';

Snake[0].x = Snake[0].x + dx[ Snake[0].now ];

Snake[0].y = Snake[0].y + dy[ Snake[0].now ];

Check_Border();

Check_Head(x, y);

if(sum == t)

for(i = 1; i < sum; i++)

{

if(i == 1)

GameMap[ Snake[i].x ][ Snake[i].y ] = '.';

if(i == sum-1)

{

Snake[i].x = x;

Snake[i].y = y;

Snake[i].now = Snake[0].now;

}

else {

Snake[i].x = Snake[i+1].x;

Snake[i].y = Snake[i+1].y;

Snake[i].now = Snake[i+1].now;

}

GameMap[ Snake[i].x ][ Snake[i].y ] = '%';

}

}

void Check_Border()

{

if(Snake[0].x < 0 || Snake[0].x >= H

|| Snake[0].y < 0 || Snake[0].y >= L)

over = 1;

}

void Check_Head(int x, int y) {

if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')

GameMap[ Snake[0].x ][ Snake[0].y ] = '^'; //下边也调整好

else

if(GameMap[ Snake[0].x ][ Snake[0].y ] == '$') //下边也调整好

{

GameMap[ Snake[0].x ][ Snake[0].y ] = '^'; //下边也调整好

Snake[sum].x = x; Snake[sum].y = y;

Snake[sum].now = Snake[0].now;

GameMap[ Snake[sum].x ][ Snake[sum].y ] = '%';

sum++;

Create_Food();

}

else

over = 1;

}

看完了这篇文章,相信你对"c语言如何实现贪吃蛇玩法"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

地图 蛇头 食物 移动 位置 方向 按键 语言 语句 节点 随机数 检查 程序 表达式 j++ 循环 常量 情况 数组 种子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技产业 圆梦互联网科技 科技互联网公司装修 中国 科技 互联网 万达互联网科技 顺网科技2021年互联网排名 现代科技和互联网有关系吗 科技与互联网的利与弊 深圳国际航运科技和互联网 互联网校园科技培训 新兴科技互联网创新大赛颁奖典礼 互联网新科技动漫ppt素材 互联网企业科技类企业如何做账 银行科技岗属于互联网吗 互联网科技包装股份有限公司上市 南京一网一红互联网科技有限公司 好易买互联网科技 重庆科技产业互联网有哪些 互联网科技创新方面的资料 利用互联网等科技手段 科技互联网政务服务 互联网科技上市公司 郑州华宇互联网科技 智腾互联网科技有限公司 本届互联网博览会上的黑科技 厦门江牛科技互联网 本届互联网大会上的黑科技 唐山双旺合互联网科技产业园 利用互联网等科技手段 小牛互联网科技有限公司地址
0