贪吃蛇

文章目录

  • 1、具体实现的效果
  • 2、准备
  • 3、整体思路
  • 4、宏定义
  • 5、定义蛇、食物、方向
  • 6、初始化
  • 7、图形绘制
  • 8、蛇的移动
  • 9、键盘控制
  • 10、吃食物
  • 11、主函数
  • 12、完整代码
  • 扩展

第一次使用 graphics库,一些不认识的函数在最后面有解释。

以下代码都是在VS2022中编写。

1、具体实现的效果

  • 按键控制移动
  • 空格实现暂停
  • 可以穿墙
  • 记录分数,达到目标分数后退出

如图:

程序还是比较粗糙,还有很多地方可以更改。


2、准备

知识点:结构体、数组、循环、函数、easyx。

需要使用到easyx绘图库,需要去官网下载,选择对应的版本安装即可。

EasyX 是什么

EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。

“下载 -> 安装 -> 使用”,全过程不超过一分钟。具体安装步骤请参考。

EasyX 含有一些简单的函数集合,几乎不用学习,直接翻看参考手册就可以直接使用。在线参考手册。

因为easyx主要是针对C++的,所以在用的时候,要把源文件的后缀名从.c改成.cpp,然后再用C语言写就没问题,不然的话用不了。


3、整体思路

  • 首先需要一个图形窗口,游戏在这个窗口里面运行;
  • 食物和蛇是两个结构,需要定义两个结构体;
  • 食物是随机刷新的;
  • 要想通过键盘控制蛇的移动,必须要获取按下的键的键值。

这次主要的新内容是easyx和graphics库的使用。

代码中有很多地方用到坐标,坐标默认的原点在窗口的左上角,X 轴向右为正,Y 轴向下为正。如图:


4、宏定义

先定义一下需要的常量。

#define SNAKE_MAXSIZE 500  // 蛇的最大长度
#define SCORE_MAXSIZE 100  // 最大得分数
#define HEIGHT 640  // 窗口的高度
#deifne WIDE 480  // 窗口的宽度
// 因为食物和蛇的身体都是小圆圈,也可以将食物和蛇的半径定义为常量使用。

5、定义蛇、食物、方向

定义蛇

struct Snake{int r;  // 半径int len;  // 节数,身体长度int score;  // 分数int speed;  // 速度,也就是一次移动多远距离int dirction;  // 方向,上下左右POINT coord[SNAKE_MAXSIZE];  // 坐标(coordinate),保存蛇的每节身子的坐标
}snake;

int r:蛇是由多个小圆组成的,蛇的每一节身体就是一个无边框实心小圆,这个小圆需要一个半径来控制蛇的粗细;

int len:还需要一个长度属性来记录蛇的长度,方便后面给蛇的每一节身体进行绘制;

int score:将玩家得到的分数也记录在蛇体内;

int speed:控制蛇移动的速度,其实就是一次移动多远的距离,这个应该半径有关系。

int dirction:记录蛇移动的方向(上下左右)。

POINT coord[SNAKE_MAXSIZE]:保存蛇每一节身体的坐标,以coord[0]作为蛇头。

POINT也是一个结构体。详情。

定义食物

struct Food{int r;  // 半径int x;  // 横坐标int y;  // 纵坐标bool flag;  // 标记是否被吃
}food;

int r:食物也是由实心小圆构成,也需要半径;

int x; int y:直接用两个变量保存坐标信息,因为食物永远都是只有一个点出现。

bool flag:标记是否被吃掉,没有被吃掉就绘制出来,被吃掉了就重新生成一个食物。

定义方向

enum Dirction{UP,DOWN,LEFT,RIGHT
};

使用枚举类型,分别为上、下、左、右,用来标记蛇移动的方向。


6、初始化

首先要将游戏窗口、蛇、食物的属性进行初始化。

