C语言贪吃蛇小游戏来啦!

简介: C语言贪吃蛇小游戏来啦!

  各位,今天给大家带来的是很多人期待已久的小游戏——贪吃蛇,游戏虽小,五脏俱全,这里面涉及到了很多东西和思维,自己试着一步一步实现一个贪吃蛇或俄罗斯方块式的小游戏,对自己编程能力的提升还是显而易见的,值得每个C语言学习者去练习和尝试。

   为了让大家尽可能都明白,这次选取了一个比较简单的贪吃蛇版本,代码只有不到200行,但已经把这个游戏的核心部分都表现了出来,只是省略了一些界面美化和实现细节优化的部分,而且里面加了大量的文字注释,方便大家阅读理解。老规矩,运行图和代码就直接放下边了,需要的复制即可。有兴趣的还可以尝试对这个游戏进行优化一下。

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//方向键的ASCLL值:上72,左75,右77,下80
//背景颜色的代码:0=黑色  1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色 
//**改变当前光标方块的背景颜色和字体颜色**//
void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台的句柄
  SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色
}
 
//**改变光标的位置**//
void gotoxy(int x, int y) {
  HANDLE handle;
  COORD coord;   //获取坐标轴结构体
  coord.X = x;
  coord.Y = y;
  handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台句柄,值为-11
  SetConsoleCursorPosition(handle, coord);   //移动光标到x,y处
}
 
//**初始化地图数据**//
void restart(int bk[20][20], int look[4], int move[20][20]) {
  //bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇
  //look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数
  //move记录蛇走过的路程,用来打印蛇时判断用
  int pp, qq;  //用来记录获取的随机坐标
  //接下来要初始化整个地图//
  for(int i=0;i<=16;i++)
    for (int j = 0; j <= 16; j++) {
      if (i == 0 || i == 16 || j == 0 || j == 16)  bk[i][j] = 1;//1表示墙体
      else bk[i][j] = 0; //0表示什么都没有
      move[i][j] = 0;    //该数组用来记录蛇移动的轨迹
    }
  //将蛇初始化在8,8坐标上
  bk[8][8] = 3;
  move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1
  move[0][0] = 1;//用此来记录步数
  pp = rand() % 15 + 1;//范围是1-15
  qq = rand() % 15 + 1;
  bk[pp][qq] = 2;//表示这个位置有果实了
  look[0] = 1;//表示朝向,向上
  look[1] = 1;//表示长度
  look[2] = 0;//当为1是表示失败
  look[3] = 0;//记录得分
  //接下来要绘制地图//
  for(int i=0;i<=16;i++)
    for (int j = 0; j <= 16; j++) {
      gotoxy(i * 2, j);//光标移动,每个光标都是矩形
      switch (bk[i][j]) {
      case 0:
        BackGround(0, 0);
        break;//如果没有东西打印黑色
      case 1:
        BackGround(0, 1);
        break;//墙打印蓝色
      case 2:
        BackGround(0, 2);
        break;//果实打印绿色
      case 3:
        BackGround(0, 3);
        break;//蛇打印湖蓝色
      default:
        break;
      }
      printf("  ");//地图中直接就是涂空格符
    }
  //接下来要显示积分//
  gotoxy(35, 0);
  BackGround(7, 0);//用白字黑底打印
  printf("现在得分是:%d,请再接再厉!^_^", look[2]);
}
 
 
//**运动主体**//
void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {
  //bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹
  int b[10], qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标
  if (kbhit()) {//记录按下的是哪个方向键
    b[0] = getch();//用b来记录
    if (b[0] == 224)  b[0] = getch();//如果为224表示为方向键,但是要再一次获取才行
    if (b[0] == 72 && look[0] != 2)
      //如果输入的为上并且朝向不为下
      look[0] = 1;
    if (b[0] == 80 && look[0] != 1)
      look[0] = 2;
    if (b[0] == 75 && look[0] != 4)
      look[0] = 3;
    if (b[0] == 77 && look[0] != 3)
      look[0] = 4;
  }
  switch (look[0]) {
  case 1:
    //往上走
    xy[1]--;
    break;
  case 2:
    //往下走
    xy[1]++;
    break;
  case 3:
    //往左走
    xy[0]--;
    break;
  case 4:
    //往右走
    xy[0]++;
    break;
  }
  //接下来蛇就开始走动了//
  move[0][0]++;//蛇的步数加一
  move[xy[0]][xy[1]] = move[0][0];//记录当前格子中蛇的轨迹
  gotoxy(35, 2);
  BackGround(7, 0);
  printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);
  gotoxy(xy[0] * 2, xy[1]);//这里蛇头就往前移动了
  BackGround(0, 3);//与蛇体一个颜色
  printf("  ");
 
  //如果吃了果实//
  if (bk[xy[0]][xy[1]] == 2) {
    look[2]++;//分数加一
    look[1]++;//长度加一
    //更新分数
    gotoxy(35, 0);
    BackGround(7, 0);
    printf("现在得分是:%d,请再接再厉!^_^", look[2]);
    while (bk[pp][qq] != 0) {
      pp = rand() % 15 + 1;
      qq = rand() % 15 + 1;
    }
    bk[pp][qq] = 2;//将这个地方变为果实
    gotoxy(pp * 2, qq);
    BackGround(0, 2);
    printf("  ");
  }
 
  //如果撞了墙或者自己//
  if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {
    look[3] = 1;//表示已经输了
    gotoxy(6, 6);
    BackGround(7, 0);
    printf("你输了,最后得分:%d", look[2]);
  }
 
  bk[xy[0]][xy[1]] = 3;//使这个位置变成蛇
  //接下来要检测蛇然后刷新蛇的位置//
  for(int i=0;i<=16;i++)
    for (int j = 0; j <= 16; j++) {
      if (move[i][j] == move[xy[0]][xy[1]] - look[1]){
        //如果符合这个条件,则表示蛇已经移动出这个位置了
        //要删除这个位置的蛇尾巴
        //一次只有一个方块会符合要求吧?
        bk[i][j] = 0;
        gotoxy(i * 2, j);
        BackGround(0, 0);
        printf("  ");
        break;//一次只找一个
      }
    }
  end:;
}
int main() {
  int bk[20][20], xy[2], move[20][20], look[4];
  xy[1] = xy[0] = 8;
  srand((unsigned) time(NULL));//初始化随机种子
  system("pause");
  restart(bk, look, move);
  while (look[3] == 0) {
    Sleep(200);//休眠400ms一次
    map(bk, look, xy, move);
  }
  system("pause");
  printf("游戏结束,谢谢游玩!^_^");
  return 0;
}

