这好像是第一次发博客hhh,最近学完C语言后浑身精力澎湃总想做点什么东西 (结果差点被现实打的肿透了脸qwq ) 于是四处找项目,最终锁定贪吃蛇,曾经诺基亚上的小游戏给我的印象还是挺深的,最后在浏览其他一些大佬的项目后,了解具体思路就上手尝试做了个简陋一点的版本,由于自己也是初学者,所以 代码有很多的不足,仅供交流参考

文章目录

  • 前言
  • 一、主要功能的实现
  • 二、部分函数提要
    • 1.光标定位
    • 2.Windows界面设置
  • 三、主要模块
    • 1. 库函数、变量与函数定义
    • 2. 游戏主体
      • 2.1  绘制部分
      • 2.2  控制部分
      • 2.3  果子生成
      • 2.4  死亡判定
    • 3. 初始菜单
      • 3.1  绘制菜单
      • 3.2  刷新菜单
      • 3.4  菜单控制
    • 4. 主函数入口
    • 5. 源代码
  • 总结

前言

贪吃蛇的原理较为简单,简单版本的利用数组就能对其进行主要功能的实现,当然如果有一定的C语言基础,写出这个应该是不难的。编程环境:VScode + gcc 9.2.0(为什么vscode不能装eazyX 呜呜呜)

思路参考这位大佬的博客:https://blog.csdn.net/zs120197/article/details/88420297
需要思路详解可以进去看看,讲的很详细。


效果图如下:

初始界面:

游戏界面:


提示:以下是本篇文章正文内容,下面案例可供参考

一、主要功能的实现

1.界面显示:主要通过光标定位后循环打印某些字符来组成整体画面以及一些常驻信息,然后通过函数来刷新消除显示残留。

2.果子生成:果子分为小果子跟奖励果子,每吃相应数量的小果子就会生成一个奖励果子,通过 srand() 与 rand() 函数生成 伪随机数 来实现。

3.控制部分:通过 _kbhit() 函数及 _getch() 函数 配合if语句进行监控键盘输入,来实现 蛇的控制以及菜单移动

4.菜单部分:这部分我并没有用传统的输入数字用switch() 函数控制,而是模仿"诺基亚"那样用键盘控制,这部分代码或许会较为冗长,各位自己优化吧嘿嘿。

二、部分函数提要

1.光标定位

由于这个程序并没有应用到 eazyX 的图形库 (为什么vscode装不了呜呜呜) ,所以需要另外的函数来进行界面内光标的定位来进行具体位置的绘制。

// 光标定位
void gotoxy(int x,int y)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    //取句柄COORD coord;    //设置光标coord.X = x;coord.Y = y;SetConsoleCursorPosition(handle, coord); //定位到handle这个窗口,把光标移到coord坐标
}

需要深入了解的话参考以下:
       https://baike.baidu.com/item/SetConsoleCursorPosition/575826>
       https://baike.baidu.com/item/GetStdHandle/6909878?fr=aladdin
       https://baike.baidu.com/item/coord/4594820?fr=aladdin


2.Windows界面设置

谁不想让自己写的程序好看点,所以这边调用了系统函数进行黑框框的美化(没有图形库最大的美化只能这样了 ╮(╯_╰)╭ )

// CMD图形界面设置
void WindowsInterface()
{system("color 87");system("title Greedy Snake V1.4");system("mode con:cols=120 lines=29");
}

另外关于system(“color xx”)函数:
第一个为背景色,第二个为字体颜色
0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 湖蓝色   B = 淡浅绿色
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色
( 试了一个小时还是前白后灰最好看 )


三、主要模块

1. 库函数、变量与函数定义

所需的库函数、定义的变量及结构体如下

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<conio.h>
#include<time.h>
#define maphigh 28              //定义墙的长宽
#define mapwide 84
unsigned short Snake_size = 500, Snake_speed = 150, Snake_lenth = 3, key = 'w';   //初始化相关
int Scores = 0, fruitBonus = 3, BigfruitBonus = 24;       //与分数有关
int coodr = 12;            //与菜单控制有关
struct fruit        //小果子相关
{int number;int x;int y;
}fruit;
struct Bigfruit     //奖励果子相关
{int number;int x;int y;
}Bigfruit;
struct snake        //蛇主体相关
{int x[500];int y[500];int len;int speed;
}snake;int Deathjudge();
void Menu();
void Game();
void VertionInformation();
void WindowsInterface();
void gotoxy(int x,int y);
void drawmenu();
void drawmap();
void ClearMenu();
void ClearGames();
void control();
void Initialize();
void creatfruit();
void CreatBigFruit();
void Score();
//以上是所需的库函数与定义