void gameInit(){// 先初始化一个游戏窗口initgraph(WIDE, HEIGHT);// 初始化蛇snake.size = 2;snake.r = 3;snake.speed = snake.r * 2;snake.score = 0;  // 初始得分// 初始化每节身体的坐标for (int i = 0; i < snake.size; i++) {snake.coordinate[i].x = (snake.size - i) * 2 * snake.r;snake.coordinate[i].y = HEIGHT / 2;  // 纵坐标为窗口的中间}snake.dirction = RIGHT;// 初始化食物foodInit();// 设置蛇和食物的颜色setfillcolor(RGB(255, 210, 81));
}
  • initgraph(int wide, int height, int flag):这个函数用于初始化绘图窗口。详情。

  • snake.speed = snake.r * 2;:因为半径和每次移动距离是有关系的,蛇的移动本质上就是圆形的移动,后一个圆形移动到前一个圆形的位置,而具体坐标上移动是以圆心的坐标来移动的。

    比如固定半径为5,每次移动为1,那么每次移动蛇的每一节身体的圆心会移动一个位置,但是圆形是有半径的,所以就会导致蛇的身体显示堆积在一起,因为它们圆心的距离只有1,但是半径有5。所以这里的半径应该与每次移动距离联系起来。

    因为每次移动是后一个圆的圆心移动到前一个圆的圆心,所以实际上是移动了两个半径的距离,所以可以把每次移动的距离设置为两个半径的大小。

  • snake.coordinate[i].x = (snake.size - i) * 2 * snake.r;:在初始化每节身体坐标时,因为我们是以coord[0]为蛇头的,所以coord[0]应该在最前面,也就是它的横坐标值最大,用snake.size - i控制越靠后的身体圆心横坐标越小。由半径和移动距离的关系可知,每节身体初始间距也应该有两个半径的距离,所以(snake.size - i) * 2 * snake.r表示每个圆心的横坐标。

  • foodInit():初始化食物,这是一个自定义的函数,因为后续还会用到该函数,避免代码重复编写。

    void foodInit() {// 设置随机数种子// srand(GetTickCount());  // GetTickCount()获取系统开机到现在所经过的毫秒数srand((unsigned)time(NULL));  // 设置随机数种子food.r = snake.r;food.x = rand() % (WIDE - food.r) + food.r;food.y = rand() % (HEIGHT - food.r) + food.r;food.flag = true;
    }
    

    食物是随机生成的,所以它的横纵坐标就应该是用随机数生成,使用随机数时有个公式:rand() % (A - a) + a是生成范围为【a,A)的随机数。而食物也是一个圆形,它的位置也是由圆心坐标决定,而且还有半径,所以为了食物能够显示完全(不会被窗口边界遮挡),圆心的最小最大横纵坐标都应该离窗口边界有一个半径的距离。

    rand()srand()函数都需要包含stdlib.h头文件,time()还需要包含time.h文件。

  • setfillcolor(RGB(255, 210, 81));:设置颜色。详情。


7、图形绘制

初始化完后,就可以将窗口、蛇、食物画出来了。

void gameDraw() {// 双缓冲防止卡顿BeginBatchDraw();// 设置背景颜色setbkcolor(RGB(0, 108, 190));cleardevice();// 画蛇for (int i = 0; i < snake.size; i++) {solidcircle(snake.coordinate[i].x, snake.coordinate[i].y, snake.r);}// 画食物if (food.flag)solidcircle(food.x, food.y, food.r);// 画分数char tmp[20] = "";sprintf_s(tmp, "目标分数:%d", SCORE_MAXSIZE);outtextxy(0, 0, tmp);sprintf_s(tmp, "分数:%d", snake.score);outtextxy(0, 20, tmp);EndBatchDraw();
}
  • BeginBatchDraw():相当于一次缓冲,可防止界面卡顿,先把所有图画好,得到指令(EndBatchDraw())后在输出画好的图。详情。
  • setbkcolor(RGB(0, 108, 190));:设置背景颜色。详情。
  • cleardevice():使用当前背景色清空绘图设备。详情。
  • solidcircle(snake.coordinate[i].x, snake.coordinate[i].y, snake.r);:画出蛇的每节身体和食物(圆)。详情。
  • sprintf_s(tmp, "目标分数:%d", SCORE_MAXSIZE);:格式化tmp字符串为“目标分数:100”。详情。
  • outtextxy(0, 0, tmp);:在(0, 0)的位置上输出tmp这个字符串。详情。
  • EndBatchDraw();:将画好的图输出。详情。