执行结果:


目录
相关文章
|
19天前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
33 1
C语言——实现贪吃蛇小游戏
|
19天前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
38 1
C 语言——实现扫雷小游戏
|
1天前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
3月前
|
存储 编译器 C语言
|
3月前
|
存储 C语言
【C语言】猜数字小游戏
C语言实现猜数字小游戏
35 2
【C语言】猜数字小游戏
|
3月前
|
存储 编译器 C语言
C语言实战 | “贪吃蛇”游戏
【7月更文挑战第5天】在C语言实战中,本文档介绍了如何构建一个简单的“贪吃蛇”游戏。游戏的核心是控制蛇移动并增长,当吃掉食物时,蛇的身体变长。数据结构使用固定大小的数组表示蛇的位置,变量存储食物位置和蛇的长度。初始化后,利用非阻塞式`getKey()`函数实现WASD键盘控制蛇的运动方向。虽然蛇的边界检测和吃食物后的增长尚未详细说明,但提到了这些问题作为练习留给读者解决,并预告将在后续章节讨论模块化编程以简化复杂代码。
82 0
C语言实战 | “贪吃蛇”游戏
|
3月前
|
存储 数据管理 C语言
C语言实战 | 使用链表完成“贪吃蛇”游戏
【7月更文挑战第1天】整体思维,即系统思维,强调以整体视角理解事物。在编程中,结构体体现这种思想,将相关变量打包处理。示例展示了如何用链表而非数组实现“贪吃蛇”游戏,链表提供了更灵活的动态数据管理。一系列代码图片详细描绘了链表结构体在游戏中的应用,包括节点定义、移动、碰撞检测等,凸显了使用链表的优势和代码的清晰组织。
37 0
C语言实战 | 使用链表完成“贪吃蛇”游戏
|
4月前
|
程序员 C语言
C语言小游戏之猜数字
C语言小游戏之猜数字
32 5
|
4月前
|
存储 C语言
C语言实战 | “贪吃蛇”游戏重构
在程序设计中,模块化思维至关重要,尤其对于复杂项目,它帮助分解任务,便于团队协作。以“贪吃蛇”游戏为例,游戏涉及两个角色:蛇和食物。使用数组存储蛇的位置,变量存储食物位置。游戏流程分为初始化、显示和更新数据。初始化时,食物位置随机,蛇的位置根据数组设定。显示数据则根据这些信息在屏幕上呈现角色。更新数据时,处理蛇的移动和增长以及食物的生成和消失。类似地,通过模块化方法可开发“打砖块”游戏,涉及球、球拍和砖墙,每个角色都有相应数据结构和更新逻辑。通过这种方式,游戏开发就像搭建积木,遵循框架逐步实现。
64 0
C语言实战 | “贪吃蛇”游戏重构
|
4月前
|
存储 定位技术 API
C语言实战 -- 经典贪吃蛇游戏(含完整源码)
C语言实战 -- 经典贪吃蛇游戏(含完整源码)
88 1