C语言实现简单的贪吃蛇小游戏

本文实例为大家分享了C语言实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

#温馨提示:以下设计在VS2019下完美运行,完整代码附在末尾,供大家学习参考

(1)游戏进入界面(动态读取以及温馨提示)

void loading()//动态加载图
{
 int j;
 gotoxy(43, 11);
 printf("Loading...");
 gotoxy(39, 13);
 printf("□□□□□□□□");
 gotoxy(39, 13);
 for (j = 8; j >= 0; j--)
 {
  HideCursor();
  Sleep(200);
  printf("\033[40;35m■\033[0m");
 }
 gotoxy(43, 11);
 printf("          ");
 gotoxy(39, 13);
 printf("                          ");
 gotoxy(39, 9);
 printf("欢迎来到贪吃蛇世界!");
 gotoxy(22, 14);
 printf("抵制不良游戏  拒绝盗版游戏  注意自我保护  谨防受骗上当");
 gotoxy(22, 16);
 printf("适度游戏益脑  沉迷游戏伤身  合理安排时间  享受健康生活");
 Sleep(1500);
}

(2)菜单界面

void menu(int a)
{
 HideCursor();
 gotoxy(11, 3);
 printf("\033[40;37m                         _________________________  ||                                   \033[0m");
 gotoxy(11, 4);
 printf("\033[40;33m                       //=====================      ||   //                              \033[0m");
 gotoxy(11, 5);
 printf("\033[40;37m                      //                            ||  //                               \033[0m");
 gotoxy(11, 6);
 printf("\033[40;37m                      \\\\                  __        || //                              \033[0m");
 gotoxy(11, 7);
 printf("\033[40;33m                       \\\\                //\\\\       ||//                             \033[0m");
 gotoxy(11, 8);
 printf("\033[40;33m                       //               //  \\\\      ||\\\\        =====                \033[0m");
 gotoxy(11, 9);
 printf("\033[40;37m                      //    ==         //    \\\\     || \\\\     //      \\\\           \033[0m");
 gotoxy(11, 10);
 printf("\033[40;37m _ _ _ ____          //   //  \\\\      //======\\\\    ||  \\\\   ||=========           \033[0m");
 gotoxy(11, 11);
 printf("\033[40;33m- - - -----\\\\_______//   //    \\\\    //        \\\\   ||   \\\\  ||                  \033[0m");
 gotoxy(11, 12);
 printf("\033[40;35m            \\-------/   //      \\\\  //          \\\\  ||    \\\\  \\\\________________\033[0m");
 gotoxy(39, 6);
 printf("\033[40;36m②○②○\033[0m");
 gotoxy(2, 15);
 printf("\033[40;33m—————————————————————————————————————————————————\033[1m");

 gotoxy(2, 18);
 printf("                      1.开始游戏                              2.游戏设置");
 gotoxy(2, 20);
 printf("                      3.游戏说明                              4.退出游戏");

 switch (a) {
 case 1: gotoxy(22, 18); break;
 case 2: gotoxy(62, 18); break;
 case 3: gotoxy(22, 20); break;
 case 4: gotoxy(62, 20); break;
 }
 printf("\033[40;36m◇\033[0m");
 return;
}

(3)菜单选择

void chose()//菜单选择
{
 ii = 1;
 fflush(stdin);
 frame(2);
 menu(ii);
 while (ii != 5)
 {
  (void)_getch();
  if (GetAsyncKeyState(VK_DOWN) & 0x8000)//下
  {
   if (ii == 1)
    ii = 3;
   else if (ii == 2)
    ii = 4;
  }
  if (GetAsyncKeyState(VK_UP) & 0x8000)//上
  {
   if (ii == 3)
    ii = 1;
   else if (ii == 4)
    ii = 2;
  }
  if (GetAsyncKeyState(VK_LEFT) & 0x8000)//左
  {
   if (ii == 2)
    ii = 1;
   else if (ii == 4)
    ii = 3;
  }
  if (GetAsyncKeyState(VK_RIGHT) & 0x8000)//右
  {
   if (ii == 1)
    ii = 2;
   else if (ii == 3)
    ii = 4;
  }
  menu(ii);
  Sleep(150);//缓冲
  if (GetAsyncKeyState(VK_RETURN) & 0x0D)//确认
  {
   fflush(stdin);
   return;
  }
 }
}

(4)障碍物与地图

void obstacle() //障碍物
{   //IOT地图
 int sup_mapx1[68] = { 16,18,20,22,24,20,20,20,20,20,20,16,18,20,22,24,36,38,40,42,44,36,44,36,44,36,44,36,44,36,44,36,44,36,38,40,42,44,56,58,60,62,64,60,60,60,60,60,60,60 };
 int sup_mapy1[68] = {  8, 8, 8, 8, 8, 9,10,11,12,13,14,15,15,15,15,15, 8, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,15,15,15, 8, 8, 8, 8, 8, 9,10,11,12,13,14,15 };
     //ZHKU地图
 int sup_mapx2[77] = { 10,12,14,16,18,20,20,18,16,14,12,10,10,12,14,16,18,20,28,28,28,28,28,28,28,28,30,32,34,36,36,36,36,36,36,36,36,44,44,44,44,44,44,44,44,46,48,48,50,52,50,52,60,60,60,60,60,60,60,60,62,64,66,68,70,70,70,70,70,70,70,70,18,12,46,46,48 };
    int sup_mapy2[77] = {  9, 9, 9, 9, 9, 9,10,11,12,13,14,15,16,16,16,16,16,16, 9,10,11,12,13,14,15,16,12,12,12, 9,10,11,12,13,14,15,16, 9,10,11,12,13,14,15,16,12,11,13,10, 9,14,15, 9,10,11,12,13,14,15,16,16,16,16,16, 9,10,11,12,13,14,15,16,10,15,11,13,12 };
 if (map == 2)//困难
  j = 5;
 if (map == 3)//地狱
  j = 15;
 if (map == 4)//传说
  j = 30;
 if(map>1)
 for (i = 0; i < j; i++)//生成障碍物
 {
  obs.x[i] = rand() % 70 + 6;
  obs.y[i] = rand() % 20 + 3;
  if (obs.x[i] % 2 != 0)//优化出现的位置
   obs.x[i]--;
  if (obs.x[i] == food.x && obs.y[i] == food.y)//障碍物不能出现在初始食物上
  continue;
  if (obs.y[i] == 20)//初始方向上不出现障碍物
   i--;
 }
 else if (map == 0)
 {
  j = 68;
  for (i = 0; i < j; i++)//特别版地图1绘制
  {
   obs.x[i] = sup_mapx1[i];
   obs.y[i] = sup_mapy1[i];
  }
 }
 else if (map == -1)
 {
  j = 77;
  for (i = 0; i < j; i++)//特别版地图2绘制
  {
   obs.x[i] = sup_mapx2[i];
   obs.y[i] = sup_mapy2[i];
  }
 }
 if (map >1)
  for (i = 0; i < j; i++)//打印障碍物
  {
   gotoxy(obs.x[i], obs.y[i]);
   printf("\033[40;31m▲\033[0m");
  }
 else if(map==0)
  for (i = 0; i < 50; i++)//打印特别地图1
  {
   gotoxy(obs.x[i], obs.y[i]);
   if(i<16)
   printf("\033[40;31m■\033[0m");
   else if(i>37)
        printf("\033[40;34m■\033[0m");
          else printf("\033[40;32m■\033[0m");
  }
 else if(map==-1)
  for (i = 0; i < 72; i++)//打印特别地图2
  {
   gotoxy(obs.x[i], obs.y[i]);
   if(i<18)printf("\033[40;32m■\033[0m");
   if (i < 37 && i >= 18) printf("\033[40;33m■\033[0m");
   if(i>=37&&i<52) printf("\033[40;36m■\033[0m");
   if (i >=52)printf("\033[40;35m■\033[0m");
  }
}