图形绘制好后,就可以在主函数中一直调用了。


8、蛇的移动

蛇的移动,本质上就是移动第一个圆心(蛇头),然后将第二个圆心移动到之前第一个圆心的位置,往后以此类推,完成移动操作。所以这个功能的实现主要点在每个圆心的坐标上,把圆心的坐标改了,然后再调用gameDraw()方法重新绘制就可以了。

移动时,需要判断当前的移动方向,然后对应的修改横纵坐标。

  • 往右:纵坐标不变,横坐标加上每次移动的距离;
  • 往左:纵坐标不变,横坐标减去每次移动的距离;
  • 向上:横坐标不变,纵坐标减去每次移动的距离;
  • 向下:横坐标不变,纵坐标加上每次移动的距离。

同时,要想实现可以穿墙操作的话,就还需要判断一次,当蛇头碰到边界时,就会从对面的边界出来,其实就是将对应的坐标变成最大或最小:

  • 碰到上边界(y == 0),从下边界出来(y == HEIGHT);
  • 碰到下边界,从上边界出来;
  • 碰到左边界(x == 0),从右边界出来(x == WIDE);
  • 碰到右边界,从左边界出来。
void snakeMove() {// 改身体的每个圆心的坐标for (int i = snake.size - 1; i > 0; i--) {snake.coordinate[i] = snake.coordinate[i - 1];}// 改蛇头的坐标switch (snake.dirction) {case UP:snake.coordinate[0].y -= snake.speed;if (snake.coordinate[0].y + snake.r <= 0)snake.coordinate[0].y = HEIGHT;break;case DOWN:snake.coordinate[0].y += snake.speed;if (snake.coordinate[0].y + snake.r >= HEIGHT)snake.coordinate[0].y = 0;break;case LEFT:snake.coordinate[0].x -= snake.speed;if (snake.coordinate[0].x + snake.r <= 0)snake.coordinate[0].x = WIDE;break;case RIGHT:snake.coordinate[0].x += snake.speed;if (snake.coordinate[0].x + snake.r >= WIDE)snake.coordinate[0].x = 0;break;}
}

9、键盘控制

蛇可以移动后,还需要实现通过键盘来改变移动方向和空格键暂停。

这个时候就需要判断用户是否有按键的操作,如果没有就不改变游戏状态,如果有的话,再通过键值来判断用户想执行的上下左右还是暂停。规定用w\a\s\d,↑\←\↓\→来控制方向。↑、↓、←、→的键值分别为72、80、75、77。

同时在移动蛇的时候需要考虑实际性:蛇在向一个方向移动时,不能改变方向成相反的方向。也就是说,蛇在向下移动时,当按了向上键后,它不能改变方向,所以需要在改变方向时判断一下当前蛇的移动方向。

void directionChange() {// 判断是否有按键操作if (_kbhit()) {  // 如果有按键操作,返回真switch (_getch()) {// 72,80,75,77,上下左右箭头的 键值case 'w':case 'W':case 72:if (snake.dirction != DOWN)snake.dirction = UP;break;case 's':case 'S':case 80:if (snake.dirction != UP)snake.dirction = DOWN;break;case 'a':case 'A':case 75:if (snake.dirction != RIGHT)snake.dirction = LEFT;break;case 'd':case 'D':case 77:if (snake.dirction != LEFT)snake.dirction = RIGHT;break;case ' ':  // 空格暂停while (1) {if (_getch() == ' ')  // 再按空格继续return;}// system("pause");  // 这个也是暂停,但是可以按任何键继续}}
}
  • kbhit():检测用户是否有按键操作。详情。
  • getch():拿到用户按下的键的键值。详情。