2. 游戏主体

游戏的主体主要由绘制、控制、果子生成以及死亡判定组成。先附上游戏主体的主函数:

// 游戏主程序
void Game()
{Initialize();for(;;)                           //空循环实现不断运行游戏(游戏结束不关闭){system("cls");               //系统清屏函数drawmap();                  //游戏初始界面绘制getch();for(;;){control();                //控制函数creatfruit();         //果子生成函数(包含奖励果子)Score();              //分数系统Sleep(Snake_speed);     //void sleep(int seconds),参数 seconds为要暂停的毫秒数。if (!Deathjudge())     //死亡条件,死亡时 Deathjudge = 0{gotoxy(mapwide/2,maphigh/2);printf("GAME OVER!!!");getchar();break;               //游戏结束时开启新一轮循环}}}
}

2.1  绘制部分

绘制部分 利用打印与刷新来保证内容显示不出错,以下是初始界面绘制:

// 绘制游戏界面
void drawmap()
{int i,k;//绘制地图for ( i = 0; i <= mapwide; i += 2)      //绘制上下边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++)         //绘制左右边界{gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}//绘制蛇snake.len = Snake_lenth;snake.speed = Snake_speed;snake.x[0] = mapwide/2;snake.y[0] = maphigh/2;gotoxy(snake.x[0],snake.y[0]);          //蛇头printf("█");for ( k = 1; k < snake.len; k++)        //蛇身{snake.x[k] = snake.x[k - 1] + 2;snake.y[k] = snake.y[k - 1];gotoxy(snake.x[k],snake.y[k]);printf("█");}srand((unsigned int)time(NULL));        //srand()与rand()函数随机生成果子位置while(1){fruit.x = rand() % (mapwide - 4 ) + 1;       // + 1 与果子的符号所占的字符有关fruit.y = rand() % (maphigh - 2 ) + 1;if (fruit.x % 2 == 0)break;}gotoxy(fruit.x,fruit.y);              //绘制小果子printf("*");//右侧内容标注gotoxy(mapwide + 8, 6);                   //移动到右侧标注位置printf(" W");gotoxy(mapwide + 6, 8);printf("A  S  D    进行控制");gotoxy(mapwide + 6, 12);printf("按 '空格' 以暂停");gotoxy(mapwide + 6, 18);printf("Scores : %d",Scores);
}

以下部分是 游戏界面刷新 ,由于绘制会产生显示残留,目前所掌握的知识也没有更好的办法,所以就只能通过刷新后再绘制来进行消除显示残留,希望后续有大佬可以优化一下,代码如下:

// 刷新游戏界面(清屏并绘制常驻信息)
void ClearGames()
{int i,k;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(snake.x[0],snake.y[0]);          //绘制蛇printf("█");for ( k = 1; k < snake.len; k++){gotoxy(snake.x[k],snake.y[k]);printf("█");}gotoxy(fruit.x,fruit.y);                //绘制果子printf("*");gotoxy(mapwide + 8, 6);                 //绘制右侧信息printf(" W");gotoxy(mapwide + 6, 8);printf("A  S  D    进行控制");gotoxy(mapwide + 6, 12);printf("按 '空格' 以暂停");gotoxy(mapwide + 6, 18);printf("Scores : %d",Scores);
}

2.2  控制部分

控制模块由 _kihit()函数与 _getch()函数配合if 语句构成。当键盘键入WASD或空格时进行对应操作。