(5)蛇的控制

void control()
{
 fflush(stdin);
 if (foodFlag == 0)//在蛇尾处输出空格即擦去蛇尾
 {
  gotoxy(snake.x[snake.length - 1], snake.y[snake.length - 1]);
  switch (tail) //尾巴痕迹选择功能
  {
  case 1:printf("  "); break;
  case 2:printf("~ "); break;
  case 3:printf("·"); break;
  }
 }
 for (i = snake.length - 1; i > 0; i--)//将蛇的每一节依次向前移动一节(蛇头除外)
 {
  snake.x[i] = snake.x[i - 1];
  snake.y[i] = snake.y[i - 1];
 }
 while (1)
 {
  if ((GetAsyncKeyState(VK_DOWN)) && vkflag != 2)//下
  {
   vkflag = 4; break;
  }
  if ((GetAsyncKeyState(VK_UP)) && vkflag != 4)//上
  {
   vkflag = 2; break;
  }
  if ((GetAsyncKeyState(VK_LEFT)) && vkflag != 3)//左
  {
   vkflag = 1; break;
  }
  if ((GetAsyncKeyState(VK_RIGHT)) && vkflag != 1)//右
  {
   vkflag = 3; break;
  }
  if (GetAsyncKeyState(VK_SPACE) && 0x20)//暂停功能
   while (1)
   {
    gotoxy(84, 16);
    printf("\033[40;36m游戏已经暂停\033[0m");
    Sleep(200);
    gotoxy(84, 16);
    printf("            "); //闪烁
    Sleep(150);
    if (GetAsyncKeyState(VK_SPACE) && 0x20)
     break;
   }
  break;
 }
 switch (vkflag)//方向
 {
 case 1: snake.x[0] -= 2; break;//左
 case 2: snake.y[0]--; break;//上
 case 3: snake.x[0] += 2; break;//右
 case 4: snake.y[0]++; break;//下
 }
 gotoxy(snake.x[0], snake.y[0]);//蛇头移动
 printf("◆");
 gotoxy(snake.x[1], snake.y[1]);//蛇身移动
 printf("■");
 foodFlag = 0;
 fflush(stdin);
 return;
}

(6)食物生成

void foodcreate()
{
 n++;//加速标记
 flag = 1;
    sorce += 10;//每个食物得10分
 if (sorce>=his_max )//最高分
 {
  his_max = sorce;
  gotoxy(82, 2);
  printf("                 ");
  gotoxy(82, 2);
  printf("★历史最高:%d", his_max);
 }
 gotoxy(82, 3);//本局得分
 printf("                 ");
 gotoxy(82, 3);
 printf("☆当前得分:%d", sorce);

 while (flag==1)//生成食物
 {
   food.x = rand() % 74 + 4;//随机选取食物的范围
   food.y = rand() % 24 + 1;
   if (food.x % 2 != 0 && flag == 1)//优化出现位置
   {
    food.x = food.x - 1;
    flag = 0;
   }
   if(map!=1)//非普通地图项
   for (i = 0; i < snake.length; i++)
   {
    for(m=0;m<j;m++)
     if (obs.x[m] == food.x && obs.y[m] == food.y)
     {
      flag = 1;
      break;
     }
   }
   for (i = 0; i < snake.length; i++)//不能在蛇的身体上生成食物
   {
    if (snake.x[i] == food.x && snake.y[i] == food.y)
    {
     flag = 1;
     break;
    }
   }
 }
    gotoxy(food.x, food.y); //生成食物
 printf("●");
 snake.length++;//吃到食物长度加1
 foodFlag = 1;//吃到食物尾部不清除
 return;
}

(7)死亡判断

int  dead()
{
 if (snake.y[0] == 0 || snake.y[0] == map_y-1)//上下边界死亡
  return 0;
 if (snake.x[0] == 0 || snake.x[0] == map_x-2)//左右边界死亡
  return 0;
 if(map!=1)//撞到障碍物死亡
 for (m = 0; m < j; m++)
  if (obs.x[m] == snake.x[0] && obs.y[m] == snake.y[0])
  {
   return 0;
  }
 for (i = 1; i < snake.length; i++)//咬到自身死亡
 {
 if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
  return 0;
 }
 if (GetAsyncKeyState(VK_ESCAPE)&0x1B)//ESC健返回死亡
 {
  ii = 5;
  return 0;
 }
 return 1;
}

(8)初始化游戏