暂停部分的逻辑是:按下空格后,会进入一个死循环,当前游戏界面就不会再刷新;当你再按下一次空格后,才会退出这个死循环,回到主函数继续游戏。

kbhit()getch()在VS2022中会被要求写为_getch()_kbhit()

错误 C4996 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.

10、吃食物

是否吃到食物是以蛇头是否碰到食物来判断的。

如果用蛇头和食物的圆心坐标是否相等来判断是否吃到食物的话,会发现,因为蛇头和食物都是圆形而不是圆点,所以看起来蛇头碰到了食物但是并没有吃到食物,所以不应该用两个点的坐标来进行判断,而是使用一个范围值。

用蛇头圆心坐标,判断是否进入食物圆的范围内,来判断是否吃到食物。

吃到食物的话,要把蛇的长度加一,分数加10,并且将当前食物的flag属性改为false,标志已被吃过了。

void eatFood() {if (food.flag &&snake.coordinate[0].x >= food.x - food.r && snake.coordinate[0].x <= food.x + food.r &&snake.coordinate[0].y >= food.y - food.r && snake.coordinate[0].y <= food.y + food.r) {snake.size++;snake.score += 10;food.flag = false;}if (!food.flag) {foodInit();}
}

11、主函数

在主函数里面,首先初始化游戏,然后使用一个死循环来一直刷新游戏界面,在循环里面调用上面写到的移动、变向、吃食函数,同时判断当前的分数是否已经到了目标分数,如果到了目标分数,就在窗口中间打印“恭喜通关”祝福语,然后暂停3秒后关闭游戏。

int main() {gameInit();while (1) {snakeMove();directionChange();eatFood();if (snake.score >= SCORE_MAXSIZE) {char temp[10] = "";sprintf_s(temp, "恭喜过关!");outtextxy(WIDE / 2 - 5, HEIGHT / 2, temp);Sleep(3000);return 0;}gameDraw();Sleep(50);}return 0;
}
  • Sleep(50);:设置停留时间,太短了的话窗口刷新非常快,就是蛇移动的非常快,太慢了蛇移动就会非常慢。

12、完整代码