// 控制模块
void control()
{int i,temp;if (_kbhit())           //kbhit函数监控当前是否有键盘输入{fflush(stdin);      //清空缓冲区temp = _getch();if((temp == 'a' || temp == 'A') && (key !='D' && key !='d')) //防止反方向输入导致自杀{key = temp;}if((temp == 'd' || temp == 'D') && (key !='a' && key !='A')){key = temp;}if((temp == 'w' || temp == 'W') && (key !='S' && key !='s')){key = temp;}if((temp == 's' || temp == 'S') && (key !='w' && key !='W')){key = temp;}if((temp == ' '))        //实现键入'空格'暂停{getch();}}gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);     //删去蛇的最后一节printf("  ");for ( i = snake.len-1 ; i>0 ; i-- ){snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];}switch (key){case 'w':case 'W':snake.y[0]--;break;case 's':case 'S':snake.y[0]++;break;case 'a':case 'A':snake.x[0]-=2;break;case 'd':case 'D':snake.x[0]+=2;break;}gotoxy(snake.x[0],snake.y[0]);printf("█");
}

2.3  果子生成

果子生成分为小果子与奖励果子,均通过srand()函数与rand()函数实现随机生成,由于先前绘制游戏界面时已生成小果子,所以只需要进行生成新果子即可,小果子生成代码如下:

void creatfruit()
{if(snake.x[0] == fruit.x && snake.y[0] == fruit.y)        //当蛇吃掉小果子{snake.len++;fruit.number++;snake.speed -= 1;          //使身长越长速度越快Bigfruit.x = 0;            //防止大果子一直存在(小果子被吃掉时大果子消失)Bigfruit.y = 0;if(fruit.number %5 == 0)  //当吃掉 5个小果子时,生成一个奖励果子{CreatBigFruit();}srand((unsigned)time(NULL));while(1){int tag = 1;fruit.x = rand() % (mapwide - 4 ) + 1;fruit.y = rand() % (maphigh - 2 ) + 1;for (int k = 0; k < snake.len; k++)         //防止fruit生成在蛇身上{if (snake.x[k] == fruit.x && snake.y[k] == fruit.y)     //判断是否在蛇身上{tag = 0;break;}}if (tag == 1 && fruit.x %2 ==0)break;     //仅有当tag = 1时的小果子坐标才会被应用}}gotoxy(fruit.x,fruit.y);                     //取小果子坐标并打印printf("*");if(snake.x[0] == Bigfruit.x && snake.y[0] == Bigfruit.y)        //当蛇吃大果子时{// printf("\a");snake.len+=2;Bigfruit.number++;snake.speed -= 2;ClearGames();           //刷新函数,防止果子被吃掉后仍残留在屏幕上Bigfruit.x = 0;Bigfruit.y = 0;}
}

此外,生成奖励果子的代码如下:

// 生成奖励果子(原理同上)
void CreatBigFruit()
{int ret = 1;srand((unsigned)time(NULL));while(1){Bigfruit.x = rand() % (mapwide- 8) + 2;Bigfruit.y = rand() % (maphigh- 4) + 2;for (int k = 0; k < snake.len; k++)         //防止 Bigfruit生成在蛇身上{if (snake.x[k] == Bigfruit.x && snake.y[k] == Bigfruit.y)     //判断是否在蛇身上{ret = 0;break;}}if (ret == 1 && Bigfruit.x %2 ==0)break;}gotoxy(Bigfruit.x,Bigfruit.y);printf("★");
}

2.4  死亡判定

死亡判断较简单,仅需判断 蛇头坐标墙体蛇身 是否重合即可。

// 死亡判定
int Deathjudge()
{int ret;if ((snake.x[0] == 0 || snake.x[0] == mapwide) || (snake.y[0] == 0 || snake.y[0] == maphigh))return 0;for (int i = 1; i < snake.len; i++){if(snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i])return 0;}return 1;
}

3. 初始菜单

首先绘制初始的菜单界面,由于箭头光标进行上下移动时会产生显示残留,所以需要一个菜单的刷新函数,最后就是菜单光标的控制

3.1  绘制菜单

绘制初始菜单界面,代码如下:

// 绘制菜单界面
void drawmenu()
{int i;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(mapwide + 9, 2);                    //绘制右侧信息栏printf("Greedy Snake V1.4");gotoxy(mapwide + 8, 6);printf("按 W 或 S 进行控制.");gotoxy(mapwide + 9, 8);printf("按 空格 进行选择.");gotoxy(mapwide + 9, coodr);printf("->");gotoxy(mapwide + 13, coodr);printf("开始游戏");gotoxy(mapwide + 13, coodr + 3);printf("版本信息");gotoxy(mapwide + 13, coodr + 6);printf("退出游戏");
}