void game()//初始化游戏
{
 int i ;
 n = 0;//重置状态
 vkflag = 1;
 sorce = 0;
 foodFlag = 0;
 system("cls");//初始清屏
 frame(1);//打印游戏框架(动态)
 gotoxy(82, 2);
 printf("★历史最高:%d", his_max);
 gotoxy(82, 3);
 printf("☆当前得分:%d", sorce);
 gotoxy(84, 8);
 printf("通过下面按键");
 gotoxy(85, 9);
 printf("\033[40;33m    ↑      \033[0m");
 gotoxy(85, 10);
 printf("\033[40;33m  ←  →    \033[0m");
 gotoxy(85, 11);
 printf("\033[40;33m    ↓      \033[0m");
 gotoxy(83, 12);
 printf("来控制蛇的方向");
 gotoxy(82, 18);
 printf("按空格键暂停/继续");
 gotoxy(83, 20);
 printf("按Shift键 加速");
 gotoxy(82, 22);
 printf("按ESC键返回菜单");

 snake.length = org_len;//初始化蛇(固定位置)
 snake.x[0] = 50 ;
 snake.y[0] = 20;
 gotoxy(snake.x[0], snake.y[0]);
 printf("◆");
 for (i = 1; i < snake.length; i++)//打印蛇
 {
  Sleep(25);
  snake.x[i] = snake.x[i - 1] + 2;
  snake.y[i] = snake.y[0];
  gotoxy(snake.x[i], snake.y[i]);
  printf("■");
 }
 if (map >=1)
 {
  food.x = rand() % 44 + 4;//初始化食物(左方出现)
  food.y = rand() % 24 + 1;
  if (food.x % 2 != 0)
   food.x = food.x - 1;
 }
 else {
  food.x = 14;//初始化食物(左方出现)
  food.y = 3;
 }
 gotoxy(food.x, food.y);//初始的食物闪烁
 printf("\033[40;37m●\033[0m");
 Sleep(250);
 gotoxy(food.x, food.y);
 printf("  ");
 Sleep(250);
 gotoxy(food.x, food.y);
 printf("\033[40;37m●\033[0m");
 Sleep(250);
 obstacle();
 while(ii==1) //运行
 {
  if (GetAsyncKeyState(VK_SHIFT))//加速功能
  {
   gotoxy(93, 20);
   printf("\033[40;31m加速\033[0m");//特效
  }
  else { Sleep(100);
  gotoxy(93, 20);
  printf("加速");
  }
  Sleep(speed - (changespeed * n));//变速模式
  control();//控制
  if (snake.x[0] == food.x && snake.y[0] == food.y)//吃掉食物
  foodcreate();
  if (dead() != 1) //判断是否结束游戏
  {
   gotoxy(36,12);
   printf("Game over");//结束显示
   gotoxy(36, 14);
   printf("  T _ T  ");
   Sleep(500);
   while (1)
   {
    gotoxy(32, 16);
    printf("请按Enter键返回主菜单");
    Sleep(150);

    if (GetAsyncKeyState(VK_RETURN) & 0x0D)//确认返回
    {
     fflush(stdin);
     ii = 5;
     return;
    }

   }
  }
 }
}

(9)游戏设置

void setup2()//设置显示(分析各种情况)
{
 gotoxy(34, 8);
 switch (org_len)//初始长度
 {
 case 2: printf("初始长度           ◆■           >"); break;
 case 3: printf("初始长度       <   ◆■■         >"); break;
 case 4: printf("初始长度       <   ◆■■■       >"); break;
 case 5: printf("初始长度       <   ◆■■■■     >"); break;
 case 6: printf("初始长度       <   ◆■■■■■   >"); break;
 case 7: printf("初始长度       <   ◆■■■■■■  "); break;
 }
 gotoxy(34, 10);
 switch (speed)//初始速度
 {
 case  50:printf("游戏初速度     <   较快    "); break;
 case 100:printf("游戏初速度     <   中等   >"); break;
 case 150:printf("游戏初速度         较慢   >"); break;
 }
 gotoxy(34, 12);
 switch (changespeed)//是否变速
 {
 case 0:printf("吃到食物加速        否    >"); break;
 case 5:printf("吃到食物加速   <    是     "); break;
 }
 gotoxy(34, 14);
 switch (tail)//尾巴选择
 {
 case 1:printf("当前尾巴痕迹        无    >"); break;
 case 2:printf("当前尾巴痕迹   <    ~     >"); break;
 case 3:printf("当前尾巴痕迹   <   ·      "); break;
 }
 gotoxy(34, 16);
 switch (map)//地图选择
 {
 case -1:printf("当前地图难度      特别版2 >"); break;
 case 0:printf("当前地图难度   <  特别版1 >"); break;
 case 1:printf("当前地图难度   <   普通   >"); break;
 case 2:printf("当前地图难度   <   困难   >"); break;
 case 3:printf("当前地图难度   <   地狱   >"); break;
 case 4:printf("当前地图难度   <   传说    "); break;
 }
    gotoxy(70, 22);
    printf("确定并返回菜单"); 

 for (i = 0; i < 7; i++)
 {
  gotoxy(31, 8 + 2 * i);
  printf("  ");
 }
 gotoxy(67, 22);
 printf("  ");
 switch (set_flag)
 {
 case 1:gotoxy(31,  8); break;
 case 2:gotoxy(31, 10); break;
 case 3:gotoxy(31, 12); break;
 case 4:gotoxy(31, 14); break;
 case 5:gotoxy(31, 16); break;
 case 6:gotoxy(67, 22); break;
 }
 printf("★");
 return;
}
void setup()//设置操作(改变全局变量)
{
 frame(2);
 set_flag=1;
 gotoxy(30, 3);
 printf("      ■■◆    游戏设置    ◆■■");
 gotoxy(26, 4);
 printf("■■■■■■                        ■■■■■■");
 setup2();
 fflush(stdin);
 while (1)
 {
  if (GetAsyncKeyState(VK_DOWN))//下
  {
   if (set_flag == 6)
    set_flag = 1;
   else set_flag++;
  }
  if (GetAsyncKeyState(VK_UP))//上
  {
   if (set_flag == 1)
    set_flag = 6;
   else set_flag--;
  }
  if (GetAsyncKeyState(VK_LEFT))//左
  {
   switch (set_flag)
   {
   case 1: if (org_len > 2)
    org_len--; break;
   case 2: if (speed < 150)
    speed += 50; break;
   case 3: if (changespeed == 5)
    changespeed = 0;break;
   case 4: if (tail > 1)
    tail--;break;
   case 5: if (map > -1)
    map--;break;
   case 6: break;
   }
  }
  if (GetAsyncKeyState(VK_RIGHT))//右
  {
   switch (set_flag)
   {
   case 1: if (org_len < 7)
    org_len++;break;
   case 2: if (speed > 50)
    speed -= 50;break;
   case 3: if (changespeed == 0)
    changespeed = 5;break;
   case 4: if (tail < 3)
    tail++;break;
   case 5: if (map < 4)
    map++;break;
   case 6:break;
   }
  }
  setup2();
  if ((GetAsyncKeyState(VK_RETURN)&0x0D)&&set_flag==6)
  {
   ii = 5;
   return;
  }
  Sleep(175);
 }
 return;
}

