贪吃蛇游戏作为最经典的电脑游戏之一,不仅令无数玩家为之着迷,而且它简单的游戏规则也使得它成为了初学者学习编程的最佳实践项目。对于C语言编程者来说,编写一个贪吃蛇游戏不仅能加深对语言基础的理解,还能在实践中熟悉图形绘制、键盘输入、时间控制等常见编程技能。我们将通过一个简单的C语言贪吃蛇游戏代码,来逐步讲解如何实现这个游戏。
一、基本框架设计

在开发贪吃蛇游戏之前,我们首先需要了解游戏的基本流程。贪吃蛇的核心是控制蛇头在一个二维网格内移动,并通过吃食物来增长蛇身长度,同时避免撞墙或撞到自己的蛇身。游戏结束的条件是蛇头撞墙或碰到自己的身体。
我们的游戏分为以下几个部分:
初始化界面:游戏开始时需要显示一个游戏区域(例如,20x20的网格)。
蛇的移动:蛇的头部每次都会根据玩家的输入进行移动。
食物生成:在游戏区域的随机位置生成食物供蛇吃。
碰撞检测:判断蛇头是否碰到墙壁或自己的身体。
得分:蛇吃到食物时增加分数,并且蛇身会变长。
游戏结束:碰撞或超出规定时间则游戏结束。
在C语言中,游戏的输出通常通过标准输出进行,但由于游戏画面需要不断更新,显示的内容也需要通过清屏命令不断刷新。我们将使用system("cls")来清除屏幕,确保每次绘制的是最新的游戏状态。
二、结构体定义和全局变量
我们需要定义一个结构体来表示蛇。蛇由多个节点组成,每个节点包含蛇身坐标。通过结构体数组来表示整个蛇身。
#include
#include//用于获取键盘输入
#include
#include
#defineWIDTH20
#defineHEIGHT20
#defineMAX_LENGTH100
//定义蛇身节点
typedefstruct{
intx;
inty;
}SnakeNode;
//定义蛇
SnakeNodesnake[MAX_LENGTH];
intsnakeLength=1;//初始蛇身长度
intfoodX,foodY;//食物的坐标
intscore=0;//游戏得分
//方向标识
enumDirection{UP,DOWN,LEFT,RIGHT};
enumDirectiondir=RIGHT;//初始方向为右
voidsetup(){
//初始化蛇的起始位置
snake[0].x=WIDTH/2;
snake[0].y=HEIGHT/2;
//随机生成食物位置
srand(time(NULL));
foodX=rand()%WIDTH;
foodY=rand()%HEIGHT;
}
voiddraw(){
system("cls");//清屏
for(inti=0;i
printf("\n");
for(inti=0;i
for(intj=0;jif(j==0)printf("#");//左边界elseif(j==WIDTH-1)printf("#");//右边界elseif(i==snake[0].y&&j==snake[0].x)printf("O");//蛇头elseif(i==foodY&&j==foodX)printf("*");//食物else{intisSnakeBody=0;for(intk=1;kif(i==snake[k].y&&j==snake[k].x){printf("o");//蛇身isSnakeBody=1;break;}}if(!isSnakeBody)printf("");//空白区域}}printf("\n");}for(inti=0;iprintf("\n");printf("Score:%d\n",score);//显示得分}voidinput(){if(_kbhit()){//检测键盘输入charcurrent=_getch();if(current=='w'&&dir!=DOWN)dir=UP;if(current=='s'&&dir!=UP)dir=DOWN;if(current=='a'&&dir!=RIGHT)dir=LEFT;if(current=='d'&&dir!=LEFT)dir=RIGHT;}}voidlogic(){//移动蛇身for(inti=snakeLength-1;i>0;i--){snake[i]=snake[i-1];}//更新蛇头位置switch(dir){caseUP:snake[0].y--;break;caseDOWN:snake[0].y++;break;caseLEFT:snake[0].x--;break;caseRIGHT:snake[0].x++;break;}//判断蛇是否撞墙if(snake[0].x<0||snake[0].x>=WIDTH||snake[0].y<0||snake[0].y>=HEIGHT){printf("GameOver!Youhitthewall!\n");exit(0);}//判断蛇是否吃到食物if(snake[0].x==foodX&&snake[0].y==foodY){score+=10;snakeLength++;//蛇身长度增加foodX=rand()%WIDTH;foodY=rand()%HEIGHT;}//判断蛇是否碰到自己for(inti=1;iif(snake[0].x==snake[i].x&&snake[0].y==snake[i].y){printf("GameOver!Youhityourself!\n");exit(0);}}}intmain(){setup();while(1){draw();input();logic();_sleep(100);//控制游戏帧率}return0;}三、代码讲解结构体和全局变量:我们定义了SnakeNode结构体来存储蛇身节点的位置,每个节点包含两个变量:x和y,分别代表横坐标和纵坐标。snake数组保存了整个蛇的身体,snakeLength记录了蛇的长度,foodX和foodY保存了食物的位置,score记录得分。初始化:在setup()函数中,我们将蛇头放置在屏幕中心,并随机生成一个食物的位置。绘制界面:draw()函数负责绘制游戏界面。它通过#符号绘制墙壁,O表示蛇头,o表示蛇身,*表示食物。控制输入:使用_kbhit()检测是否有键盘输入,如果有,使用_getch()获取输入并根据方向键(WASD)改变蛇的运动方向。(继续)