3.2  刷新菜单

防止光标移动后在原先位置留下残留,刷新界面后绘制常驻信息

void ClearMenu()
{int i;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);    printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(mapwide + 9, 2);                    //右侧信息栏printf("Greedy Snake V1.4");gotoxy(mapwide + 8, 6);printf("按 W 或 S 进行控制.");gotoxy(mapwide + 9, 8);printf("按 空格 进行选择.");gotoxy(mapwide + 13, coodr);printf("开始游戏");gotoxy(mapwide + 13, coodr + 3);printf("版本信息");gotoxy(mapwide + 13, coodr + 6);printf("退出游戏");
}

3.4  菜单控制

为了还原诺基亚的感觉, 菜单 的实现并没有直接使用switch语句接收键盘输入的数字,而是用_kbhit() 函数监控键盘输入来实现键入特定字符来上下移动"光标" 与功能选择。

void Menu()
{int i = 1, end = 3;int temp;drawmenu();         //绘制菜单for (;;)            //光标控制{if (_kbhit()){fflush(stdin);temp = _getch();if(temp == 'w' || temp == 'W')     //当检测到输入w时{if(i>1 && i<= end){ClearMenu();           //刷新菜单界面i--;gotoxy(mapwide + 7,coodr + 3*(i-1));printf("  ");printf("->");}}if(temp == 's' || temp == 'S')     //当检测到输入s时{if(i>=1 && i< end){ClearMenu();i++;gotoxy(mapwide + 7,coodr + 3*(i-1));printf("  ");printf("->");}}if(temp == ' ')         //空格选择功能{break;}}}switch (i){case 1:Game();break;case 2:VertionInformation();return Menu();             //回到菜单case 3:exit(0);                   //自带的退出程序函数}
}

4. 主函数入口

由于添加了菜单界面,所以主函数入口应该从菜单进入以保持循环不断。

int main()
{WindowsInterface();            //设置 CMD 参数Menu();return 0;
}

5. 源代码