(10)游戏说明

void instructions()//游戏说明
{
 system("cls");
 frame(2);
 gotoxy(10, 3);
 printf("游戏说明:");
 gotoxy(18, 5);
 printf("一条蛇在封闭空间里,空间内随机出现一个食物,通过按键盘四个光标");
 gotoxy(18, 7);
 printf("键↑←↓→控制蛇向上下左右四个方向移动来获取食物食物,当食物被");
 gotoxy(18, 9);
 printf("吃掉,蛇身体长一节,同时记10分,接着又出现新的食物,如果蛇撞到");
 gotoxy(18, 11);
 printf("墙或蛇头撞到自己身体或撞到障碍物,游戏结束。");
 gotoxy(18, 15);
 printf("温馨提示:游戏过程中,可按Shift键加速,但不能同时按方向键,也");
 gotoxy(18, 17);
 printf("          可以按空格键来暂停游戏。                          ");
 gotoxy(60, 20);
 printf("按确认键返回主菜单");
 gotoxy(3, 23);
 printf("当前游戏版本 V1.0");
 while (1)//按确认键返回主菜单
 {
  Sleep(100);
  (void)_getch();
  if (GetAsyncKeyState(VK_RETURN))//确认
  {
   ii = 5;
   break;
  }
 }
}
void end()//游戏退出
{
 frame(2);
 gotoxy(44, 12);
 printf("游戏已退出");
 gotoxy(0, 26);
}

(11)直接贴完整代码

#include<stdio.h>
#include <stdlib.h>
#include<Windows.h>
#include <time.h>
#include<conio.h>

#define   SNAKE 300//蛇的最大节数
#define   KEYDOWN(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?1:0)//vk键会返回两次值,在这里筛选按下操作
#define   KEYUP(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?0:1)

int ii = 1, i, m, flag = 1, n = 0, set_flag = 1;//其他的全局变量(ii为菜单,n变速,set_flag设置,flag是否产生新食物标记)
int speed = 100, changespeed = 5, tail = 1, org_len = 5, map = 1;//速度、速度变化、尾巴痕迹、初始长度、地图难度
int vkflag = 1;//记录键盘
int sorce = 0, his_max = 0;//记录分数和历史最高分
int map_x = 80, map_y = 26;//边界
int foodFlag = 0;//吃到食物标记
int j;//障碍物数量

struct//定义蛇
{
 int length;//蛇的长度
 int x[SNAKE];//组成蛇身的每一个小方块中x的坐标
 int y[SNAKE];//组成蛇身的每一个小方块中y的坐标
}snake;
struct //定义食物节点
{
 int x, y;
} food;
struct //定义障碍物
{
 int x[77];
 int y[77];
}obs;

void gotoxy();//移动光标位置
void HideCurson();//隐藏光标
void frame(int a);//框架1/2
void loading();//(假)读取
void menu(int a);//菜单
void chose();//菜单选择
void obstacle();//障碍物
void control();//控制方向
void foodcreate();//创建食物
int  dead();//判断死亡
void game();//开始游戏
void setup2();//设置的更新
void setup();//设置参数的改变
void instructions();//游戏说明
void end();//游戏结束