#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
// 以下是添加背景音乐需要的
// #include<mmsystem.h>
// #pragma comment(lib,"winmm.lib")#define SNAKE_MAXSIZE 500  // 蛇的最大节数
#define HEIGHT 480  // 窗口的高度
#define WIDE 640  // 窗口的宽度
#define SCORE_MAXSIZE 100// 蛇的结构体
struct Snake {int size;  // 节数int dirction;  // 方向int speed;  // 速度int score;  // 分数int r;POINT coordinate[SNAKE_MAXSIZE];  // 坐标
}snake;// 食物的结构
struct Food {int x;  // 横坐标int y;  // 纵坐标int r;  // 半径bool flag;  // 标志
}food;// 移动的方向
enum Dirction {UP,LEFT,RIGHT,DOWN
};// 初始化食物
void foodInit() {// 设置随机数种子// srand(GetTickCount());  // GetTickCount()获取系统开机到现在所经过的毫秒数srand((unsigned)time(NULL));food.r = snake.r;food.x = rand() % (WIDE - 2 * food.r) + food.r;food.y = rand() % (HEIGHT - 2 * food.r) + food.r;// printf("%d %d\n", food.x, food.y);food.flag = true;
}// 初始化
void gameInit() {// 播放背景音乐// 这里字符串报错的话,去项目-属性-高级-字符集里,改成多字节字符集// mciSendString("open ./res/snake/snake_bgm.mp3 alias BGM", 0, 0, 0);// mciSendString("play BGM repeat", 0, 0, 0);// 初始化图形窗口initgraph(WIDE, HEIGHT/*, SHOWCONSOLE*/);// 初始化蛇snake.size = 12;snake.r = 5;snake.speed = snake.r * 2;snake.score = 0;for (int i = 0; i < snake.size; i++) {snake.coordinate[i].x = (snake.size - i) * 2 * snake.r;snake.coordinate[i].y = HEIGHT / 2;// printf("% d % d\n", snake.coordinate[i].x, snake.coordinate[i].y);}snake.dirction = RIGHT;// 初始化食物foodInit();// 设置蛇和食物的颜色setfillcolor(RGB(255, 210, 81));
}// 图形绘制
void gameDraw() {// 双缓冲防止卡顿BeginBatchDraw();// 设置背景颜色setbkcolor(RGB(0, 108, 190));cleardevice();// 画蛇for (int i = 0; i < snake.size; i++) {solidcircle(snake.coordinate[i].x, snake.coordinate[i].y, snake.r);}// 画食物if (food.flag)solidcircle(food.x, food.y, food.r);// 画分数char tmp[20] = "";sprintf_s(tmp, "目标分数:%d", SCORE_MAXSIZE);outtextxy(0, 0, tmp);sprintf_s(tmp, "分数:%d", snake.score);outtextxy(0, 20, tmp);EndBatchDraw();
}// 移动蛇
void snakeMove() {// 身子跟着头移动for (int i = snake.size - 1; i > 0; i--) {snake.coordinate[i] = snake.coordinate[i - 1];}// 头移动switch (snake.dirction) {case UP:snake.coordinate[0].y -= snake.speed;if (snake.coordinate[0].y + snake.r <= 0)snake.coordinate[0].y = HEIGHT;break;case DOWN:snake.coordinate[0].y += snake.speed;if (snake.coordinate[0].y + snake.r >= HEIGHT)snake.coordinate[0].y = 0;break;case LEFT:snake.coordinate[0].x -= snake.speed;if (snake.coordinate[0].x + snake.r <= 0)snake.coordinate[0].x = WIDE;break;case RIGHT:snake.coordinate[0].x += snake.speed;if (snake.coordinate[0].x + snake.r >= WIDE)snake.coordinate[0].x = 0;break;}
}// 通过按键改变移动方向
void directionChange() {// 判断是否有按键操作if (_kbhit()) {  // 如果有按键操作,返回真switch (_getch()) {// 72,80,75,77,上下左右箭头的 键值case 'w':case 'W':case 72:if (snake.dirction != DOWN)snake.dirction = UP;break;case 's':case 'S':case 80:if (snake.dirction != UP)snake.dirction = DOWN;break;case 'a':case 'A':case 75:if (snake.dirction != RIGHT)snake.dirction = LEFT;break;case 'd':case 'D':case 77:if (snake.dirction != LEFT)snake.dirction = RIGHT;break;case ' ':while (1) {if (_getch() == ' ')return;}// system("pause");}}
}// 吃食物
void eatFood() {if (food.flag &&snake.coordinate[0].x >= food.x - food.r &&snake.coordinate[0].x <= food.x + food.r &&snake.coordinate[0].y >= food.y - food.r &&snake.coordinate[0].y <= food.y + food.r) {snake.size++;snake.score += 10;food.flag = false;}if (!food.flag) {foodInit();}
}int main() {gameInit();while (1) {snakeMove();directionChange();eatFood();if (snake.score >= SCORE_MAXSIZE) {char temp[10] = "";sprintf_s(temp, "恭喜过关!");outtextxy(WIDE / 2 - 5, HEIGHT / 2, temp);Sleep(3000);return 0;}gameDraw();Sleep(50);}return 0;
}

扩展

POINT:

windf.h文件中,POINT是如下定义:

