使用C语言如何实现一个贪吃蛇小游戏

  介绍

使用C语言如何实现一个贪吃蛇小游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强> 1,控制台窗口

控制台窗口每一个位置都有它的坐标,且坐标系如下图所示(随箭头方向坐标逐渐增大),

使用C语言如何实现一个贪吃蛇小游戏

<强> 2,通过代码将光标移动到控制台指定位置

这里用到了C语言windows编程中句柄的概念,不知道的可以百度。实在不会也没关系,可以当做一个函数模板来使用,无需做太多了解。

# include  & lt; stdio.h>   # include  & lt; Windows.h>   ,//将光标移动到控制台的(x, y)坐标点处   void  gotoxy (int  x,, int  y)   {   ,COORD  coord;=,coord.X  x;   y=, coord.Y ;   ,SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coord);   }   ,   int  main ()   {   15,gotoxy(50);//将光标移动到控制台的(50,15)处   ,printf (“Hello 世界\ n");   ,系统(“pause");   ,return  0;   }

使用C语言如何实现一个贪吃蛇小游戏

从运行结果可以看的到,程序在指定位置输出了待输出的内容。

<强>三,程序框架

1,定义相关头文件

2,定义函数结构以及相关属性

3,完成各代码块

<强>四,具体操作

1,定义相关头文件

本程序所用到的头文件如下所示

# include  & lt; stdio.h>   # include  & lt; stdlib.h>   # include  & lt; Windows.h>//windows编程头文件   # include  & lt; time.h>   # include  & lt; conio.h>//控制台输入输出头文件

2,定义函数结构以及相关属性

首先需要确定游戏的边框大小

# define  SNAKESIZE  100//蛇的身体最大节数   # define  MAPWIDTH  118年,//宽度   29 # define  MAPHEIGHT //高度

其次要定义食物的坐标,以及蛇自身的相关属性

//食物的坐标   struct  {   ,int  x;   ,int  y;   }食物;   ,//蛇的相关属性   struct  {   ,int 速度;//蛇移动的速度   ,int  len;//蛇的长度   ,int  x [SNAKESIZE];//组成蛇身的每一个小方块中x的坐标   ,int  y (SNAKESIZE);//组成蛇身的每一个小方块中y的坐标   ,   }蛇;

这里蛇的身体由一节一节的小方块■组成,将蛇的身体每一节的小方块所在的位置用一个数组来存储起来,方便以后操作。

确定游戏所用到的几个函数块。

//绘制游戏边框   void  drawMap ();//随机生成食物   void  createFood ();//按键操作   void  keyDown ();//蛇的状态   bool  snakeStatus ();//从控制台移动光标   void  gotoxy (int  x,, int  y);

最后定义几个全局变量

int  key =, 72;//表示蛇移动的方向,72为按下“↑”所代表的数字   ,//用来判断蛇是否吃掉了食物,这一步很重要,涉及到是否会有蛇身移动的效果以及蛇身增长的效果   int  changeFlag =, 0;   ,   int  sorce =, 0;//记录玩家的得分

<强>五,完成各代码块

1,实现将光标移到指定位置的操作

//将控制台光标移到(x, y)处   void  gotoxy (int  x,, int  y)   {   ,COORD  coord;=,coord.X  x;   y=, coord.Y ;   ,SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coord);   }

2,打印游戏边框以及游戏初始画面

一个小方块字符■在x方向上占用两个位置,在y方向上占用一个位置。每一节蛇身由一个小方块构成。

void  drawMap ()   {   ,//打印上下边框   ,for  (int 小姐:=,0;,小姐:& lt;=, MAPWIDTH;,小姐:+=,2)//i +=2是因为横向占用的是两个位置   ,{   ,//将光标移动依次到(0)我处打印上边框   ,gotoxy(我,,0);   ,printf (“■“);   ,//将光标移动依次到(我MAPHEIGHT)处打印下边框   ,gotoxy(我,MAPHEIGHT);   ,printf (“■“);   ,}   ,   ,//打印左右边框   ,for  (int 小姐:=,1;,小姐:& lt;, MAPHEIGHT;,我+ +)   ,{   ,//将光标移动依次到(0,1)处打印左边框   ,gotoxy(0,,我);   ,printf (“■“);   ,//将光标移动依次到(MAPWIDTH, i)处打印左边框   ,gotoxy (MAPWIDTH,,我);   ,printf (“■“);   ,}   ,   ,//随机生成初试食物   ,while  (1)   ,{   ,将srand ((unsigned  int)时间(NULL));=,,food.x  rand (), %, (MAPWIDTH 安康;4),+,2;=,,food.y  rand (), %, (MAPHEIGHT 安康;2),+,1;   ,//生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致   ,//会导致吃食物的时候只吃到一半   %,if  (food.x  2,==, 0)   ,打破;   ,}   ,//将光标移到食物的坐标处打印食物   ,gotoxy (food.x, food.y);   ,printf (“★”);   ,   ,//初始化蛇的属性=,snake.len  3;=,snake.speed  200;   ,   ,//在屏幕中间生成蛇的头   ,snake.x [0],=, MAPWIDTH /, 2, +, 1;//x坐标为偶数   ,snake.y [0],=, MAPHEIGHT /, 2;   ,//打印蛇的头   ,gotoxy (snake.x [0],, snake.y [0]);   ,printf (“■“);   ,   ,//生成初试的蛇身   ,for  (int 小姐:=,1;,小姐:& lt;, snake.len;,我+ +)   ,{   ,//蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+ 2   ,snake.x[我],=,snake.x[小姐,安康;1],+,2;   ,snake.y[我],=,snake.y[小姐,安康;1];   ,gotoxy (snake.x[我],snake.y[我]);   ,printf (“■“);   ,}   ,//打印完蛇身后将光标移到屏幕最上方,避免光标在蛇身处一直闪烁   ,gotoxy (MAPWIDTH 作用;2,0);   ,返回;   }

使用C语言如何实现一个贪吃蛇小游戏