void gotoxy(int x, int y) //调整光标
{
 COORD pos = { x,y };
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
 SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
void HideCursor()//隐藏光标
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void frame(int a)//初始化框
{
 int i, k;
 system("cls");
 gotoxy(78, 0);//横1
 for (k = 0; k <= 11; k++)
 {
  if (a == 1)
   Sleep(4);
  printf("\033[40;37m■\033[0m");
 }

 for (i = 0; i <= 25; i++)//右竖
 {
  if (a == 1)
   Sleep(4);
  gotoxy(100, i);
  printf("\033[40;37m■\033[0m");
 }

 for (k = 0; k <= 50; k++)//下横往左
 {
  if (a == 1)
   Sleep(4);
  gotoxy(100 - 2 * k, 25);
  printf("\033[40;37m■\033[0m");
 }
 for (i = 25; i >= 0; i--)//左竖向上
 {
  if (a == 1)
   Sleep(4);
  gotoxy(0, i);
  printf("\033[40;37m■\033[0m");
 }
 gotoxy(0, 0);
 for (k = 0; k <= 38; k++)//横2
 {
  if (a == 1)
   Sleep(4);
  printf("\033[40;37m■\033[0m");
 }
 if (a == 1)
  for (i = 0; i <= 25; i++)//分割竖
  {
   Sleep(6);
   gotoxy(78, i);
   printf("\033[40;37m■\033[0m");
  }
}
void loading()//动态加载图
{
 int j;
 gotoxy(43, 11);
 printf("Loading...");
 gotoxy(39, 13);
 printf("□□□□□□□□");
 gotoxy(39, 13);
 for (j = 8; j >= 0; j--)
 {
  HideCursor();
  Sleep(200);
  printf("\033[40;35m■\033[0m");
 }
 gotoxy(43, 11);
 printf("          ");
 gotoxy(39, 13);
 printf("                          ");
 gotoxy(39, 9);
 printf("欢迎来到贪吃蛇世界!");
 gotoxy(22, 14);
 printf("抵制不良游戏  拒绝盗版游戏  注意自我保护  谨防受骗上当");
 gotoxy(22, 16);
 printf("适度游戏益脑  沉迷游戏伤身  合理安排时间  享受健康生活");
 Sleep(1500);
}
void menu(int a)
{
 HideCursor();
 gotoxy(11, 3);
 printf("\033[40;37m                         _________________________  ||                                   \033[0m");
 gotoxy(11, 4);
 printf("\033[40;33m                       //=====================      ||   //                              \033[0m");
 gotoxy(11, 5);
 printf("\033[40;37m                      //                            ||  //                               \033[0m");
 gotoxy(11, 6);
 printf("\033[40;37m                      \\\\                  __        || //                              \033[0m");
 gotoxy(11, 7);
 printf("\033[40;33m                       \\\\                //\\\\       ||//                             \033[0m");
 gotoxy(11, 8);
 printf("\033[40;33m                       //               //  \\\\      ||\\\\        =====                \033[0m");
 gotoxy(11, 9);
 printf("\033[40;37m                      //    ==         //    \\\\     || \\\\     //      \\\\           \033[0m");
 gotoxy(11, 10);
 printf("\033[40;37m _ _ _ ____          //   //  \\\\      //======\\\\    ||  \\\\   ||=========           \033[0m");
 gotoxy(11, 11);
 printf("\033[40;33m- - - -----\\\\_______//   //    \\\\    //        \\\\   ||   \\\\  ||                  \033[0m");
 gotoxy(11, 12);
 printf("\033[40;35m            \\-------/   //      \\\\  //          \\\\  ||    \\\\  \\\\________________\033[0m");
 gotoxy(39, 6);
 printf("\033[40;36m②○②○\033[0m");
 gotoxy(2, 15);
 printf("\033[40;33m—————————————————————————————————————————————————\033[1m");

 gotoxy(2, 18);
 printf("                      1.开始游戏                              2.游戏设置");
 gotoxy(2, 20);
 printf("                      3.游戏说明                              4.退出游戏");

 switch (a) {
 case 1: gotoxy(22, 18); break;
 case 2: gotoxy(62, 18); break;
 case 3: gotoxy(22, 20); break;
 case 4: gotoxy(62, 20); break;
 }
 printf("\033[40;36m◇\033[0m");
 return;
}
void chose()//菜单选择
{
 ii = 1;
 fflush(stdin);
 frame(2);
 menu(ii);
 while (ii != 5)
 {
  (void)_getch();
  if (GetAsyncKeyState(VK_DOWN) & 0x8000)//下
  {
   if (ii == 1)
    ii = 3;
   else if (ii == 2)
    ii = 4;
  }
  if (GetAsyncKeyState(VK_UP) & 0x8000)//上
  {
   if (ii == 3)
    ii = 1;
   else if (ii == 4)
    ii = 2;
  }
  if (GetAsyncKeyState(VK_LEFT) & 0x8000)//左
  {
   if (ii == 2)
    ii = 1;
   else if (ii == 4)
    ii = 3;
  }
  if (GetAsyncKeyState(VK_RIGHT) & 0x8000)//右
  {
   if (ii == 1)
    ii = 2;
   else if (ii == 3)
    ii = 4;
  }
  menu(ii);
  Sleep(150);//缓冲
  if (GetAsyncKeyState(VK_RETURN) & 0x0D)//确认
  {
   fflush(stdin);
   return;
  }
 }
}
void obstacle() //障碍物
{   //IOT地图
 int sup_mapx1[68] = { 16,18,20,22,24,20,20,20,20,20,20,16,18,20,22,24,36,38,40,42,44,36,44,36,44,36,44,36,44,36,44,36,44,36,38,40,42,44,56,58,60,62,64,60,60,60,60,60,60,60 };
 int sup_mapy1[68] = {  8, 8, 8, 8, 8, 9,10,11,12,13,14,15,15,15,15,15, 8, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,15,15,15, 8, 8, 8, 8, 8, 9,10,11,12,13,14,15 };
     //ZHKU地图
 int sup_mapx2[77] = { 10,12,14,16,18,20,20,18,16,14,12,10,10,12,14,16,18,20,28,28,28,28,28,28,28,28,30,32,34,36,36,36,36,36,36,36,36,44,44,44,44,44,44,44,44,46,48,48,50,52,50,52,60,60,60,60,60,60,60,60,62,64,66,68,70,70,70,70,70,70,70,70,18,12,46,46,48 };
    int sup_mapy2[77] = {  9, 9, 9, 9, 9, 9,10,11,12,13,14,15,16,16,16,16,16,16, 9,10,11,12,13,14,15,16,12,12,12, 9,10,11,12,13,14,15,16, 9,10,11,12,13,14,15,16,12,11,13,10, 9,14,15, 9,10,11,12,13,14,15,16,16,16,16,16, 9,10,11,12,13,14,15,16,10,15,11,13,12 };
 if (map == 2)//困难
  j = 5;
 if (map == 3)//地狱
  j = 15;
 if (map == 4)//传说
  j = 30;
 if(map>1)
 for (i = 0; i < j; i++)//生成障碍物
 {
  obs.x[i] = rand() % 70 + 6;
  obs.y[i] = rand() % 20 + 3;
  if (obs.x[i] % 2 != 0)//优化出现的位置
   obs.x[i]--;
  if (obs.x[i] == food.x && obs.y[i] == food.y)//障碍物不能出现在初始食物上
  continue;
  if (obs.y[i] == 20)//初始方向上不出现障碍物
   i--;
 }
 else if (map == 0)
 {
  j = 68;
  for (i = 0; i < j; i++)//特别版地图1绘制
  {
   obs.x[i] = sup_mapx1[i];
   obs.y[i] = sup_mapy1[i];
  }
 }
 else if (map == -1)
 {
  j = 77;
  for (i = 0; i < j; i++)//特别版地图2绘制
  {
   obs.x[i] = sup_mapx2[i];
   obs.y[i] = sup_mapy2[i];
  }
 }
 if (map >1)
  for (i = 0; i < j; i++)//打印障碍物
  {
   gotoxy(obs.x[i], obs.y[i]);
   printf("\033[40;31m▲\033[0m");
  }
 else if(map==0)
  for (i = 0; i < 50; i++)//打印特别地图1
  {
   gotoxy(obs.x[i], obs.y[i]);
   if(i<16)
   printf("\033[40;31m■\033[0m");
   else if(i>37)
        printf("\033[40;34m■\033[0m");
          else printf("\033[40;32m■\033[0m");
  }
 else if(map==-1)
  for (i = 0; i < 72; i++)//打印特别地图2
  {
   gotoxy(obs.x[i], obs.y[i]);
   if(i<18)printf("\033[40;32m■\033[0m");
   if (i < 37 && i >= 18) printf("\033[40;33m■\033[0m");
   if(i>=37&&i<52) printf("\033[40;36m■\033[0m");
   if (i >=52)printf("\033[40;35m■\033[0m");
  }
}
void control()
{
 fflush(stdin);
 if (foodFlag == 0)//在蛇尾处输出空格即擦去蛇尾
 {
  gotoxy(snake.x[snake.length - 1], snake.y[snake.length - 1]);
  switch (tail) //尾巴痕迹选择功能
  {
  case 1:printf("  "); break;
  case 2:printf("~ "); break;
  case 3:printf("·"); break;
  }
 }
 for (i = snake.length - 1; i > 0; i--)//将蛇的每一节依次向前移动一节(蛇头除外)
 {
  snake.x[i] = snake.x[i - 1];
  snake.y[i] = snake.y[i - 1];
 }
 while (1)
 {
  if ((GetAsyncKeyState(VK_DOWN)) && vkflag != 2)//下
  {
   vkflag = 4; break;
  }
  if ((GetAsyncKeyState(VK_UP)) && vkflag != 4)//上
  {
   vkflag = 2; break;
  }
  if ((GetAsyncKeyState(VK_LEFT)) && vkflag != 3)//左
  {
   vkflag = 1; break;
  }
  if ((GetAsyncKeyState(VK_RIGHT)) && vkflag != 1)//右
  {
   vkflag = 3; break;
  }
  if (GetAsyncKeyState(VK_SPACE) && 0x20)//暂停功能
   while (1)
   {
    gotoxy(84, 16);
    printf("\033[40;36m游戏已经暂停\033[0m");
    Sleep(200);
    gotoxy(84, 16);
    printf("            "); //闪烁
    Sleep(150);
    if (GetAsyncKeyState(VK_SPACE) && 0x20)
     break;
   }
  break;
 }
 switch (vkflag)//方向
 {
 case 1: snake.x[0] -= 2; break;//左
 case 2: snake.y[0]--; break;//上
 case 3: snake.x[0] += 2; break;//右
 case 4: snake.y[0]++; break;//下
 }
 gotoxy(snake.x[0], snake.y[0]);//蛇头移动
 printf("◆");
 gotoxy(snake.x[1], snake.y[1]);//蛇身移动
 printf("■");
 foodFlag = 0;
 fflush(stdin);
 return;
}
void foodcreate()
{
 n++;//加速标记
 flag = 1;
    sorce += 10;//每个食物得10分
 if (sorce>=his_max )//最高分
 {
  his_max = sorce;
  gotoxy(82, 2);
  printf("                 ");
  gotoxy(82, 2);
  printf("★历史最高:%d", his_max);
 }
 gotoxy(82, 3);//本局得分
 printf("                 ");
 gotoxy(82, 3);
 printf("☆当前得分:%d", sorce);

 while (flag==1)//生成食物
 {
   food.x = rand() % 74 + 4;//随机选取食物的范围
   food.y = rand() % 24 + 1;
   if (food.x % 2 != 0 && flag == 1)//优化出现位置
   {
    food.x = food.x - 1;
    flag = 0;
   }
   if(map!=1)//非普通地图项
   for (i = 0; i < snake.length; i++)
   {
    for(m=0;m<j;m++)
     if (obs.x[m] == food.x && obs.y[m] == food.y)
     {
      flag = 1;
      break;
     }
   }
   for (i = 0; i < snake.length; i++)//不能在蛇的身体上生成食物
   {
    if (snake.x[i] == food.x && snake.y[i] == food.y)
    {
     flag = 1;
     break;
    }
   }
 }
    gotoxy(food.x, food.y); //生成食物
 printf("●");
 snake.length++;//吃到食物长度加1
 foodFlag = 1;//吃到食物尾部不清除
 return;
}
int  dead()
{
 if (snake.y[0] == 0 || snake.y[0] == map_y-1)//上下边界死亡
  return 0;
 if (snake.x[0] == 0 || snake.x[0] == map_x-2)//左右边界死亡
  return 0;
 if(map!=1)//撞到障碍物死亡
 for (m = 0; m < j; m++)
  if (obs.x[m] == snake.x[0] && obs.y[m] == snake.y[0])
  {
   return 0;
  }
 for (i = 1; i < snake.length; i++)//咬到自身死亡
 {
 if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
  return 0;
 }
 if (GetAsyncKeyState(VK_ESCAPE)&0x1B)//ESC健返回死亡
 {
  ii = 5;
  return 0;
 }
 return 1;
}
void game()//初始化游戏
{
 int i ;
 n = 0;//重置状态
 vkflag = 1;
 sorce = 0;
 foodFlag = 0;
 system("cls");//初始清屏
 frame(1);//打印游戏框架(动态)
 gotoxy(82, 2);
 printf("★历史最高:%d", his_max);
 gotoxy(82, 3);
 printf("☆当前得分:%d", sorce);
 gotoxy(84, 8);
 printf("通过下面按键");
 gotoxy(85, 9);
 printf("\033[40;33m    ↑      \033[0m");
 gotoxy(85, 10);
 printf("\033[40;33m  ←  →    \033[0m");
 gotoxy(85, 11);
 printf("\033[40;33m    ↓      \033[0m");
 gotoxy(83, 12);
 printf("来控制蛇的方向");
 gotoxy(82, 18);
 printf("按空格键暂停/继续");
 gotoxy(83, 20);
 printf("按Shift键 加速");
 gotoxy(82, 22);
 printf("按ESC键返回菜单");

 snake.length = org_len;//初始化蛇(固定位置)
 snake.x[0] = 50 ;
 snake.y[0] = 20;
 gotoxy(snake.x[0], snake.y[0]);
 printf("◆");
 for (i = 1; i < snake.length; i++)//打印蛇
 {
  Sleep(25);
  snake.x[i] = snake.x[i - 1] + 2;
  snake.y[i] = snake.y[0];
  gotoxy(snake.x[i], snake.y[i]);
  printf("■");
 }
 if (map >=1)
 {
  food.x = rand() % 44 + 4;//初始化食物(左方出现)
  food.y = rand() % 24 + 1;
  if (food.x % 2 != 0)
   food.x = food.x - 1;
 }
 else {
  food.x = 14;//初始化食物(左方出现)
  food.y = 3;
 }
 gotoxy(food.x, food.y);//初始的食物闪烁
 printf("\033[40;37m●\033[0m");
 Sleep(250);
 gotoxy(food.x, food.y);
 printf("  ");
 Sleep(250);
 gotoxy(food.x, food.y);
 printf("\033[40;37m●\033[0m");
 Sleep(250);
 obstacle();
 while(ii==1) //运行
 {
  if (GetAsyncKeyState(VK_SHIFT))//加速功能
  {
   gotoxy(93, 20);
   printf("\033[40;31m加速\033[0m");//特效
  }
  else { Sleep(100);
  gotoxy(93, 20);
  printf("加速");
  }
  Sleep(speed - (changespeed * n));//变速模式
  control();//控制
  if (snake.x[0] == food.x && snake.y[0] == food.y)//吃掉食物
  foodcreate();
  if (dead() != 1) //判断是否结束游戏
  {
   gotoxy(36,12);
   printf("Game over");//结束显示
   gotoxy(36, 14);
   printf("  T _ T  ");
   Sleep(500);
   while (1)
   {
    gotoxy(32, 16);
    printf("请按Enter键返回主菜单");
    Sleep(150);

    if (GetAsyncKeyState(VK_RETURN) & 0x0D)//确认返回
    {
     fflush(stdin);
     ii = 5;
     return;
    }

   }
  }
 }
}
void setup2()//设置显示(分析各种情况)
{
 gotoxy(34, 8);
 switch (org_len)//初始长度
 {
 case 2: printf("初始长度           ◆■           >"); break;
 case 3: printf("初始长度       <   ◆■■         >"); break;
 case 4: printf("初始长度       <   ◆■■■       >"); break;
 case 5: printf("初始长度       <   ◆■■■■     >"); break;
 case 6: printf("初始长度       <   ◆■■■■■   >"); break;
 case 7: printf("初始长度       <   ◆■■■■■■  "); break;
 }
 gotoxy(34, 10);
 switch (speed)//初始速度
 {
 case  50:printf("游戏初速度     <   较快    "); break;
 case 100:printf("游戏初速度     <   中等   >"); break;
 case 150:printf("游戏初速度         较慢   >"); break;
 }
 gotoxy(34, 12);
 switch (changespeed)//是否变速
 {
 case 0:printf("吃到食物加速        否    >"); break;
 case 5:printf("吃到食物加速   <    是     "); break;
 }
 gotoxy(34, 14);
 switch (tail)//尾巴选择
 {
 case 1:printf("当前尾巴痕迹        无    >"); break;
 case 2:printf("当前尾巴痕迹   <    ~     >"); break;
 case 3:printf("当前尾巴痕迹   <   ·      "); break;
 }
 gotoxy(34, 16);
 switch (map)//地图选择
 {
 case -1:printf("当前地图难度      特别版2 >"); break;
 case 0:printf("当前地图难度   <  特别版1 >"); break;
 case 1:printf("当前地图难度   <   普通   >"); break;
 case 2:printf("当前地图难度   <   困难   >"); break;
 case 3:printf("当前地图难度   <   地狱   >"); break;
 case 4:printf("当前地图难度   <   传说    "); break;
 }
    gotoxy(70, 22);
    printf("确定并返回菜单"); 

 for (i = 0; i < 7; i++)
 {
  gotoxy(31, 8 + 2 * i);
  printf("  ");
 }
 gotoxy(67, 22);
 printf("  ");
 switch (set_flag)
 {
 case 1:gotoxy(31,  8); break;
 case 2:gotoxy(31, 10); break;
 case 3:gotoxy(31, 12); break;
 case 4:gotoxy(31, 14); break;
 case 5:gotoxy(31, 16); break;
 case 6:gotoxy(67, 22); break;
 }
 printf("★");
 return;
}
void setup()//设置操作(改变全局变量)
{
 frame(2);
 set_flag=1;
 gotoxy(30, 3);
 printf("      ■■◆    游戏设置    ◆■■");
 gotoxy(26, 4);
 printf("■■■■■■                        ■■■■■■");
 setup2();
 fflush(stdin);
 while (1)
 {
  if (GetAsyncKeyState(VK_DOWN))//下
  {
   if (set_flag == 6)
    set_flag = 1;
   else set_flag++;
  }
  if (GetAsyncKeyState(VK_UP))//上
  {
   if (set_flag == 1)
    set_flag = 6;
   else set_flag--;
  }
  if (GetAsyncKeyState(VK_LEFT))//左
  {
   switch (set_flag)
   {
   case 1: if (org_len > 2)
    org_len--; break;
   case 2: if (speed < 150)
    speed += 50; break;
   case 3: if (changespeed == 5)
    changespeed = 0;break;
   case 4: if (tail > 1)
    tail--;break;
   case 5: if (map > -1)
    map--;break;
   case 6: break;
   }
  }
  if (GetAsyncKeyState(VK_RIGHT))//右
  {
   switch (set_flag)
   {
   case 1: if (org_len < 7)
    org_len++;break;
   case 2: if (speed > 50)
    speed -= 50;break;
   case 3: if (changespeed == 0)
    changespeed = 5;break;
   case 4: if (tail < 3)
    tail++;break;
   case 5: if (map < 4)
    map++;break;
   case 6:break;
   }
  }
  setup2();
  if ((GetAsyncKeyState(VK_RETURN)&0x0D)&&set_flag==6)
  {
   ii = 5;
   return;
  }
  Sleep(175);
 }
 return;
}
void instructions()//游戏说明
{
 system("cls");
 frame(2);
 gotoxy(10, 3);
 printf("游戏说明:");
 gotoxy(18, 5);
 printf("一条蛇在封闭空间里,空间内随机出现一个食物,通过按键盘四个光标");
 gotoxy(18, 7);
 printf("键↑←↓→控制蛇向上下左右四个方向移动来获取食物食物,当食物被");
 gotoxy(18, 9);
 printf("吃掉,蛇身体长一节,同时记10分,接着又出现新的食物,如果蛇撞到");
 gotoxy(18, 11);
 printf("墙或蛇头撞到自己身体或撞到障碍物,游戏结束。");
 gotoxy(18, 15);
 printf("温馨提示:游戏过程中,可按Shift键加速,但不能同时按方向键,也");
 gotoxy(18, 17);
 printf("          可以按空格键来暂停游戏。                          ");
 gotoxy(60, 20);
 printf("按确认键返回主菜单");
 gotoxy(3, 23);
 printf("当前游戏版本 V1.0");
 while (1)//按确认键返回主菜单
 {
  Sleep(100);
  (void)_getch();
  if (GetAsyncKeyState(VK_RETURN))//确认
  {
   ii = 5;
   break;
  }
 }
}
void end()//游戏退出
{
 frame(2);
 gotoxy(44, 12);
 printf("游戏已退出");
 gotoxy(0, 26);
}
main()//游戏框架
{
 frame(2);
 loading();
 while (ii == 1 || ii == 2 || ii == 3||ii==5)
 {
  system("cls");
  Sleep(200);
  menu(ii);
  chose();
  switch (ii)
  {
  case 1:game(); break;
  case 2:setup(); break;
  case 3:instructions(); break;
  case 4:break;
  case 5:ii = 1; continue;
  }
 }
 end();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现贪吃蛇超详细教程

    目录 一.游戏说明 1.1游戏按键说明 1.2计分系统 二.游戏运行 2.1游戏效果展示 2.2一个报错的纠正 2.3 游戏代码 三.游戏框架构建 3.1游戏界面的大小 3.2蛇头和蛇身 3.2.1蛇头 3.2.2蛇身 3.3标记游戏区 3.3.1存储游戏区的各个位置是什么 3.3.2 用宏来使某些数字具有特殊意义 3.4菜单栏的设置  四.隐藏光标的设置 4.1 光标信息的结构体成员 4.2隐藏光标的实现 4.3GetStdHandle函数 4.4 SetConsoleCursorInfo函数

  • C语言实现贪吃蛇代码

    本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下 #include"stdafx.h" #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h> #include<conio.h> #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态 U:上 D:下 L:

  • C语言实现贪吃蛇游戏代码

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 //------------------------------------------problm区------------------------------ //①思考typedef 定义的变量如何利用fwrite进行存储 //②典型可利用sleep()语句类实现控制移动速度 //③BOOL PlaySoundW(LPCWSTR, HMODULE, DWORD)": 无法将参数 1 从"const ch

  • 用纯C语言实现贪吃蛇游戏

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 在读大学生一枚,五一期间用四天时间写一个小游戏. 本贪吃蛇游戏代码共计531行,开发环境是VS,游戏分为两种模式,标准模式和超大地图模式,详细看以下源代码,并进入游戏体验具体内容. //贪吃蛇 #include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> //游戏窗口 #define FrameX

  • C语言实现简单的贪吃蛇小游戏

    本文实例为大家分享了C语言实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 #温馨提示:以下设计在VS2019下完美运行,完整代码附在末尾,供大家学习参考 (1)游戏进入界面(动态读取以及温馨提示) void loading()//动态加载图 { int j; gotoxy(43, 11); printf("Loading..."); gotoxy(39, 13); printf("□□□□□□□□"); gotoxy(39, 13); for (j = 8

  • Java实现简单的贪吃蛇小游戏

    本文实例为大家分享了Java实现简单的贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1. 程序结构 程序结构图如图: 2. 程序设计思路 2.1 Data类 作用:连接statics文件夹,将静态资源包中的图片转化为图标 方便在面板上绘制. 实现:使用class.getResource(String path)方法. 代码如下: package com.snake; import javax.swing.*; import java.net.URL; public class Data {

  • 用js编写简单的贪吃蛇小游戏

    本文实例为大家分享了js编写简单的贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 代码如下: HTML 5 部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta n

  • C语言结构数组实现贪吃蛇小游戏

    一.设计思路 蛇身本质上就是个结构数组,数组里存储了坐标x.y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印.所以撞墙.咬到自己只是数组x.y值的简单比较. 二.用上的知识点 结构数组Windows API函数 三.具体实现 先来实现静态页面,把地图.初始蛇身.食物搞定. 这里需要用到Windows API的知识,也就是对控制台上坐标的修改 //这段代码来自参考1 void Pos(int x, int y) { COORD pos; HANDLE hOutput; pos.X

  • C语言实现简单贪吃蛇小游戏

    本文实例为大家分享了C语言实现简单贪吃蛇的具体代码,供大家参考,具体内容如下 依然是非常传统的贪吃蛇小游戏,网上很多教程,配置好ege图形库就好,不然没有grapics.h另外,还需要添加snakes.h,直接上代码吧,注释很详细了.觉得难度有一部分来源于配置图形库. snakes.h void welcome(); void initSnake(); void createPoint(); void drawSnake(); void drawRandomPoint(); void view(

  • 使用C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 前言 控制台的欢乐就是这么简单: 提示:以下是本篇文章正文内容,下面案例可供参考 一.贪吃蛇实现的结构和方式 1.用枚举定义蛇的移动方向 enum Dir {     UP,     DOWN,     LEFT,     RIGHT,//枚举不能用分号; }; //创建结构体,对蛇的参数进行设置: struct Snake {     int size;//蛇的节数;     int dir;//蛇的方向;   

  • C语言单链表贪吃蛇小游戏

    C语言实现单链表控制台贪吃蛇小游戏 编译环境:vs2019 需求: 统计游戏开始后的时间,控制贪吃蛇:吃到食物蛇身加长,得分加一:碰墙或蛇头碰到身体减一条生命:生命消耗完则结束游戏. 思路: 使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏. 做法: 使用单链表控制贪吃蛇移动的核心思想就是:链表存储贪吃蛇所有坐标,每次循环贪吃蛇不断向一个方向插入一个新的结点作为新的蛇头,按下按键控制新蛇头产生

  • C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为移动数组的操作,将吃食物增加蛇身体长度的操作转换为在数组后面追加元素的操作. 2.移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,然后擦去蛇的最后一节,最后确定蛇头的方向,再绘制一个蛇头.这样就会显示一个移动效果. 3.身体增加效果:每次移动时候,判断蛇头是否碰到了食物,如果碰到了食

  • C语言实现桌面贪吃蛇小游戏

    本篇写的是桌面贪吃蛇小游戏,大家自己看吧,感谢大家的支持,谢谢!O(∩_∩)O~~ #define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <commctrl.h> #include <time.h> #include <stdlib.h> #include "shlobj.h" #include <stdio.h> #include <string.h

  • Linux下C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的 心得: 1.自己对linux中如何使用vi更加熟悉 如::wq yy pp dd u 等等 2.对c语言的指针,结构体,链表等更加的牢固 3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础 代码展示 #include<curses.h> #include<stdlib.h> #define UP 1 //1与-1的目的

随机推荐