typedef struct tagPOINT
{LONG  x;  LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

long x:指定点x的坐标;

long y:指定点y的坐标。

点击返回


initgraph(int wide, int height, int flag)这个函数用于初始化绘图窗口。

源代码:

HWND initgraph(int width,int height,int flag = NULL
);
  • width:绘图窗口的宽度。

  • height:绘图窗口的高度。

  • flag:绘图窗口的样式,默认为 NULL。可为以下值:

  • 含义
    EX_DBLCLKS 在绘图窗口中支持鼠标双击事件。
    EX_NOCLOSE 禁用绘图窗口的关闭按钮。
    EX_NOMINIMIZE 禁用绘图窗口的最小化按钮。
    EX_SHOWCONSOLE 显示控制台窗口。

点击返回


void setfillcolor(COLORREF color);:这个函数用于设置当前设备绘图背景色。

  • color:指定要设置的背景颜色。

在设置背景色之后,并不会改变现有背景色,而是只改变背景色的值,之后再执行绘图语句,例如 outtextxy,会使用新设置的背景色值。如果需要修改全部背景色,可以在设置背景色后执行 cleardevice() 函数。

RGB:RGB 宏用于将红、绿、蓝颜色分量合成颜色。RGB 宏在 Windows SDK 中定义。

COLORREF RGB(BYTE byRed,     // 颜色的红色部分BYTE byGreen, // 颜色的绿色部分BYTE byBlue       // 颜色的蓝色部分
);
  • byRed:颜色的红色部分,取值范围:0~255。

  • byGreen:颜色的绿色部分,取值范围:0~255。

  • byBlue:颜色的蓝色部分,取值范围:0~255。

  • 返回值:返回合成的颜色。

点击返回


void BeginBatchDraw();:这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDrawEndBatchDraw 才将之前的绘图输出。

点击返回


void setbkcolor(COLORREF color);:这个函数用于设置当前设备绘图背景色。

  • color:指定要设置的背景颜色。

在设置背景色之后,并不会改变现有背景色,而是只改变背景色的值,之后再执行绘图语句,例如 outtextxy,会使用新设置的背景色值。如果需要修改全部背景色,可以在设置背景色后执行 cleardevice() 函数。

点击返回


void cleardevice();:这个函数使用当前背景色清空绘图设备。

点击返回


void solidcircle(int x, int y, int radius);:这个函数用于画无边框的填充圆。

  • x:圆心 x 坐标。
  • y:圆心 y 坐标。
  • radius:圆的半径。

该函数使用当前填充样式绘制无外框的填充圆。

点击返回


int sprintf(char *str, const char *format, ...):发送格式化输出到 str 所指向的字符串。

  • str:这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format:这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。

该函数详情可见sprintf。在vs2022中,sprintf会被判定为不安全,建议使用sprintf_s

点击返回


void outtextxy(int x, int y, LPCTSTR str);:这个函数用于在指定位置输出字符串。

  • x:字符串输出时头字母的 x 轴的坐标值。
  • y:字符串输出时头字母的 y 轴的坐标值。
  • str:待输出的字符串的指针。

该函数不会改变当前位置。

字符串常见的编码有两种:MBCS 和 Unicode。VC6 新建的项目默认为 MBCS 编码,VC2008 及高版本的 VC 默认为 Unicode 编码。LPCTSTR 可以同时适应两种编码。为了适应两种编码,请使用 TCHAR 字符串及相关函数。

默认情况下,输出字符串的背景会用当前背景色填充。使用函数 setbkmode 可以设置文字的背景部分保持透明或使用背景色填充。

点击返回


void EndBatchDraw();:这个函数用于结束批量绘制,并执行未完成的绘制任务。

点击返回


int kbhit(void);: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

包含头文件: include <conio.h>

点击返回


int getch(void):从stdio流中读字符,即从控制台读取一个字符,但不显示在屏幕上。返回读取的字符。

这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,这个函数并非标准函数,要注意移植性!

Windows下getch()conio.h的头文件中,要使用getch()函数需要引用conio头文件。

点击返回

标值。

  • y:字符串输出时头字母的 y 轴的坐标值。
  • str:待输出的字符串的指针。

该函数不会改变当前位置。

字符串常见的编码有两种:MBCS 和 Unicode。VC6 新建的项目默认为 MBCS 编码,VC2008 及高版本的 VC 默认为 Unicode 编码。LPCTSTR 可以同时适应两种编码。为了适应两种编码,请使用 TCHAR 字符串及相关函数。

默认情况下,输出字符串的背景会用当前背景色填充。使用函数 setbkmode 可以设置文字的背景部分保持透明或使用背景色填充。

点击返回


void EndBatchDraw();:这个函数用于结束批量绘制,并执行未完成的绘制任务。

点击返回


int kbhit(void);: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

包含头文件: include <conio.h>

点击返回


int getch(void):从stdio流中读字符,即从控制台读取一个字符,但不显示在屏幕上。返回读取的字符。

这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,这个函数并非标准函数,要注意移植性!

Windows下getch()conio.h的头文件中,要使用getch()函数需要引用conio头文件。

点击返回

C语言项目——简单贪吃蛇相关推荐

  1. 【C语言项目】贪吃蛇游戏(上)

    00. 目录 文章目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) ...

  2. 简单贪吃蛇c语言代码,一个C语言写简单贪吃蛇源代码.doc

    一个C语言写简单贪吃蛇源代码 #include #include #include #include #include #include int grade=5,point=0,life=3; voi ...

  3. 【C语言项目】贪吃蛇游戏(下)

    00. 目录 文章目录 00. 目录 07. 游戏逻辑 7.5 按下ESC键结束游戏 7.6 判断是否撞到墙 7.7 判断是否咬到自己 08. 游戏失败界面设计 8.1 游戏失败界面边框设计 8.2 ...

  4. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  5. 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏

    大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...

  6. 贪吃蛇python语言代码_Python贪吃蛇简单的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在自学Python的过程中在网上查询资料时发现了一些好玩的东西,python的游戏库模块,它可以自己弄一个小游戏来玩玩,然后我在网上找了一些游戏的代码,, ...

  7. html与js简单小游戏,JS实现简单贪吃蛇小游戏

    本文实例为大家分享了JS实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.使用语言 HTML+CSS+JavaScript 2.使用工具 visual studio code 3.GitHu ...

  8. 好玩的c语言编程游戏,C语言写个贪吃蛇游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...

  9. C 语言实现经典贪吃蛇游戏

    原文链接:C语言 贪吃蛇游戏 文章目录 一.说明 二.效果 2.1 欢迎界面 2.2 游戏规则 2.3 得分排行 2.4 退出游戏 2.5 游戏界面 2.6 游戏结束 三.源码 3.1 cmd.h 3 ...