全部源代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<conio.h>
#include<time.h>
#define maphigh 28
#define mapwide 84
unsigned short Snake_size = 500, Snake_speed = 150, Snake_lenth = 3, key = 'w';
int Scores = 0, fruitBonus = 3, BigfruitBonus = 24, coodr = 12;
char vertion[15] = "V1.4";
struct fruit
{int number;int x;int y;
}fruit;
struct Bigfruit
{int number;int x;int y;
}Bigfruit;
struct snake
{int x[500];int y[500];int len;int speed;
}snake;int Deathjudge();
void Menu();
void Game();
void VertionInformation();
void WindowsInterface();
void gotoxy(int x,int y);
void drawmenu();
void drawmap();
void ClearMenu();
void ClearGames();
void control();
void Initialize();
void creatfruit();
void CreatBigFruit();
void Score();int main()
{WindowsInterface();Menu();return 0;
}/************************************************************************************/
// 游戏主程序
void Game()
{Initialize();for(;;){system("cls");drawmap();getch();for(;;){control();creatfruit();Score();Sleep(Snake_speed);     //void sleep(int seconds),参数 seconds 为要暂停的毫秒数。if (!Deathjudge())     //死亡时Deathjudge = 0{gotoxy(mapwide/2,maphigh/2);printf("GAME OVER!!!");getchar();break;}}}
}
/************************************************************************************/
// CMD图形界面设置
void WindowsInterface()
{system("color 87");system("title Greedy Snake V1.4");system("mode con:cols=120 lines=29");
}
/************************************************************************************/
// 初始化
void Initialize()
{fruit.number = 0;Bigfruit.number = 0;
}
/************************************************************************************/
// 光标定位
void gotoxy(int x,int y)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    //取句柄COORD coord;    //设置光标coord.X = x;coord.Y = y;SetConsoleCursorPosition(handle, coord); //定位到handle这个窗口,把光标移到coord坐标
}
/************************************************************************************/
// 绘制游戏界面
void drawmap()
{int i,k;//绘制地图for ( i = 0; i <= mapwide; i += 2)      //绘制上下边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++)         //绘制左右边界{gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}//绘制蛇snake.len = Snake_lenth;snake.speed = Snake_speed;snake.x[0] = mapwide/2;snake.y[0] = maphigh/2;gotoxy(snake.x[0],snake.y[0]);          //蛇头printf("█");for ( k = 1; k < snake.len; k++)        //蛇身{snake.x[k] = snake.x[k - 1] + 2;snake.y[k] = snake.y[k - 1];gotoxy(snake.x[k],snake.y[k]);printf("█");}srand((unsigned int)time(NULL));        //随机生成果子位置while(1){fruit.x = rand() % (mapwide - 4 ) + 1;       // + 1 与 * 所占的字符有关fruit.y = rand() % (maphigh - 2 ) + 1;if (fruit.x % 2 == 0)break;}gotoxy(fruit.x,fruit.y);printf("*");//右侧标注gotoxy(mapwide + 8, 6);printf(" W");gotoxy(mapwide + 6, 8);printf("A  S  D    进行控制");gotoxy(mapwide + 6, 12);printf("按 '空格' 以暂停");gotoxy(mapwide + 6, 18);printf("Scores : %d",Scores);
}
/************************************************************************************/
// 刷新游戏
void ClearGames()
{int i,k;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(snake.x[0],snake.y[0]);          //绘制蛇printf("█");for ( k = 1; k < snake.len; k++){gotoxy(snake.x[k],snake.y[k]);printf("█");}gotoxy(fruit.x,fruit.y);                //绘制果子printf("*");gotoxy(mapwide + 8, 6);                 //绘制右侧信息printf(" W");gotoxy(mapwide + 6, 8);printf("A  S  D    进行控制");gotoxy(mapwide + 6, 12);printf("按 '空格' 以暂停");gotoxy(mapwide + 6, 18);printf("Scores : %d",Scores);
}
/************************************************************************************/
// 绘制菜单界面
void drawmenu()
{int i;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(mapwide + 9, 2);printf("Greedy Snake V1.4");gotoxy(mapwide + 8, 6);printf("按 W 或 S 进行控制.");gotoxy(mapwide + 9, 8);printf("按 空格 进行选择.");gotoxy(mapwide + 9, coodr);printf("->");gotoxy(mapwide + 13, coodr);printf("开始游戏");gotoxy(mapwide + 13, coodr + 3);printf("版本信息");gotoxy(mapwide + 13, coodr + 6);printf("退出游戏");
}
/************************************************************************************/
// 刷新菜单
void ClearMenu()
{int i;system("cls");for ( i = 0; i <= mapwide; i += 2)      //绘制边界{gotoxy(i, 0);printf("█");gotoxy(i, maphigh);printf("█");}for ( i = 0; i <= maphigh; i++){gotoxy(0,i);    printf("█");gotoxy(mapwide,i);printf("█");}gotoxy(mapwide + 9, 2);printf("Greedy Snake V1.4");gotoxy(mapwide + 8, 6);printf("按 W 或 S 进行控制.");gotoxy(mapwide + 9, 8);printf("按 空格 进行选择.");gotoxy(mapwide + 13, coodr);printf("开始游戏");gotoxy(mapwide + 13, coodr + 3);printf("版本信息");gotoxy(mapwide + 13, coodr + 6);printf("退出游戏");
}
/************************************************************************************/
// 菜单控制
void Menu()
{int i = 1, end = 3;int temp;drawmenu();         //绘制菜单for (;;)            //光标控制{if (_kbhit()){fflush(stdin);temp = _getch();if(temp == 'w' || temp == 'W'){if(i>1 && i<= end){ClearMenu();i--;gotoxy(mapwide + 7,coodr + 3*(i-1));printf("  ");printf("->");}}if(temp == 's' || temp == 'S'){if(i>=1 && i< end){ClearMenu();i++;gotoxy(mapwide + 7,coodr + 3*(i-1));printf("  ");printf("->");}}if(temp == ' ')         //空格选择{break;}}}switch (i){case 1:Game();break;case 2:VertionInformation();return Menu();case 3:exit(0);}
}
/************************************************************************************/
// 生成新果子
void creatfruit()
{if(snake.x[0] == fruit.x && snake.y[0] == fruit.y)        //当蛇吃掉小果子{snake.len++;fruit.number++;snake.speed -= 2;Bigfruit.x = 0;            //防止大果子一直存在(小果子被吃掉时大果子消失)Bigfruit.y = 0;if(fruit.number %5 == 0){CreatBigFruit();}srand((unsigned)time(NULL));while(1){int tag = 1;fruit.x = rand() % (mapwide - 4 ) + 1;fruit.y = rand() % (maphigh - 2 ) + 1;for (int k = 0; k < snake.len; k++)         //防止fruit生成在蛇身上{if (snake.x[k] == fruit.x && snake.y[k] == fruit.y)     //判断是否在蛇身上{tag = 0;break;}}if (tag == 1 && fruit.x %2 ==0)break;}}gotoxy(fruit.x,fruit.y);printf("*");if(snake.x[0] == Bigfruit.x && snake.y[0] == Bigfruit.y)        //当蛇吃大果子时{snake.len+=2;Bigfruit.number++;snake.speed -= 3;ClearGames();           //防止果子被吃掉后仍残留在屏幕上Bigfruit.x = 0;Bigfruit.y = 0;}
}
/************************************************************************************/
// 生成奖励果子
void CreatBigFruit()
{int ret = 1;srand((unsigned)time(NULL));while(1){Bigfruit.x = rand() % (mapwide- 8) + 2;Bigfruit.y = rand() % (maphigh- 4) + 2;for (int k = 0; k < snake.len; k++)         //防止fruit生成在蛇身上{if (snake.x[k] == Bigfruit.x && snake.y[k] == Bigfruit.y)     //判断是否在蛇身上{ret = 0;break;}}if (ret == 1 && Bigfruit.x %2 ==0)break;}gotoxy(Bigfruit.x,Bigfruit.y);printf("★");
}
/************************************************************************************/
// 控制模块
void control()
{int i,temp;if (_kbhit())           //kbhit函数检查当前是否有键盘输入,若有则返回一个非0值,否则返回0{fflush(stdin);      //清空缓冲区temp = _getch();if((temp == 'a' || temp == 'A') && (key !='D' && key !='d'))        //防止反方向导致自杀{key = temp;}if((temp == 'd' || temp == 'D') && (key !='a' && key !='A')){key = temp;}if((temp == 'w' || temp == 'W') && (key !='S' && key !='s')){key = temp;}if((temp == 's' || temp == 'S') && (key !='w' && key !='W')){key = temp;}if((temp == ' ')){getch();}}gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);     //删去最后一节printf("  ");for ( i = snake.len-1 ; i>0 ; i-- ){snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];}switch (key){case 'w':case 'W':snake.y[0]--;break;case 's':case 'S':snake.y[0]++;break;case 'a':case 'A':snake.x[0]-=2;break;case 'd':case 'D':snake.x[0]+=2;break;}gotoxy(snake.x[0],snake.y[0]);printf("█");gotoxy(mapwide + 2,0);          //移走光标
}
/************************************************************************************/
// 死亡判定
int Deathjudge()
{int ret;if ((snake.x[0] == 0 || snake.x[0] == mapwide) || (snake.y[0] == 0 || snake.y[0] == maphigh))return 0;for (int i = 1; i < snake.len; i++){if(snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i])return 0;}return 1;
}// 分数系统
void Score()
{Scores = fruit.number *fruitBonus + Bigfruit.number*BigfruitBonus;gotoxy(mapwide + 6, 18);printf("Scores : %d",Scores);
}
/************************************************************************************/
// 版本信息
void VertionInformation()
{ClearMenu();gotoxy(28,6);printf("\tGreedy Snake");gotoxy(28,9);printf("作者:北");gotoxy(28,12);printf("更新时间:2020.11.29");gotoxy(28,15);printf("版本:V1.4");gotoxy(28,18);printf("版本说明: 1.更新初始菜单界面");gotoxy(28,20);printf("\t      2.修复奖励果子一直存在的BUG");getch();
}

总结

贪吃蛇这个小程序对于初学者而言,是个很好的练手目标,编写它花费了大约四天时间,其中调试占用了绝大多数的时间。期间也会遇到很多令人崩溃的难点,但是现在的互联网完全有能力让你自主解决这些问题,当你不断解决一个个出现的问题后,你就能显著的发现你的能力提升了不少,今后希望可以继续上手不同的项目,不断提升自己的能力

一个C语言编写的贪吃蛇小游戏(含美化)相关推荐

  1. 一个C语言编写的贪吃蛇游戏

    在VC6.0平台上,通过C语言和EasyX图形库编写的贪吃蛇小游戏,为了使用图形库函数,建立的文件是.cpp文件,使用的是C语言编写,游戏具有背景音乐,代码长度500行左右,代码和算法,都是我自己源生 ...

  2. c语言贪吃蛇打包到桌面,C语言实现桌面贪吃蛇小游戏

    本篇写的是桌面贪吃蛇小游戏,大家自己看吧,感谢大家的支持,谢谢!O(∩_∩)O~~ #define _CRT_SECURE_NO_WARNINGS #include #include #include ...

  3. 0基础C语言实战项目-贪吃蛇小游戏

    大家好啊,如果有一样是编程0基础的大一本科生,相信大家现在都对自己学习了一段时间的程序设计课程还没有过实战经验: 最近也是考试刚完,持着练手的心态我编写了这样一个经典的小游戏-贪吃蛇: 由于是第一次发 ...

  4. 贪吃蛇c加加代码_C语言实现的贪吃蛇小游戏

    学习完C语言基础后,当然要做点小东西来巩固一下知识啦~~,之前做的学生信息管理系统是比较小的,搞定之后决定还是做个贪吃蛇的小游戏,这是学习C语言的经典入门小程序,下面简单地说下用C语言开发这个需要用到 ...

  5. 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...

  6. java贪吃蛇_如何用Java还原童年回忆?在线教你完成贪吃蛇小游戏

    今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现. 额,不好意思,放错了,重来 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的.因此,第一步 ...

  7. Java实现贪吃蛇小游戏(附完整源码)

    今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现. 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的.因此,第一步就是写一个小界面. 实现代码 ...

  8. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

  9. 10分钟用python编写贪吃蛇小游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏...

    贪吃蛇,大家应该都玩过.当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最主要 ...

最新文章

  1. webBrowse无法正常显示Excel
  2. 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
  3. PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
  4. SSM整合Shiro进行登陆认证和授权详细配置
  5. php建站静态,php网站如何生成静态
  6. java xml字符串提取元素,如何从Java中将子元素从XML提取到字符串?
  7. ZStack张鑫:面对混合云浪潮 我们主动出击
  8. 开发怼产品,天经地义?大惊小怪?
  9. modprobe:用于向内核中加载模块或者从内核中移除模块。
  10. 在linux系统中如何查看cpu,Linux中如何查看CPU的信息
  11. 并发计算 VS 并行计算
  12. [SAP ABAP开发技术总结]以二进制、字符模式下载文件
  13. 中文的习题解答中国人看懂, 英文的习题解答外国人能看懂
  14. 游戏开发中的脚本语言
  15. 数据库系统概论:ER图设计
  16. 微信公众平台、微信开放平台、微信商户平台的区别
  17. XMU 1614 刘备闯三国之三顾茅庐(二) 【逆向思维+二维并查集】
  18. 福特汉姆计算机专业,福特汉姆大学计算机如何
  19. MySQL - 调优(一)
  20. Linux命令zip:压缩文件夹时,排除指定文件或文件夹

热门文章

  1. 实现pdf.js批注功能(高亮文本/下划线/导入导出)
  2. 卡尔维诺的《分成两半的子爵》
  3. 惠普打印机136a 136w 136nw的区别
  4. 手机适配之 dimen 基础知识
  5. 如何优雅地进行撕逼营销
  6. Windows网络服务管理
  7. IS-IS协议原理和配置 与OSPF
  8. 索引顺序表查找算法(分块查找)
  9. 归约、分组与分区,深入讲解JavaStream终结操作
  10. 【观察】知行合一,混合云如何赋能创新?