最新文章

  1. There was a problem confirming the ssl certificate
  2. 【CV】目标检测入门和实现思路!
  3. php Xdebug的安装与使用详解
  4. android activity 回调函数,Android Activity的生命周期
  5. AD-查找符合指定条件的用户Get-User
  6. jQuery怎么改变img的src
  7. 解决django需要手动调整数据库,避免manage.py各种报错
  8. signature=cb97f07fbd7b371e6311b0d8707b6398,vue 汉字转拼音(filter)
  9. mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
  10. 京东联盟开发(10)——轮询获取数据
  11. Centos6.3下Ganglia3.6.0安装配置
  12. paip.连接access2003数据库python3.3以及php5对比
  13. gcms基峰有什么用_金鉴实验室 | 气相质谱(GCMS)
  14. meta—learning调研及MAML概述
  15. Eclipse 项目有红感叹号
  16. ZAO作一下,你会是谁
  17. 在线制作FLASH,图片的网站集合
  18. Godaddy域名注册详细图文教程(转)
  19. Kotlin语言内置函数学习2:with,also,takeIf,takeUnless
  20. SVG公众号排版 | 快速解决视频号美化出现“点赞信息”

热门文章

  1. 32位MD5加密java实现工具类
  2. 2B SaaS的黏性在哪里?
  3. Python趣味百题-进阶篇-刘硕-专题视频课程
  4. Babel,.babelrc
  5. saltstack入门教程精华案例
  6. 【Transformers】第 6 章:用于标记分类的微调语言模型
  7. vue 项目中使用高德地图
  8. 蓝牙耳机啥牌子好?无线蓝牙耳机品牌推荐
  9. R语言使用epiDisplay包的tabpct函数生成二维列联表并使用马赛克图可视化列联表(二维列联表、边际频数、以及按行、按列的比例)、自定义设置cex.axis参数改变轴标签数值的大小
  10. 春天后母心国语版剧情在线